Configuration of Log4j

Log4j输出格式定义
Log4j的格式定义是通过一个“.properties”文件定义的,该文件里面定义了很多关于数定格式和输出位置的元素,看看下面例子的.properties文件(例子中以Log4j.properties为名称)。切换log4j.rootLogger=debug, B1的B1或是A1,以及注释不同位置,实现日志输出到文件还是控制台。把这个Log4j.properties文件放置工程的最上层目录(与.jpx文件在同一目录)。

Log4j.properties的内容:

log4j.rootLogger=debug, B1

#打印到文件

#log4j.appender.A1=org.apache.log4j.RollingFileAppender

#log4j.appender.A1.File=example.log

#log4j.appender.A1.MaxFileSize=100KB

#log4j.appender.A1.MaxBackupIndex=1

#log4j.appender.A1.layout=org.apache.log4j.PatternLayout

#log4j.appender.A1.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n


#打印到控制台

log4j.appender.B1=org.apache.log4j.ConsoleAppender

log4j.appender.B1.layout=org.apache.log4j.PatternLayout

log4j.appender.B1.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n

log4j.appender.B1.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n


6、在Java类文件里使用Log4j
6.1、Import需要的包文件
import org.apache.log4j.*;把这个语句放置在文件的Import位置。

6.2、定义Logger对象
static Logger logger = Logger.getLogger(Frame1.class.getName());在程序申明变量的地方定义这个对象,并且是静态对象。其中的Frame1是你当前类的名称。

6.3、装载属性文件
PropertyConfigurator.configure("Log4j.properties");在jbInit()方法的开始填写这个语句,把属性文件装载过来。

6.4、任何地方可以使用
在需要日志记录的地方输入类似以下的语句:

logger.info("日志信息");

logger.warn("日志信息");

logger.debug("日志信息");

logger.fatal("日志信息");

logger.error("日志信息");


比如:

private void jbInit() throws Exception {

PropertyConfigurator.configure("Log4j.properties");


// logonuser是登陆系统的用户名称
logger.info(logonuser + " 初始化开始");

……………….
logger.info(logonuser + " 初始化结束");

}


输出结果是:

INFO [AWT-EventQueue-0] (mainFrame.java:503) - Admin 初始化开始
INFO [AWT-EventQueue-0] (mainFrame.java:1013) - Admin 初始化结束


到这里我们就完成了Log4j在JBuilder的应用过程,输出日志的格式是不是很整齐,输出到文件的测试一样的过程,只是在Log4j.properties改成:

Log4j.properties的内容:

log4j.rootLogger=debug, A1

#打印到文件

log4j.appender.A1=org.apache.log4j.RollingFileAppender

log4j.appender.A1.File=example.log

log4j.appender.A1.MaxFileSize=100KB

log4j.appender.A1.MaxBackupIndex=1

log4j.appender.A1.layout=org.apache.log4j.PatternLayout

log4j.appender.A1.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n


#打印到控制台

#log4j.appender.B1=org.apache.log4j.ConsoleAppender

#log4j.appender.B1.layout=org.apache.log4j.PatternLayout

#log4j.appender.B1.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n

#log4j.appender.B1.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n


Log4j会在与Log4j.properties同目录的地方创建example.log文件,并记录日志信息,当文件的尺寸大于100KB时,log4J会创建一个新的example.log文件,同时备份example.log文件。备份的文件个数取决于MaxBackupIndex属性。
接下来的篇节我们介绍Log4j在Eclipse上的应用过程

7、向Eclipse添加log4j-1.2.8.jar
7.1、新建Java项目时引入
第一种情况是在新建java项目时第二步骤选择【库L】-【添加外部JAR(X)】-选择log4j-1.2.8.jar,点击【打开】回到新建工程第二步骤的界面,点击完成。这样就引入了需要的库文件了。

