在程序中,可以以以下方式来使用Log log = mons.logging.LogFactory.LogFactory.getLog(yourClassName.class);log.debug("debug message -------------------");("inf o message ******************");log.warn("w arn message +++++++++++++++");log.error("error msg=================");本文主要讲的是如何配置log4j,先让我们先看看一个典型的log4j配置:==========log4j.properties==================log4j.appender.stdout=org.apache.log4j.ConsoleAppenderyout=org.apache.log4j.PatternLayoutyout.ConversionPattern=%d{MM-dd HH\:mm\:ss.SSS} %-5p [%F\:%L]%x %m%nlog4j.appender.f ileout=org.apache.log4j.RollingFileAppenderlog4j.appender.f ileout.File=D:/w orkspace/log4jtest/log/application.loglog4j.appender.f ileout.MaxFileSize=10000KBlog4j.appender.f ileout.MaxBackupI ndex=10log4j.appender.f yout=org.apache.log4j.PatternLayoutlog4j.appender.f yout.ConversionPattern=%d{MM-dd HH:mm:ss.SSS}[%24F:%-3L:%-5p]%x %m%nlog4j.rootCategory=INF O, stdout, fileout.wolf square.log2=DEB UG,stdout===================================这个文件可以划为三小块===========第一块定义了一个名为 stdout 的appender和layout (appender,layout的概念后面再解释,目前先记着有这样两个名词):log4j.appender.stdout=org.apache.log4j.ConsoleAppender定义stdout的实际输出实现类,从这个appender实现类名可以猜到,这个类是负责控制台输出的。
yout=org.apache.log4j.PatternLayout定义stdout的输出装饰器yout.ConversionPattern=%d{MM-dd HH\:mm\:ss.SSS} %-5p [%F\:%L]%x %m%n装饰器参数配置============第二块定义了一个名为 fileout 的appender和layout:log4j.appender.f ileout=org.apache.log4j.RollingFileAppender同理可猜这个实现类是输出到文件的log4j.appender.f ileout.File=D:/w orkspace/log4jtest/log/application.loglog4j.appender.f ileout.MaxFileSize=10000KBlog4j.appender.f ileout.MaxBackupI ndex=10log4j.appender.f yout=org.apache.log4j.PatternLayoutlog4j.appender.f yout.ConversionPattern=%d{MM-dd HH:mm:ss.SSS}[%24F:%-3L:%-5p]%x %m%n============第三块定义了名字分别为rootCategory,.wolf square.log2的两个loggerlog4j.rootCategory=INF O, stdout, fileout.wolf square.log2=DEB UG,stdoutrootCategory logger是缺省的logger,记录所有的包的信息输出。
第二个logger是只输出指定包com.w olf square.log2下的日志信息。
那么INF O,DEB UG又是什么意思呢,他们是信息的分级标识,通过继承实现这个实现自定义级别的分级。
第三块配置两句的意思是这样的:rootCategory 把所有类的INF O级别以上的信息输出到stdout和fileout两个appender中,.w olf square.log2,把com.w olf square.log2包中的所有类(包括子包)DEB UG级别(含)以上的信息输出到stdout 中一个logger可以输出到很多个设备中(appender),如果需要增加输出设备则用分号分隔开appender名称即可。
输出信息的分类级别是DEB UG > INF O > WAR N > ERROR,信息细节由细到粗,指定输出某一级别的信息时,过细的信息输出将会被忽略如果一个配置中有多个logger,他们之间会有什么关系呢?答案是,在输出上,他们没有任何关系,都是独立运作的,不相关的,但是在配置上,父包的配置会传给子包,如果子包没有另外定义配置的话。
例如上面配置文件中的两个logger:.wolf square.wolf square.log2这里认为 .wolf square.log2继承自 .w olf square,他们的配置声明如下:log4j.rootCategory=INF O, stdout, fileout.wolf square.log2=,stdout注意第二句没有指定输出级别,那么根据配置继承规则会继承父logger的配置,在这里就是INF O。
同时需要强调的是,如果两个logger有继承关系,且输出到同一个appender,根据输出独立原则,那么将会出现两行一样的信息,例如上面的两个logger定义会导致这样的情况。
最后以一幅图来概括:log4j.properties配置详解在学习spring mvc的同时也对其日志引起了兴趣,由于准备要把log4j更换成logback 其两框架都是同一个作者开发,所以先把log4j做一个详细的了解,以下内容从Google上搜到出来的,关于log4j.properties的详细配置Log4J的配置文件(Configuration File)就是用来设置记录器的级别、存放器和布局的,它可接key=value格式的设置或xml格式的设置信息。
通过配置,可以创建出Log4J的运行环境。
1. 配置文件Log4J配置文件的基本格式如下:#配置根Loggerlog4j.rootLogger = [ level ] , appenderName1 , appenderName2 , …#配置日志信息输出目的地Appenderlog4j.appender.appenderName = .of.appender.classlog4j.appender.appenderName.option1 = value1…log4j.appender.appenderName.optionN = valueN#配置日志信息的格式(布局)yout = yout.class yout.option1 = value1…yout.optionN = valueN其中[level] 是日志输出级别,共有5级:FATAL 0ERROR 3WARN 4INFO 6DEBUG 7Appender 为日志输出目的地,Log4j提供的appender有以下几种:org.apache.log4j.ConsoleAppender(控制台),org.apache.log4j.FileAppender(文件),org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)Layout:日志输出格式,Log4j提供的layout有以下几种:org.apache.log4j.HTMLLayout(以HTML表格形式布局),org.apache.log4j.PatternLayout(可以灵活地指定布局模式),org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)打印参数: Log4J采用类似C语言中的printf函数的打印格式格式化日志信息,如下:%m 输出代码中指定的消息%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL%r 输出自应用启动到输出该log信息耗费的毫秒数%c 输出所属的类目,通常就是所在类的全名%t 输出产生该日志事件的线程名%n 输出一个回车换行符,Windows平台为“\r\n”,Unix平台为“\n”%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss , SSS},输出类似:2002年10月18日22 :10 :28 ,921%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。
举例:Testlog4.main(TestLog4.java: 10 )2. 在代码中初始化Logger:1)在程序中调用BasicConfigurator.configure()方法:给根记录器增加一个ConsoleAppender,输出格式通过PatternLayout设为"%-4r [%t] %-5p %c %x - %m%n",还有根记录器的默认级别是Level.DEBUG.2)配置放在文件里,通过命令行参数传递文件名字,通过PropertyConfigurator.configure(args[x])解析并配置;3)配置放在文件里,通过环境变量传递文件名等信息,利用log4j默认的初始化过程解析并配置;4)配置放在文件里,通过应用服务器配置传递文件名等信息,利用一个特殊的servlet来完成配置。