前言
记录学习历程,在学习笔记中有描述不正确的地方,欢迎小伙伴们评论指正。
Log4j
Log4j由Gülcü于2001年发布,后来成为Apache 基金会的顶级项目。在Log4j2和Logback没有发布出来之前,在业界广泛使用。Log4j2是Log4j的升级版,Apache组织推出Log4j2,取代Log4j
概念
1、公共类Logger:负责处理日志的大部分操作。
2、公共接口Appender:负责控制日志记录操作的输出。
3、公共抽象类Layout:负责格式化Appender的输出。
日志级别及级别等级
Log4j有8种日志级别。按照从低到高的顺序为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF
All:最低等级的;用于打开所有日志记录。
Trace:追踪;就是程序推进一下,就可以写个Trace输出,所以Trace会特别多。
Debug:指出细粒度信息事件对调试应用程序是非常有帮助的。
Info:消息在粗粒度级别上突出强调应用程序的运行过程。
Warn:输出警告及Warn以下级别日志。
Error:输出错误信息日志。
Fatal:输出每个严重的错误事件将会导致应用程序的退出的日志。
OFF:最高级别的;用于关闭所有日志记录。
如果将日志级别设置在某一个级别上,那么比此级别高的日志都能打印出来。一般只使用四种级别,优先级从高到底分别为Error、Warn、Info、Debug。Log4j默认的优先级为Error或Warn,实际上是Error。
配置文件
Log4J的配置文件(Configuration File)就是用来设置记录器的级别、存放器和布局的。Log4j支持两种配置文件格式,一种是XML格式的文件log4j.xml配置。一种是properties(key=value)文件。
Spring中选择配置文件的优先级(从先到后)如下:
1、classpath下的名为log4j-test.json 或者log4j-test.jsn的文件。
2、classpath下的名为log4j-test.xml的文件。
3、classpath下名为log4j.json 或者log4j.jsn的文件。
4、classpath下名为log4j.xml的文件。
log4j.xml完整配置
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration>
<!-- 将日志信息输出到控制台 -->
<appender name="consoleAppender" class="org.apache.log4j.ConsoleAppender">
<!-- 设置日志输出的样式 -->
<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>
<!--过滤器设置输出的级别-->
<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>
<!-- 将日志信息输出到文件,但是当文件的大小达到某个阈值的时候,日志文件会自动回滚 -->
<appender name="rollingFileAppender" class="org.apache.log4j.RollingFileAppender">
<!-- 设置日志信息输出文件全路径名 -->
<param name="File" value="D:/log4j/RollingFileAppender.log" />
<!-- 设置是否在重新启动服务时,在原有日志的基础添加新日志 -->
<param name="Append" value="true" />
<!-- 设置保存备份回滚日志的最大个数 -->
<param name="MaxBackupIndex" value="10" />
<!-- 设置当日志文件达到此阈值的时候自动回滚,单位可以是KB,MB,GB,默认单位是KB -->
<param name="MaxFileSize" value="10KB" />
<!-- 设置日志输出的样式 -->
<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="dailyRollingFileAppender" class="org.apache.log4j.DailyRollingFileAppender">
<!-- 设置日志信息输出文件全路径名 -->
<param name="File" value="D:/log4j/DailyRollingFileAppender.log" />
<!-- 设置日志每分钟回滚一次,即产生一个新的日志文件 -->
<param name="DatePattern" value="'.'yyyy-MM-dd-HH-mm'.log'" />
<!-- 设置日志输出的样式 -->
<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>
<!-- 指定logger的设置,additivity指示是否遵循缺省的继承机制-->
<logger name="com.runway.bssp.activeXdemo" additivity="false">
<priority value ="info"/>
<appender-ref ref="activexAppender" />
</logger>
<!-- 根logger的设置-->
<root>
<priority value ="debug"/>
<appender-ref ref="consoleAppender"/>
<appender-ref ref="rollingFileAppender"/>
<appender-ref ref="dailyRollingFileAppender"/>
</root>
</log4j:configuration>
log4j.properties配置
log4j.rootLogger=INFO,consoleAppender,logfile,MAIL
log4j.addivity.org.apache=true
#ConsoleAppender,控制台输出
#FileAppender,文件日志输出
#SMTPAppender,发邮件输出日志
#SocketAppender,Socket 日志
#NTEventLogAppender,Window NT 日志
#SyslogAppender,
#JMSAppender,
#AsyncAppender,
#NullAppender
#文件输出:RollingFileAppender
#log4j.rootLogger = INFO,logfile
log4j.appender.logfile = org.apache.log4j.RollingFileAppender
log4j.appender.logfile.Threshold = INFO
# 输出以上的 INFO 信息
log4j.appender.logfile.File = INFO_log.html
#保存 log 文件路径
log4j.appender.logfile.Append = true
# 默认为 true,添加到末尾,false 在每次启动时进行覆盖
log4j.appender.logfile.MaxFileSize = 1MB
# 一个 log 文件的大小,超过这个大小就又会生成 1 个日志 # KB ,MB,GB
log4j.appender.logfile.MaxBackupIndex = 3
# 最多保存 3 个文件备份
log4j.appender.logfile.layout = org.apache.log4j.HTMLLayout
# 输出文件的格式
log4j.appender.logfile.layout.LocationInfo = true
#是否显示类名和行数
log4j.appender.logfile.layout.Title=title:\u63d0\u9192\u60a8\uff1a\u7cfb\u7edf\u53d1\u751f\u4e86\u4e25\u91cd\u9519\u8bef
#每天文件的输出:DailyRollingFileAppender
#log4j.rootLogger = INFO,errorlogfile
log4j.appender.errorlogfile = org.apache.log4j.DailyRollingFileAppender
log4j.appender.errorlogfile.Threshold = ERROR
log4j.appender.errorlogfile.File = ../logs/ERROR_log
log4j.appender.errorlogfile.Append = true
#默认为 true,添加到末尾,false 在每次启动时进行覆盖
log4j.appender.errorlogfile.ImmediateFlush = true
#直接输出,不进行缓存
# ' . ' yyyy - MM: 每个月更新一个 log 日志
# ' . ' yyyy - ww: 每个星期更新一个 log 日志
# ' . ' yyyy - MM - dd: 每天更新一个 log 日志
# ' . ' yyyy - MM - dd - a: 每天的午夜和正午更新一个 log 日志
# ' . ' yyyy - MM - dd - HH: 每小时更新一个 log 日志
# ' . ' yyyy - MM - dd - HH - mm: 每分钟更新一个 log 日志
log4j.appender.errorlogfile.DatePattern = ' . ' yyyy - MM - dd ' .log '
#文件名称的格式
log4j.appender.errorlogfile.layout = org.apache.log4j.PatternLayout
log4j.appender.errorlogfile.layout.ConversionPattern =%d %p [ %c] - %m %n %d
#控制台输出:
#log4j.rootLogger = INFO,consoleAppender
log4j.appender.consoleAppender = org.apache.log4j.ConsoleAppender
log4j.appender.consoleAppender.Threshold = ERROR
log4j.appender.consoleAppender.layout = org.apache.log4j.PatternLayout
log4j.appender.consoleAppender.layout.ConversionPattern =%d %-5p %m %n
log4j.appender.consoleAppender.ImmediateFlush = true
# 直接输出,不进行缓存
log4j.appender.consoleAppender.Target = System.err
# 默认是 System.out 方式输出
### 输出DEBUG 级别以上的日志到=E://logs/error.log ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = E://logs/log.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
### 输出ERROR 级别以上的日志到=E://logs/error.log ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File =E://logs/error.log
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
#数据库:JDBCAppender
log4j.appender.DATABASE = org.apache.log4j.jdbc.JDBCAppender
log4j.appender.DATABASE.URL = jdbc:oracle:thin:@ 210.51 . 173.94 : 1521 :YDB
log4j.appender.DATABASE.driver = oracle.jdbc.driver.OracleDriver
log4j.appender.DATABASE.user = ydbuser
log4j.appender.DATABASE.password = ydbuser
log4j.appender.DATABASE.sql = INSERT INTO A1 (TITLE3) VALUES ( ' %d - %c %-5p %c %x - %m%n' )
log4j.appender.DATABASE.layout = org.apache.log4j.PatternLayout
log4j.appender.DATABASE.layout.ConversionPattern =% d - % c -%- 4r [ % t] %- 5p % c %x - % m % n
Log4j Appender详解
Log4j中appender是输出文件方式,一般有5中输出方式:
1、org.apache.log4j.RollingFileAppender:滚动文件,自动记录最新日志。
2、org.apache.log4j.ConsoleAppender:控制台。
3、org.apache.log4j.FileAppender:文件
4、org.apache.log4j.DailyRollingFileAppender:每天产生一个日志文件。
5、org.apache.log4j.WriterAppender:将日志信息以流的格式发送到任意指定的地方。
Appender常见子节点
1、Console节点用来定义输出到控制台的Appender
name:Console的属性,用来指定Appender的名称。
target:Console的属性,SYSTEM_OUT或SYSTEM_ERR,一般只设置默认SYSTEM_OUT。
PatternLayout:Console的子节点,输出格式。不设置的情况下默认为%m%n
2、File节点用来设置输出指定位置节点的Appender
name:File的属性,用来指定Appender的名称
fileName:File的属性,用来指定输出日志的目标文件带全路径的文件名
PatternLayout:File的子节点,输出格式,不设置情况下默认为%m%n
3、RollingFile节点用来定义超过指定大小自动删除旧的创建新的Appender
name:RollingFile的属性,指定Appender的名称。
fileName:RollingFile的属性,指定输出日志的目标文件带全路径的文件名
filePattern:RollingFile的属性,指定新建日志文件的名称格式
PatternLayout:RollingFile的子节点,输出格式,不设置的情况下默认%m%n
DefaultRolloverStrategy:RollingFile的子节点,用来指定同一个文件夹下最多有几个日志文件时,开始删除旧的,创建新的(通过max属性)
Policies:RollingFile的子节点,指定滚动日志的策略,就是什么时候进行新建日志文件输出日志。
TimeBasedTriggeringPolicy:Policies的子节点,基于事件的滚动策略
interval属性用来指定多久滚动一次,默认1hour
modulate=true用来调整时间。表示是否调整时间间隔以使在时间间隔边界发生下一个滚动。例如:假设小时为具体的时间单元,当前时间为上午3点,时间间隔为4(interval=4),第一次发生滚动是在上午4点,接下来是上午8点,接着是中午12点,接着是下午4点等发生。
SizeBasedTriggeringPolicy:Policies的子节点,基于文件大小的滚动策略,size属性用来定义每个日志文件的大小。
Filters:RollingFile的子节点,确定日志文件是否被输出。
有三个值的过滤条件:ACCEPT(接受)、DENY(拒绝)、NEUTRAL(中立)
在使用单个过滤器的时候,一般使用ACCEPT和DENY这俩个值;但在组合过滤器中,如果用ACCEPT的情况下,日志信息就会直接写入日志文件,后续的过滤器不再进行过滤。
所以,在组合过滤器中,接受使用NEUTRAL,被第一个过滤器接受的日志信息,会继续使用后面的过滤器进行过滤,只有满足所有过滤器的条件,才会把日志信息写入日志文件。
Log4j Logger详解
log4j中的logger元素定义一个日志输出器,指定logger的设置,additivity指定是否遵循缺省机制,常见的有两种:Root和Logger。
1、Root
name:定义logger的名称,以便于后文引用。
additivity:枚举属性,取值为 true 或 false 。默认为 true ,是否继承父Logger属性。
level:级别,指定Logger的日志级别。8个级别按照从低到高的顺序:All < Trace < Debug < Info < Warn < Error < Fatal < OFF。
appender-ref:root的子节点,用来指定该日志输出到那个appender,用ref指定。
2、Logger
logger节点用来单独指定日志的形式,比如要为包下的类文件指定不通的日志级别等。
level:日志输出级别。8个级别按照从低到高的顺序:All < Trace < Debug < Info < Warn < Error < Fatal < OFF。
name:用来指定该Logger所适用的类或类所在包的全路径,继承自Root节点。
additivity:Logger属性,取值为 true 或 false 。默认为 true ,是否继承父Logger属性。
appender-ref:logger的子节点,用来指定该日志输出到那个Appender,如果没有指定,就会默认继承自Root。如果指定了,那么就会在指定的Appender,那么会在指定的Appender和Root的Appender中都会输出,此时,可以将 additivity 属性定义为 false (additivity=false)只在自定义的Appender中进行输出。
Log4j additivity属性详解
Log4j中的additivity属性是一个枚举属性,取值为 true 和 false 。表示子Logger是否继承父Logger,默认情况下 additivity=true,也就是说默认情况下,子Logger会在父Logger的Appender中输出(子Logger继承父Logger的Appender)。若将additivity设置为false,则子Logger只会在自己的Appender中输出,而不会在父Logger的Appender中输出。
Log4j Layout详解
Log4j中的Layout主要用于数据的格式化,常见的有:HTMLLayout、SimpleLayout、PatternLayout 三种。
1、HTMLLayout
格式化日志为html表格形式,一般使用较少,html格式如下:
<table cellspacing="0" cellpadding="4" border="1" bordercolor="#224466" width="100%">
<tr>
<th>Time</th>
<th>Thread</th>
<th>Level</th>
<th>Category</th>
<th>Message</th>
</tr>
<tr>
<td>0</td>
<td title="main thread">main</td>
<td title="Level">INFO</td>
<td title="com.open1111.Test category">com.Test</td>
<td title="Message">普通Info信息</td>
</tr>
<tr>
<td>2</td>
<td title="main thread">main</td>
<td title="Level"><font color="#993300"><strong>FATAL</strong></font></td>
<td title="com.open1111.Test category">com.Test</td>
<td title="Message">严重错误fatal信息</td>
</tr>
<tr>
<td>3</td>
<td title="main thread">main</td>
<td title="Level"><font color="#993300"><strong>ERROR</strong></font></td>
<td title="com.open1111.Test category">com.Test</td>
<td title="Message">报错信息</td>
</tr>
<tr>
<td bgcolor="#993300" style="color:White; font-size : xx-small;" colspan="6">java.lang.IllegalArgumentException: 非法参数
<br> at com.Test.main(Test.java:17)
</td>
</tr>
</table>
2、SimpleLayout
简单的日志输出格式化,打印格式为:级别—日志信息(举例:debug—message、info—message)
3、PatternLayout
最强大的格式化器,可以根据自定义格式输出日志,若没有指定转换格式,就是用默认的转换格式(%m%n)。
- %c - %c{数字} - 输出日志器的名称。
例如:日志器的名称为 com.example.test
那么%c 则输出 com.example.test
%c{1} 则输出 test
%c{2} 则输出 example.test
%c{3} 则输出 com.example.test
%c{4} 则输出 com.example.test
- %C - %C{数字} - 输出调用者名称。
- %d - 输出打印日志的日期时间。
常用的格式有:%d{DATE}、%d{ABSOLUTE}、%d{HH:mm:ss,SSS}、%d{ddMMyyyy HH:mm:ss,SSS} - %n - 换行
- %m - 日志内容
- %p - 日志级别
- %r - 程序启动到现在的毫秒数
- %t - 当前线程数
- %l - 同%F%L%C%M
- %F - Java源文件名
- %L - Java源文件行数
- %C - Java类名,%C{1}输出最后一个元素
- %M - Java方法名