log4j 详解
log4j详解
1.Log4j有三个主要的组件:Loggers(记录器),Appenders(输出源)和Layouts(布局)
Loggers(记录器),日志写出器,供程序员输出日志信息,收集日志信息源数据
Appenders(输出源),就是输出到的地方(文件、控制台)
Layouts(布局),日志信息的布局(输出形式),定义输出格式
工作原理:
1.应用程序调用Loggers输入日志源信息。
2.Loggers查看日志源信息等级,过滤不符合等级的。
3.将日志源信息格式化为Layouts(布局)定义的格式的信息
4.按输出目的地进行格式化后信息的输出。
配置根Logger,其语法为:(收集那些级别的信息和定输出的地方有那些)
log4j.rootLogger=[level],appenderName,appenderName,…
1.level是日志记录的优先级,分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定义的级别。Log4j建议只使用四个级别,优先级从高到低分别是ERROR、WARN、INFO、DEBUG。
2.通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关。比如在这里定义了INFO级别,则应用程序中所有DEBUG级别的日志信息将不被打印出来。
3.appenderName就是指日志信息输出到哪个地方。您可以同时指定多个输出目的地。
如:log4j.rootLogger=info, ServerDailyRollingFile, stdout
配置日志信息输出目的地Appender,其语法为:(输出目的地的参数配置)
log4j.appender.appenderName=fully.qualified.name.of.appender.class.其中,Log4j提供的appender有以下几种:
1.org.apache.log4j.ConsoleAppender(控制台),
2.org.apache.log4j.FileAppender(文件),
3.org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),
4.org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
5.org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
6.选择了其中一种后,还要就每一种选项进行相关参数的配置
如:log4j.appender.ServerDailyRollingFile=org.apache.log4j.DailyRollingFileAppender log4j.appender.ServerDailyRollingFile.File=C://logs/notify-subscription.log //就选项file进行相关参数的配置(因为输出目的地为file)
配置日志信息的格式(布局),其语法为:(定义输出源的信息格式化)
log4j.appender.appenderName.layout=fully.qualified.name.of.layout.class
1.org.apache.log4j.HTMLLayout(以HTML表格形式布局),
2.org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
3.org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
4.org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
5.选择了其中一种后,还要就每一种选项进行相关参数的配置
如:log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%p] [%c %M %L %F] %m%n
配置多个Logger
1.除了根Logger,不可以定义多个Logger
如:log4j.logger.test = info, stdout //定义一个test logger
log4j的logger继承性
1.子logger会叠加式地继承父logger的所有appender
比如: log4j.logger.com.test = info, stdout log4j.logger.com.test.a = info, stdout 结果会导致test.a下的所有日志会在stdout输出两次。
例子:
log4j.properties
log4j.rootLogger=info, ServerDailyRollingFile, stdout log4j.appender.ServerDailyRollingFile=org.apache.log4j.DailyRollingFileAppender log4j.appender.ServerDailyRollingFile.DatePattern='.'yyyy-MM-dd log4j.appender.ServerDailyRollingFile.File=C://logs/notify-subscription.log log4j.appender.ServerDailyRollingFile.layout=org.apache.log4j.PatternLayout log4j.appender.ServerDailyRollingFile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%p] [%c %M %L] %m%n log4j.appender.ServerDailyRollingFile.Append=true log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%p] [ %M %L %F] %m%n #定个一个logger log4j.logger.xing=INFO,xing log4j.appender.xing=org.apache.log4j.ConsoleAppender log4j.appender.xing.layout=org.apache.log4j.PatternLayout log4j.appender.xing.layout.ConversionPattern=xing %%d{yyyy-MM-dd HH:mm:ss} %p [%c] %m%n #定个一个xing logger的子logger,以点进行表示继承关系,子logger会叠加式地继承父logger的所有appender log4j.logger.xing.a=INFO,yong log4j.appender.yong=org.apache.log4j.ConsoleAppender log4j.appender.yong.layout=org.apache.log4j.PatternLayout log4j.appender.yong.layout.ConversionPattern=yong %%d{yyyy-MM-dd HH:mm:ss} %p [%c] %m%n
import org.apache.log4j.PropertyConfigurator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class LogTest { public static void main(String[] args) { //PropertyConfigurator.configure("D:\\Test\\log4j.properties"); PropertyConfigurator.configure("log4j.properties"); //读入参数配置文件,没有配置文件时会有一个默认的配置文件 //Logger logger = LoggerFactory.getLogger("xing"); //得到xing这个Logger Logger logger = LoggerFactory.getLogger("xing.a"); //得到xing.a这个Logger //Logger logger = LoggerFactory.getLogger(xing.a.class); logger.info("log message"); //也可以用 //org.apache.log4j.Logger logger = LogManager.getLogger("xing.a"); //得到xing.a这个Logger //logger.info("log message"); } }
参考原文:http://blog.csdn.net/anlina_1984/article/details/5313023
参考原文:http://blog.sina.com.cn/s/blog_5ed94d710101go3u.html
参考原文(配置多个Logger):http://www.cnblogs.com/shenliang123/archive/2012/05/02/2479286.html
参考原文(log4j的logger继承性):http://blog.csdn.net/java_belucky/article/details/22267795