Log4j之高级配置

来源:互联网 发布:网络语灌水是什么意思 编辑:程序博客网 时间:2024/05/22 00:52

      绝大多数的Java项目记录日志都是使用Log4j,简单的配置网上有很详细的教程。当项目变得复杂,比如分很多模块,很多层次,很多通信方式时,需要把不同模块或者不同层次或者不同通信方式的日志记录到不同的文件输出。本文就介绍如何配置Log4j以满足以上需求。

      Log4j日记记录过程可以拆解为日志来源以及日志的输出地之间的关系。日志的来源与日志输出完全独立,可以是多对多的关系。说得简单一点就是,代码里面的一条日志可以输出到多个输出目的地(控制台,all.log文件, A1.log文件等),反过来一个输出目的地可以接纳来源于多个地方的日志。Java里面代码都在package和class下面,所以来源可以通过package或者class进行定位,确定来源于什么地方。然后将该日志来源记录到希望记录的输出地即可。举个例子吧,加入项目中持久化层用到了iBatis开源项目,iBatis也会通过Log4j来记录它的操作日志,现在想把iBatis输出的日志都记录到一个iBatis.log文件中,不要跟项目的代码混到一起。 还有,现在希望有一个error.log文件来记录所有的出错信息,不是出错的不记录。 观察以上两个例子,强调的都是日志来源和输出的个性化,只是后者的来源是全部。下面先上Log4j配置文件:


### set root log ###log4j.rootLogger = INFO , CONSOLE, ALL, ERROR### console log ###log4j.appender.CONSOLE = org.apache.log4j.ConsoleAppenderlog4j.appender.CONSOLE.Target = System.outlog4j.appender.CONSOLE.Threshold = INFOlog4j.appender.CONSOLE.layout = org.apache.log4j.PatternLayoutlog4j.appender.CONSOLE.layout.ConversionPattern = %t  %d{yyyy-MM-dd HH:mm:ss,SSS}  %l  %M  %5p  %m%n### all information log ###log4j.appender.ALL = org.apache.log4j.DailyRollingFileAppenderlog4j.appender.ALL.File = logs/all.loglog4j.appender.ALL.DatePattern = '.'yyyy-MM-dd'.log'log4j.appender.ALL.Threshold = INFOlog4j.appender.ALL.layout = org.apache.log4j.PatternLayoutlog4j.appender.ALL.layout.ConversionPattern = %t  %d{yyyy-MM-dd HH:mm:ss,SSS}  %l  %M  %5p  %m%n### error log ###log4j.appender.ERROR = org.apache.log4j.DailyRollingFileAppenderlog4j.appender.ERROR.File = logs/error.loglog4j.appender.ERROR.DatePattern = '.'yyyy-MM-dd'.log'log4j.appender.ERROR.Threshold = ERRORlog4j.appender.ERROR.layout = org.apache.log4j.PatternLayoutlog4j.appender.ERROR.layout.ConversionPattern = %t  %d{yyyy-MM-dd HH:mm:ss,SSS}  %l  %M  %5p  %m%n### iBatis log ###log4j.appender.IBATIS = org.apache.log4j.DailyRollingFileAppenderlog4j.appender.IBATIS.File = logs/ibatis.loglog4j.appender.IBATIS.DatePattern = '.'yyyy-MM-dd'.log'log4j.appender.IBATIS.Threshold = DEBUGlog4j.appender.IBATIS.layout = org.apache.log4j.PatternLayoutlog4j.appender.IBATIS.layout.ConversionPattern = %t  %d{yyyy-MM-dd HH:mm:ss,SSS} %5p  %m%nlog4j.logger.com.ibatis = DEBUG , CONSOLE , ALL, ERROR, IBATISlog4j.logger.com.ibatis.common.jdbc.SimpleDataSource = DEBUGlog4j.logger.com.ibatis.common.jdbc.ScriptRunner = DEBUGlog4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate = DEBUGlog4j.logger.java.sql.Connection = DEBUGlog4j.logger.java.sql.Statement = DEBUGlog4j.logger.java.sql.PreparedStatement = DEBUG, CONSOLE , ALL, IBATIS

    日志的来源和输出都可以设定日志级别。以iBatis为例,  log4j.logger.com.ibatis = DEBUG指定 ibatis包级别一下的日志来源日志级别为DUBUG,这样就能够看到SQL信息。再看error日志的配置,log4j.appender.ERROR.Threshold = ERROR指定输出的日志级别是ERROR,该输出目的地只记录出错信息。 像一根水管上的两个水龙头,出水的多少决定于流量小的那个水龙头。Log4j里面日志的记录是决定于级别高的那一个。上面还配有all.log输出,可以完整的在一个地方找到所有的日志。

   

    通过以上方式可以灵活定制日志策略,项目的日志参照iBatis的配置方法配置即可。对后需要提醒的是最好为开发环境可生成环境配置不同的日志策略。输出级别和输出地都可能不同! 应该有两个Log4j文件, log4j-pro.properties和log4j-dev.properties,分别对应于生产环境和开发环境。

原创粉丝点击