互联网上对Log4j的说明感觉很少,但实际工作我们经常要和log4j的配置打交道。看不懂log4j的配置就可尴尬。笔者曾经因不熟悉log4j各个配置的作用而浪费了很大的时间去接入公司内部日志中心。事后便将log4j的配置相关信息进行了整理,便有了下文。log4j的配置很简单,就三大部分:Appender,Layouts, Logger......
log4j
log4j:一个开源的,轻量级的,用于日志管理的框架。
-
日志有六个级别
- fatal(致命的)
- error
- warn
- info
- debug
- trace(堆栈)
级别从高到低,log4j不仅会打印本级别的日志还会打印比该级别更高的日志。例如,系统设置的级别为info,那么info,warn,error,fatal级别的日志都会被打印。
-
日志属性文件 log4j.properties 是专门用于控制日志输出的。其主要进行三方面控制:
- appender:输出位置:控制日志将要输出的位置,是控制台还是文件等。
- layout:输出布局:控制日志信息的显示形式
- level:控制要输出的日志级别。
- Appender:设置日志输出的位置,
log4j.appender.console = org.apache.log4j.ConsoleAppender #输出到控制台
org.apache.log4j.FileAppender #输出到文件
org.apache.log4j.DailyRollingFileAppender #每天产生一个日志文件
- Layouts:用来指定日志的的格式
org.apache.log4j.HTMLLayout:以HTML表格形式布局
org.apache.log4j.PatternLayout:可以灵活地指定布局模式
org.apache.log4j.SimpleLayout:包含日志信息的级别和信息字符串
- Logger:可以控制应用程序中哪些类路径下的类输出哪些级别的日志信息,同时可以控制启用哪个Appender。
log4j.rootLogger = [ level ] , appenderName1, appenderName2, …(rootLogger是默认跟logger控制器,表示所有类路径下的日志打印都会输出,同时可以选择启用自己已经配置的Appender)
log4j2
若开发者没有设置log4j2.xml,则系统会使用系统默认的日志配置,只会输出error级别的信息
- configuration标签:
configuration标签的status属性设置用于设置log4j自身运行的日志显示级别,一般为OFF,不显示,也可以设置为ERROR,DEBUG等其他级别 - Console标签的target属性用于设置输出的目标形式,其值一般为:SYSTEM_OUT或SYSTEM_ERROR
- File标签的fileName属性用于设置文件的保存路径,以及文件名, append属性用于设置是否以追加的方式将日志写入文件中,
- RollingFile标签,fileName指定存放目录以及第一个日志文件名,filePattern指定新创建的日志文件的文件名。SizeBasedTriggeringPolicy子标签用于指定每一个日志文件最大文件大小,当达到这个指定值以后,会自动再创建一个日志文件。
- logger标签:用于配置根Logger对象,用于指定所使用的日志记录器,该子标签的属性level用于指定显示级别,主要通过root的子标签的appender-ref来引用appender中定义好的记录器。
logback
-
configuration标签:logback的配置标签,可指定scan属性:是否自动扫描配置文件变动,若有变动重新载入。
- contextName子标签,用于指定上下文名称
-
appender:配置日志输出的位置和日志输出的格式,常见Appender
- ConsoleAppender:把日志添加到控制台
- FileAppender 日志添加到文件
- RollingFileAppender:滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件。用rollingPolicy指定滚动策略。
-
filter:过滤器被添加到<Appender> 中,可以用任意条件对日志进行过滤。常用的过滤器:LevelFilter
- <onMatch>:用于配置符合过滤条件的操作
-
<onMismatch>:用于配置不符合过滤条件的操作
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern> <maxHistory>30</maxHistory> </rollingPolicy> <encoder> <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern> </encoder> </appender>
- loger:用来设置某一个包或者具体的某一个类的日志打印级别并设置该loger条件下启用的appender。当前loger将会继承上级的级别。root也是<loger>元素,但是它是根loger,是默认的loger。所有的loger都继承了root的配置。
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<logger name="logback"/>
<logger name="logback.LogbackDemo" level="INFO" additivity="false">
<appender-ref ref="STDOUT"/>
</logger>
<root level="ERROR">
<appender-ref ref="STDOUT"/>
</root>
</configuration>
slf4j
- sl4j:是日志接口层,以上的log4j,log4j2,logback是日志实现层。推荐在业务中使用sl4j。通过使用sl4j可以无缝将业务底层的日志实现从log4j升级到log4j2或者logback。
Slf4j工作图:
- 通常一个项目的各个依赖不可能会整齐划一的使用同一个log的底层实现,一般都有log4j,log4j2,logback并存的情况。对于这种情况,sf4j提供了中间转换包,以满足项目不同组件使用不同的日志实现的需求。工作原理图如下:
Slf4j日志适配图:
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。