相关文章链接:
观前提示:
本文所使用Eclipse版本为Photon Release (4.8.0),JDK为1.8.0_141,Tomcat为9.0.12。
1.配置详解
1.1 Appender
Appender为日志输出目的地,Log4j提供的appender有以下几种:
- ConsoleAppender: org.apache.log4j.ConsoleAppender,日志输出到控制台。
- FileAppender:org.apache.log4j.FileAppender,输出到文件。
- RollingFileAppender:org.apache.log4j.RollingFileAppender,输出到文件,文件达到一定阈值时,自动备份日志文件。
- DailyRollingFileAppender:org.apache.log4j.DailyRollingFileAppender,可定期备份日志文件,默认一天一个文件,也可设置为每分钟一个、每小时一个。
- WriterAppender:org.apache.log4j.WriterAppender,可自定义日志输出位置。
1.2 日志级别
一般日志级别包括:ALL,DEBUG, INFO, WARN, ERROR,FATAL,OFF
Log4J推荐使用:DEBUG, INFO, WARN, ERROR
级别种类详解
- OFF:为最高等级 关闭了日志信息
- FATAL:为可能导致应用中止的严重事件错误
- ERROR:为严重错误 主要是程序的错误
- WARN:为一般警告,比如session丢失
- INFO:为一般要显示的信息,比如登录登出
- DEBUG:为程序的调试信息
- TRACE:为比DEBUG更细粒度的事件信息
- ALL:为最低等级,将打开所有级别的日志
1.3 Layout
Layout为日志输出格式,Log4j提供的layout有以下几种:
- org.apache.log4j.HTMLLayout:以HTML表格形式布局。
- org.apache.log4j.PatternLayout:可以灵活地指定布局模式。
- org.apache.log4j.SimpleLayout:包含日志信息的级别和信息字符串。
- org.apache.log4j.TTCCLayout:包含日志产生的时间、线程、类别等等信息。
1.4 打印参数
- %m:输出代码中指定的消息,如log(message)中的message。
- %M:输出方法名。
- %p:输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL 。
- %r:输出自应用启动到输出该log信息耗费的毫秒数 。
- %c:输出所属的类目,通常就是所在类的全名 。
- %C:输出Logger所在类的名称,通常就是所在类的全名。
- %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 ) 。
- %F:输出所在类的类名称,只有类名。
- %L:输出语句所在的行数,只输出数字。
- %%:用来输出百分号“%”。
1.5 代码样例
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<!--#log4j中有5级logger ,#FATAL 0 ,#ERROR 3 ,#WARN 4 ,#INFO 6 ,#DEBUG 7 -->
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j">
<!--输出到控制台-->
<appender name="console" class="org.apache.log4j.ConsoleAppender">
<!-- 日志输出格式 -->
<layout class="org.apache.log4j.TTCCLayout"/>
</appender>
<!-- 输出日志到文件 -->
<appender name="fileAppender" class="org.apache.log4j.FileAppender">
<!-- 文件文件全路径名 -->
<param name="File" value="${catalina.base}/logs/demo/fileAppender.log"/>
<!-- 是否在已存在的文件追加写:默认时true,若为false则每次启动都会删除并重新新建文件-->
<param name="Append" value="false"/>
<!-- Threshold属性指定输出等级 -->
<param name="Threshole" value="INFO"/>
<!-- 是否启用缓存,默认false-->
<param name="BufferSize" value="false"/>
<!-- 缓存大小,依赖上一个参数(bufferedIO), 默认缓存大小8K -->
<param name="BufferSize" value="512"/>
<!-- 日志输出格式 -->
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%p][%d{yyyy-MM-dd HH:mm:ss SSS}][%c]-[%m]%n"/>
</layout>
</appender>
<!-- 输出日志到文件,当文件大小达到一定阈值时,自动备份 -->
<appender name="rollingAppender" class="org.apache.log4j.RollingFileAppender">
<!-- 文件文件全路径名 -->
<param name="File" value="${catalina.base}/logs/demo/RollingFileAppender.log"/>
<!-- 是否在已存在的文件追加写:默认时true,若为false则每次启动都会删除并重新新建文件-->
<param name="Append" value="true"/>
<!-- 保存备份日志的最大个数,默认值是:1 -->
<param name="MaxBackupIndex" value="10"/>
<!-- 设置当日志文件达到此阈值的时候自动回滚,单位可以是KB,MB,GB,默认单位是KB,默认值是:10MB -->
<param name="MaxFileSize" value="5120KB"/>
<!-- 设置日志输出的样式 -->
<layout class="org.apache.log4j.PatternLayout">
<!-- 日志输出格式 -->
<param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%-5p] [method:%l]%n%m%n%n"/>
</layout>
</appender>
<!-- 日志输出到文件,可以配置多久产生一个新的日志信息文件 -->
<appender name="dailyRollingAppender" class="org.apache.log4j.DailyRollingFileAppender">
<!-- 文件文件全路径名 -->
<param name="File" value="${catalina.base}/logs/demo/DailyRollingFileAppender.log"/>
<param name="Append" value="true"/>
<!-- 设置日志备份频率,默认:为每天一个日志文件 -->
<param name="DatePattern" value="yyyy-MM-dd"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%p][%d{HH:mm:ss SSS}][%c]-[%m]%n"/>
</layout>
</appender>
<!--
1. 指定logger的设置,additivity是否遵循缺省的继承机制
2. 当additivity="false"时,root中的配置就失灵了,不遵循缺省的继承机制
3. 代码中使用Logger.getLogger("logTest")获得此输出器,且不会使用根输出器
-->
<logger name="logTest" additivity="false">
<level value ="INFO"/>
<appender-ref ref="dailyRollingAppender"/>
</logger>
<!-- 根logger的设置,若代码中未找到指定的logger,则会根据继承机制,使用根logger-->
<root>
<appender-ref ref="console"/>
<appender-ref ref="fileAppender"/>
<appender-ref ref="rollingAppender"/>
<appender-ref ref="dailyRollingAppender"/>
</root>
</log4j:configuration>
1.6 实际例子
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<!--#log4j中有5级logger ,#FATAL 0 ,#ERROR 3 ,#WARN 4 ,#INFO 6 ,#DEBUG 7 -->
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j">
<!--输出到控制台-->
<appender name="console" class="org.apache.log4j.ConsoleAppender">
<!-- 日志输出格式 -->
<layout class="org.apache.log4j.TTCCLayout"/>
</appender>
<!-- 输出日志到文件,当文件大小达到一定阈值时,自动备份 -->
<appender name="rollingAppender" class="org.apache.log4j.RollingFileAppender">
<!-- 文件文件全路径名 -->
<param name="File" value="${catalina.base}/logs/mydemo/RollingFileAppender.log"/>
<!-- 是否在已存在的文件追加写:默认时true,若为false则每次启动都会删除并重新新建文件-->
<param name="Append" value="true"/>
<!-- 保存备份日志的最大个数,默认值是:1 -->
<param name="MaxBackupIndex" value="10"/>
<!-- 设置当日志文件达到此阈值的时候自动回滚,单位可以是KB,MB,GB,默认单位是KB,默认值是:10MB -->
<param name="MaxFileSize" value="5120KB"/>
<!-- 设置日志输出的样式 -->
<layout class="org.apache.log4j.PatternLayout">
<!-- 日志输出格式 -->
<param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%-5p] [method:%l]%n%m%n%n"/>
</layout>
</appender>
<!-- 日志输出到文件,可以配置多久产生一个新的日志信息文件 -->
<appender name="dailyRollingAppender" class="org.apache.log4j.DailyRollingFileAppender">
<!-- 文件文件全路径名 -->
<param name="File" value="${catalina.base}/logs/mydemo/DailyRollingFileAppender.log"/>
<param name="Append" value="true"/>
<param name="Threshold" value="DEBUG" />
<!-- 设置日志备份频率,默认:为每天一个日志文件 -->
<param name="DatePattern" value="yyyy-MM-dd"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%p][%d{HH:mm:ss SSS}][%c]-[%m]%n"/>
</layout>
</appender>
<!-- 下面这些就是根据 这些路径来控制对应包下的文件的日志输出级别,基本上都是报错了,才输出日志 -->
<logger name="org.apache.commons" additivity="false">
<level value="ERROR"/>
<appender-ref ref="dailyRollingAppender"/>
</logger>
<logger name="org.mybatis.spring" additivity="false">
<level value="ERROR"/>
<appender-ref ref="dailyRollingAppender"/>
</logger>
<logger name="java.sql" additivity="false">
<level value="ERROR"/>
<appender-ref ref="dailyRollingAppender"/>
</logger>
<logger name="org.apache.ibatis" additivity="false">
<level value="ERROR"/>
<appender-ref ref="dailyRollingAppender" />
</logger>
<logger name="org.springframework" additivity="false">
<level value="ERROR"/>
<appender-ref ref="dailyRollingAppender"/>
</logger>
<logger name="com.mchange.v2" additivity="false">
<level value="ERROR"/>
<appender-ref ref="dailyRollingAppender"/>
</logger>
<logger name="com.alibaba.druid.filter.stat" additivity="false">
<level value="WARN"/>
<appender-ref ref="dailyRollingAppender"/>
</logger>
<logger name="com.alibaba.druid.pool" additivity="false">
<level value="WARN"/>
<appender-ref ref="dailyRollingAppender"/>
</logger>
<logger name="druid.sql.Connection" additivity="false">
<level value="WARN"/>
<appender-ref ref="dailyRollingAppender"/>
</logger>
<logger name="druid.sql.DataSource" additivity="false">
<level value="WARN"/>
<appender-ref ref="dailyRollingAppender"/>
</logger>
<logger name="druid.sql.ResultSet" additivity="false">
<level value="WARN"/>
<appender-ref ref="dailyRollingAppender"/>
</logger>
<logger name="druid.sql.Statement" additivity="false">
<level value="WARN"/>
<appender-ref ref="dailyRollingAppender"/>
</logger>
<!-- 根logger的设置,若代码中未找到指定的logger,则会根据继承机制,使用根logger-->
<root>
<appender-ref ref="console"/>
<appender-ref ref="rollingAppender"/>
<appender-ref ref="dailyRollingAppender"/>
</root>
</log4j:configuration>