首页 > 代码库 > log4j日志记录简析

log4j日志记录简析

log4j的日志系统包含两个主要概念:Logger与Appender,前者负责触发日志记录动作,后者决定日志输出至何处。
各个Logger实例之间可能存在父子关系,所有实例都有一个共同的root Logger实例,如下文的第一行的rootCategory就是root Logger实例。

log4j示例文件如下:

log4j.rootCategory=info,stdout


# CONSOLE appender not used by default
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d [%t] %-5p %c{1} %M %L - %m%n


# File appender
log4j.appender.perf=org.apache.log4j.RollingFileAppender
log4j.appender.perf.layout=org.apache.log4j.PatternLayout
log4j.appender.perf.layout.ConversionPattern=%d [%-15.15t] %-5p %-30.30c{1} - %m%n
log4j.appender.perf.file=Z:/logs/snc-perf-test.log
log4j.appender.perf.MaxFileSize=40MB
log4j.appender.perf.MaxBackupIndex=40
log4j.appender.perf.append=true
log4j.appender.perf.ImmediateFlush=true


log4j.appender.druid=org.apache.log4j.RollingFileAppender
log4j.appender.druid.layout=org.apache.log4j.PatternLayout
log4j.appender.druid.layout.ConversionPattern=%d [%-15.15t] %-5p %-30.30c{1} - %m%n
log4j.appender.druid.file=Z:/logs/snc-perf-druid-test.log
log4j.appender.druid.MaxFileSize=40MB
log4j.appender.druid.MaxBackupIndex=40
log4j.appender.druid.append=true
log4j.appender.druid.ImmediateFlush=true


log4j.logger.com.simiam.snc.perf=debug,perf
log4j.logger.org.springframework=INFO,perf


log4j.logger.druid.sql=info,druid
log4j.logger.druid.sql.DataSource=info,druid
log4j.logger.druid.sql.Connection=info,druid
log4j.logger.druid.sql.Statement=debug,druid
log4j.logger.druid.sql.ResultSet=info,druid

上面的配置文件提供了3个appender(什么是appender请google),一个将日志打印至stdout,两个保存文件。

文件中的第一行定义的日志root Logger实例:log4j.rootCategory=info,stdout ,该实例关联了stdout appender,如果没有为特定的Logger实例指定相应的appender,所有Logger实例将会使用rootCategory实例来输出日志信息(这里则只输出至console)。

最下面几行以log4j.logger开头的行指定了多个Logger实例,每个实例指定了日志级别,以及与该Logger实例相关的日志最终将使用哪个appender输出。


应用中的具体logger实例在执行相应的日志方法时【如logger.info("log some message")】则会找出该实例关联的appender并输出日志(如果logger未关联appender则不会输出),然后向上获取logger.parent再调用parent的appender输出日志,如此循环直至搜索至root。

比如如下Logger实例:

log4j.logger.druid.sql.DataSource=info,druid

会将相关日志输出至druid appender所关联的文件snc-perf-druid-test.log中,同时也会在console中打印日志信息(向上搜索至root,root关联stdout appender)。