一,需要用到的jar,添加maven依赖
<!-- log -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.6.6</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>1.6.6</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
1,log4j.properties 记录的信息没有log4j.xml 全,故只记录log4j.xml 的用法,先看看配置文件,
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="false"> <appender name="console" class="org.apache.log4j.ConsoleAppender"> <param name="target" value="System.out"/> <param name="encoding" value="UTF8"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d %-5p [%c] %m%n"/> </layout> </appender> <appender name="controller" class="org.apache.log4j.DailyRollingFileAppender"> <param name="encoding" value="UTF8"/> <param name="File" value="${catalina.base}/logs/cms/controller/controller.log"/> <param name="Append" value="true"/> <param name="DatePattern" value="'.'yyyy-MM-dd"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d %-5p [%c] %m%n"/> </layout>
</appender> <!-- 注意: 1:当additivity="false"时,root中的配置就失灵了,不遵循缺省的继承机制 2:logger中的name非常重要,它代表记录器的包的形式,有一定的包含关系,试验表明 2-1:当定义的logger的name同名时,只有最后的那一个才能正确的打印日志 2-2:当对应的logger含有包含关系时,比如:name=test.log4j.test8 和 name=test.log4j.test8.UseLog4j, 则父级目录按照子级目录设置的级别输出 2-3:logger的name表示所有的包含在此名的所有记录器都遵循同样的配置,name的值中的包含关系是指记录器的名称哟!注意啦! 3:logger中定义的level和appender中的filter定义的level的区间取交集 4:如果appender中的filter定义的 levelMin > levelMax ,则打印不出日志信息 --> <!-- 指定logger的设置,additivity指示是否遵循缺省的继承机制--> <logger name="test.log4j.test8.UseLog4j" additivity="false"> <level value ="WARN"/> <appender-ref ref="DailyRollingFileAppender"/> </logger> <root> <level value="ALL"></level> <!-- 限定记录等级 --> <appender-ref ref="console"/> </root></log4j:configuration><filter class="org.apache.log4j.varia.LevelRangeFilter"> <!-- 设置日志输出的最小级别 --> <param name="levelMin" value="WARN" /> <!-- 设置日志输出的最大级别 --> <param name="levelMax" value="ERROR" /> <!-- 设置日志输出的xxx,默认是false --> <param name="AcceptOnMatch" value="true" /> </filter>
在appender节点下设置路径,${ catalina}指向tomcat安装目录,catalina.base或者catalina.home都是指向bin,logs的父目录,有一点区别,idea指定tomcat路径之后,实际产生的日志文件放在了系统盘用户目录下的idea运行目录
父子日志打印问题
下面定义了四个 logger,他们的父子关系从小到大为: com.lwc.qg.test.logbackDemo → com.lwc.qg.tes → com.lwc.qg → root <!-- 根 logger --> <root level="info"> <appender-ref ref="STDOUT"/> </root> <!-- 普通的 logger name:类名或包名,标志该 logger 与哪个包或哪个类绑定 level:该 logger 的日志级别 additivity:是否将日志信息传递给上一级 true:传递,false:不传递 --> <logger name="com.lwc.qg.test.logbackDemo" level="debug" additivity="true"> <appender-ref ref="STDOUT"/> </logger> <logger name="com.lwc.qg.test" level="info" additivity="true"> <appender-ref ref="STDOUT"/> </logger> <logger name="com.lwc.qg" level="info" additivity="true"> <appender-ref ref="STDOUT"/> </logger>
从该种级别来看,如果此时在最低层的 logger 输出日志信息,以该配置作为基础,它将会向父级的所有 logger 依次传递,所以按理来说一个打印信息将会打印四次
从控制台上看,的确每条日志信息都被打印出了四次,但是细心从配置文件上来看,root 的日志级别配置的为 info,但是却输出 debug 级别的日志信息,所以从测试结果可以看出,向上传递的日志信息的日志级别将由最底层的子元素决定(最初传递信息的 logger),因为子元素设置的日志级别为 debug,所以也输出了 debug 级别的信息。
因此,从理论上来说,如果子元素日志级别设置高一点,那么也将会只输出高级别的日志信息。实际上也是如此,如果我们把 com.lwc.qg.test.logbackDemo对应的 logger 日志级别设为 warn,那么将只会输出 warn及其以上的信息