7.2、向已经存在工程添加log4j-1.2.8.jar
如果工程已经存在,通过右击工程名称-【属性】-【java构建路径】-【添加外部JAR(X)】-选择log4j-1.2.8.jar,点击【打开】回到新建工程属性的界面-【确定】会到工程的界面。

7.3、导入Log4j.properties文件
通过工程的导入功能,直接把Log4j.properties文件导入到与工程最高层的目录。其他步骤同6.1-6.4

7.4、一个普通的应用结构如下的内容:
/*

* Created on 2004-10-10

*/

package com.log4j;

import org.apache.log4j.*;


/**

* @author Jem.lee

*/

public class MyLogTest {



static Logger logger = Logger.getLogger(MyLogTest.class.getName());


public static void main(String[] args) {

PropertyConfigurator.configure("Log4j.properties");

MyLogTest.logger.info("测试信息开始");

MyLogTest.logger.info("测试信息结束");

}

}


输出结果:

INFO [main] (MyLogTest.java:16) - 测试信息开始

INFO [main] (MyLogTest.java:17) - 测试信息结束
<think> 我们正在讨论log4j打印二进制数据的方法。首先,用户之前的问题是关于Java打印二进制数据,现在转向log4j如何打印二进制数据。 在log4j中,通常我们打印的是字符串消息。但是如果要打印二进制数据(比如字节数组),我们需要将其转换为可打印的形式,例如十六进制字符串或Base64编码。 根据引用[1]中提到的二进制与十六进制的转换关系(一个十六进制位可以用4个二进制位表示),我们可以将二进制数据转换为十六进制字符串来打印。 另外,引用[4]中提到了将请求的header、message等内容以二进制输出到文件中,但它是直接输出二进制,这通常不可读。而log4j作为日志框架,我们期望输出可读的日志。 因此,我们可以考虑以下步骤: 1. 将二进制数据(byte数组)转换为十六进制字符串或Base64字符串。 2. 使用log4j的日志方法(如logger.info)打印该字符串。 但是,log4j本身并没有直接提供打印二进制数据的方法,所以我们需要自己转换。 方法一:转换为十六进制字符串 每个字节转换为两个十六进制字符。 方法二:使用Base64编码 使用Java 8及以上的java.util.Base64类,或者Apache Commons Codec库的Base64类。 我们也可以自定义一个Layout或Converter,但这里我们先给出简单的转换后打印的方法。 示例代码: 假设我们有一个byte数组,我们想用log4j打印它。 十六进制转换示例方法: ``` public static String bytesToHex(byte[] bytes) { StringBuilder sb = new StringBuilder(); for (byte b : bytes) { sb.append(String.format("%02X ", b)); } return sb.toString(); } ``` 或者使用Base64: ``` import java.util.Base64; String base64String = Base64.getEncoder().encodeToString(bytes); ``` 然后在log4j中: ``` logger.info("Binary data (hex): " + bytesToHex(data)); // 或者 logger.info("Binary data (Base64): " + base64String); ``` 但是,如果二进制数据很大,频繁转换和拼接字符串可能会影响性能。在这种情况下,我们可以考虑使用log4j的参数化日志,避免不必要的字符串拼接。 例如: ``` logger.info("Binary data (hex): {}", bytesToHex(data)); ``` 另外,log4j 2.x提供了Message接口,我们可以自定义二进制消息,然后通过自定义Layout来格式化。但这比较复杂,对于一般需求,转换为字符串即可。 总结: log4j打印二进制数据的常用方法是先将二进制数据转换为可打印的字符串(如十六进制或Base64),然后使用普通的日志方法打印。 注意:引用[2]中提到了读取二进制文件并存入数组,这可以获取到二进制数据,但打印时同样需要转换。 因此,针对用户的问题,我们给出以下步骤: 步骤1:将二进制数据转换为字符串(十六进制或Base64) 步骤2:使用log4j的日志方法打印该字符串 示例代码: ``` import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import java.util.Base64; public class LogBinaryData { private static final Logger logger = LogManager.getLogger(LogBinaryData.class); public static void main(String[] args) { byte[] binaryData = new byte[] {0x12, 0x34, 0x56, 0x78}; // 转换为十六进制字符串 String hexString = bytesToHex(binaryData); logger.info("Binary data in hex: {}", hexString); // 转换为Base64字符串 String base64String = Base64.getEncoder().encodeToString(binaryData); logger.info("Binary data in Base64: {}", base64String); } public static String bytesToHex(byte[] bytes) { StringBuilder sb = new StringBuilder(); for (byte b : bytes) { sb.append(String.format("%02X ", b)); } return sb.toString().trim(); // 去掉最后一个空格 } } ``` 输出示例: ``` Binary data in hex: 12 34 56 78 Binary data in Base64: EjRWeA== ``` 这样,我们就通过log4j打印了二进制数据。 注意事项: 1. 如果数据量很大,注意日志级别和日志输出量,避免日志文件过大。 2. 十六进制字符串会比原始二进制数据长很多(一个字节变成两个字符,再加上空格则更长),Base64编码后长度大约为原来的4/3倍。 如果用户使用log4j 1.x,方法类似,只是获取Logger的方式不同。 根据引用[3]和[4],日志处理中有时需要读取二进制文件或处理二进制数据,但打印到日志时都需要转换。 因此,我们推荐使用十六进制或Base64转换的方法。 </think> ### Log4j打印二进制数据的方法 在Log4j中直接打印二进制数据需要将字节数组转换为可读格式(如十六进制或Base64),因为日志系统通常处理文本数据。以下是实现方法及示例代码: #### 1. **转换为十六进制字符串打印** 最常用方法,利用十六进制与二进制的直接对应关系(每字节对应2个十六进制字符)[^1]: ```java import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import java.util.HexFormat; public class LogBinaryDemo { private static final Logger logger = LogManager.getLogger(); public static void main(String[] args) { byte[] binaryData = {0x48, 0x65, 0x6c, 0x6c, 0x6f}; // "Hello"的二进制 // 转换为十六进制字符串 String hexData = HexFormat.of().formatHex(binaryData); logger.info("二进制数据(HEX): {}", hexData); // 输出: 48656c6c6f } } ``` #### 2. **转换为Base64字符串打印** 适合处理大型二进制数据(长度增加约33%): ```java import org.apache.commons.codec.binary.Base64; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; public class LogBinaryDemo { private static final Logger logger = LogManager.getLogger(); public static void main(String[] args) { byte[] binaryData = getBinaryData(); // 获取二进制数据 // 转换为Base64 String base64Data = Base64.encodeBase64String(binaryData); logger.debug("二进制数据(Base64): {}", base64Data); } } ``` #### 3. **自定义Layout处理二进制** 在Log4j配置中自定义Layout实现自动转换: ```xml <!-- log4j2.xml 配置示例 --> <Configuration> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <HexLayout/> <!-- 自定义Layout --> </Console> </Appenders> <Loggers> <Root level="info"> <AppenderRef ref="Console"/> </Root> </Loggers> </Configuration> ``` 自定义`HexLayout`实现类: ```java public class HexLayout extends AbstractStringLayout { @Override public String toSerializable(LogEvent event) { // 假设日志消息是byte[] byte[] data = (byte[]) event.getMessage().getParameters()[0]; return HexFormat.of().formatHex(data); } } ``` #### 注意事项 1. **性能考虑**:大数据量时优先用Base64(转换效率更高) 2. **数据类型**:确保日志消息是`byte[]`类型 3. **敏感数据**:避免打印未加密的敏感二进制数据 4. **日志级别**:二进制数据通常适合`DEBUG`级别(可能产生大量输出)[^4] > 关键原理:二进制数据本身不可直接打印为文本,必须通过编码转换为可视化字符串格式(HEX或Base64)。这种方式既能保留原始数据完整信息,又兼容日志系统的文本处理流程[^1][^4]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值