java学习:log4j输出xml格式的日志文件

最近使用log4j库,由于需要输出xml格式的日志文件,有关输出MDC和NDC内容,折腾了整整一天,最后还是切换使用log4j2.x才能够成功。网上搜索了很久都没能找到原因,国内外搜了上百篇,借鉴一些帖子,然后推断出了原因。现整理如下,作为备忘录。

1、下载log4j-1.2.17.jar,可以到网站http://mvnrepository.com/搜索,这个网站的jar包很全。

2、使用eclpise创建一个工程,把log4j-1.2.17.jar加上。

3、编写Log类,代码如下:

 
 
  1. import org.apache.log4j.Logger;
  2. import org.apache.log4j.MDC;
  3. import org.apache.log4j.NDC;
  4. import org.apache.log4j.PropertyConfigurator;
  5. import org.apache.log4j.xml.DOMConfigurator;
  6. public class Log {
  7. public static void main(String[] args) {
  8.      Logger log = Logger.getRootLogger();
  9.              DOMConfigurator.configureAndWatch("log4j.xml");
  10.              log.debug("Sample debug message");
  11.              log.info("Sample info message");
  12.              log.error("Sample error message");
  13.              log.fatal("Sample fatal message");
  14.       }
  15. }

配置文件,输出格式xml文件,因此需要需要使用org.apache.log4j.xml.XMLLayout。如下:

 
 
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
  3. <log4j:configuration debug="false" xmlns:log4j='http://jakarta.apache.org/log4j/'>
  4.    <appender name="FILE" class="org.apache.log4j.RollingFileAppender">
  5.        <param name="threshold" value="debug" />
  6.        <param name="file" value="log4jlog.xml" />
  7.        <param name="maxBackupIndex" value="5" />
  8.        <param name="append" value="true" />
  9.        <layout class="org.apache.log4j.xml.XMLLayout">
  10.        </layout>
  11.    </appender>
  12.    <root>
  13.        <level value="DEBUG" />
  14.        <appender-ref ref="FILE" />
  15.    </root>
  16. </log4j:configuration>


运行输出:

 
 
  1. <log4j:event logger="root" timestamp="1468679895876" level="DEBUG" thread="main">
  2. <log4j:message><![CDATA[Sample debug message]]></log4j:message>
  3. </log4j:event>
  4. <log4j:event logger="root" timestamp="1468679895877" level="INFO" thread="main">
  5. <log4j:message><![CDATA[Sample info message]]></log4j:message>
  6. </log4j:event>
  7. <log4j:event logger="root" timestamp="1468679895878" level="ERROR" thread="main">
  8. <log4j:message><![CDATA[Sample error message]]></log4j:message>
  9. </log4j:event>
  10. <log4j:event logger="root" timestamp="1468679895878" level="FATAL" thread="main">
  11. <log4j:message><![CDATA[Sample fatal message]]></log4j:message>
  12. </log4j:event>

4、在多线程环境中,有需要需要打印线程信息,就需要使用MDC或NDC(网上有概念介绍),网上实例都是PatternLayout介绍的,没有针对XMLLayout。代码如下:

  
  
  1. import org.apache.log4j.Logger;
  2. import org.apache.log4j.MDC;
  3. import org.apache.log4j.NDC;
  4. import org.apache.log4j.PropertyConfigurator;
  5. import org.apache.log4j.xml.DOMConfigurator;
  6. public class Log {
  7. public static void main(String[] args) {
  8. Logger log = Logger.getRootLogger();
  9. MDC.put("key", "value");
  10. MDC.put("key2", "value2");
  11. NDC.push("haha");
  12. DOMConfigurator.configureAndWatch("og4j.xml");
  13. log.debug("Sample debug message");
  14. log.info("Sample info message");
  15. log.error("Sample error message");
  16. log.fatal("Sample fatal message");
  17. NDC.clear();
  18. MDC.clear();
  19. }
  20. }
输出:
  
  
  1. <log4j:event logger="root" timestamp="1468680531531" level="DEBUG" thread="main">
  2. <log4j:message><![CDATA[Sample debug message]]></log4j:message>
  3. <log4j:NDC><![CDATA[haha]]></log4j:NDC>
  4. </log4j:event>
  5. <log4j:event logger="root" timestamp="1468680531532" level="INFO" thread="main">
  6. <log4j:message><![CDATA[Sample info message]]></log4j:message>
  7. <log4j:NDC><![CDATA[haha]]></log4j:NDC>
  8. </log4j:event>
  9. <log4j:event logger="root" timestamp="1468680531532" level="ERROR" thread="main">
  10. <log4j:message><![CDATA[Sample error message]]></log4j:message>
  11. <log4j:NDC><![CDATA[haha]]></log4j:NDC>
  12. </log4j:event>
  13. <log4j:event logger="root" timestamp="1468680531532" level="FATAL" thread="main">
  14. <log4j:message><![CDATA[Sample fatal message]]></log4j:message>
  15. <log4j:NDC><![CDATA[haha]]></log4j:NDC>
  16. </log4j:event>

从输出来看,MDC的内容没有输出,原因是选项开关没打开,这个还是通过看源代码猜到的原因,配置参数为Properties,把这个值设为true(LocationInfo选项是当前函数信息,这个挺有用的)。log4j.jar版本很多,犯了一个基本错误,开始用了老版本jar始终不能解决问题,居然以为log4j-1.2.9比log4j-1.2.17新。等我弄好了log4j2再回头long4j1的时候,才发现版本弄错了,浪费了一整天的时间。

修改的xml配置文件如下:

  
  
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
  3. <log4j:configuration debug="false" xmlns:log4j='http://jakarta.apache.org/log4j/'>
  4. <appender name="FILE" class="org.apache.log4j.RollingFileAppender">
  5. <param name="threshold" value="debug" />
  6. <param name="file" value="log4jlog.xml" />
  7. <param name="maxBackupIndex" value="5" />
  8. <param name="append" value="true" />
  9. <layout class="org.apache.log4j.xml.XMLLayout">
  10. <param name="LocationInfo" value="true" />
  11. <param name="Properties" value="true" />
  12. </layout>
  13. </appender>
  14. <root>
  15. <level value="DEBUG" />
  16. <appender-ref ref="FILE" />
  17. </root>
  18. </log4j:configuration>

重新运行,输出对了,MDC这个关键字并没有输出,使用log4cxx是有的,原因是新版本好像改掉了。但现在还有个问题,如果需要输出MDC,就只有扩展appender了。

  
  
  1. <log4j:event logger="root" timestamp="1468680646638" level="DEBUG" thread="main">
  2. <log4j:message><![CDATA[Sample debug message]]></log4j:message>
  3. <log4j:NDC><![CDATA[haha]]></log4j:NDC>
  4. <log4j:locationInfo class="testlog4j.Log" method="main" file="Log.java" line="22"/>
  5. <log4j:properties>
  6. <log4j:data name="key" value="value"/>
  7. <log4j:data name="key2" value="value2"/>
  8. </log4j:properties>
  9. </log4j:event>
  10. <log4j:event logger="root" timestamp="1468680646641" level="INFO" thread="main">
  11. <log4j:message><![CDATA[Sample info message]]></log4j:message>
  12. <log4j:NDC><![CDATA[haha]]></log4j:NDC>
  13. <log4j:locationInfo class="testlog4j.Log" method="main" file="Log.java" line="23"/>
  14. <log4j:properties>
  15. <log4j:data name="key" value="value"/>
  16. <log4j:data name="key2" value="value2"/>
  17. </log4j:properties>
  18. </log4j:event>
  19. <log4j:event logger="root" timestamp="1468680646641" level="ERROR" thread="main">
  20. <log4j:message><![CDATA[Sample error message]]></log4j:message>
  21. <log4j:NDC><![CDATA[haha]]></log4j:NDC>
  22. <log4j:locationInfo class="testlog4j.Log" method="main" file="Log.java" line="24"/>
  23. <log4j:properties>
  24. <log4j:data name="key" value="value"/>
  25. <log4j:data name="key2" value="value2"/>
  26. </log4j:properties>
  27. </log4j:event>
  28. <log4j:event logger="root" timestamp="1468680646641" level="FATAL" thread="main">
  29. <log4j:message><![CDATA[Sample fatal message]]></log4j:message>
  30. <log4j:NDC><![CDATA[haha]]></log4j:NDC>
  31. <log4j:locationInfo class="testlog4j.Log" method="main" file="Log.java" line="25"/>
  32. <log4j:properties>
  33. <log4j:data name="key" value="value"/>
  34. <log4j:data name="key2" value="value2"/>
  35. </log4j:properties>
  36. </log4j:event>

结论:java不熟悉,麻烦的不是java,而是第三方库的使用,总感觉通过xml配置麻烦,不如直接用api来得直观。可能是用c++用惯了,总是想从基本原理看起,快速搭建环境。log4j的配置,也可以通过properties文件实现。上述的配置文件也可以写成:

  
  
  1. # Define the root logger with file appender
  2. log4j.rootLogger = DEBUG, XML
  3. # Define the file appender
  4. log4j.appender.XML=org.apache.log4j.FileAppender
  5. log4j.appender.XML.File=log4jlog.xml
  6. # Define the xml layout for file appender
  7. log4j.appender.XML.layout=org.apache.log4j.xml.XMLLayout
  8. log4j.appender.XML.layout.LocationInfo=true
  9. log4j.appender.XML.layout.Properties=true
  10. log4j.appender.XML.Threshold=DEBUG

使用下面的代码进行读取配置文件,配置文件的路径可以依据你的工程指定,可以使用绝对路径:

  
  
  1. PropertyConfigurator.configure("log4j.properties");
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Log4j是一个Java日志管理工具,它提供了一种灵活的配置方式,可以方便地生成和管理应用程序日志。 要使用Log4j配置格式解析日志文件,需要完成以下步骤: 1. 配置Log4j:在Java应用程序中添加Log4j库并配置它。可以通过在项目中添加log4j.propertieslog4j.xml文件来配置Log4j。这些文件包含Log4j的配置信息,例如输出日志到控制台还是文件日志级别,日志格式等。 2. 添加日志语句:在Java代码中添加日志语句。可以使用Log4j的API来记录日志。例如: ``` import org.apache.log4j.Logger; public class MyClass { private static final Logger logger = Logger.getLogger(MyClass.class); public void myMethod() { logger.info("This is an info message"); logger.debug("This is a debug message"); } } ``` 在这个例子中,我们使用Log4j的Logger类来创建一个日志对象,然后使用它的info()和debug()方法记录日志。 3. 运行应用程序:运行Java应用程序并让它记录日志。当程序运行时,它会按照Log4j的配置记录日志。 4. 解析日志文件:通过读取Log4j生成的日志文件来解析日志Log4j可以将日志输出到控制台或文件中,根据配置文件的设置,我们可以选择使用工具或手动方式解析生成的日志文件。可以使用Log4j提供的工具或第三方工具来解析日志文件。 5. 格式日志:在解析日志文件时,可以根据需要对日志进行格式化。使用Java提供的字符串处理和正则表达式等工具,可以方便地解析和格式日志。 总之,使用Log4j可以方便地生成和管理应用程序日志,并通过解析和格式日志文件来提取有用的信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值