常见的日志框架:
如果是单一的应用,直接使用日志框架就足够了。
- log4j
- logback
- j.u.l (java.util.logging)
常见的日志门面:
如果编写的应用是作为libraries或者其他embedded component提供给其他人使用,则需要使用slf4j作为日志门面。因为你无法预测使用你libraries或component的用户使用过的是什么日志框架。
- slf4j
- common-logging
混合绑定是指在项目中直接使用slf4j来打印日志,而底层绑定任意一种日志框架,如log4j/logback/jul等。混合绑定根据实现原理又分为两种:有适配器(adapter)绑定,无适配器绑定。有适配器绑定是指底层没有实现slf4j的接口,而是通过适配器调用底层日志框架的logger。无适配器绑定是指其本身实现了slf4j得全部接口(logback),不需要调用其它日志框架的logger。
几种混合绑定包简介:
- slf4j-log4j12-1.7.21.jar:有适配器,绑定log4j,logger由log4j-1.2.17.jar提供。
- slf4j-jdk4-1.7.21.jar:有适配器,绑定jul,logger由jul提供
- logback-classic-1.0.13.jar:无适配器,logback实现了slf4j得全部接口。
- slf4j-simlple-1.7.21.jar:无适配器,slf4j的简单实现,仅打印info及以上级别的日志,所有输出重定向到System.err,适用于小应用。
1、slf4j + log4j
log4j的配置文件是用来设置logger的级别、存放位置和布局的,可以通过java属性文件(key = value)格式设置。配置文件支持 XML、JSON、YAML和properties 格式。
配置文件寻找优先级 :
log4j2-test > log4j2-dev,
log4j2.properties > log4j2.yaml/log4j2.yml > log4j2.json/jlog4j2.jsn > log4j2.xml
log4j配置文件元素:
Logger
logger是日志记录器,使用方式为 Logger logger = LoggerFactory.getLogger(
App.class )
Appender
每个Appender可独立配置纪录日志的设备,可以是:控制台、文件、数据库、消息系统等。log4j提供的Appender具体有如下几种:
Appender类型 | Appender描述 |
---|---|
org.apache.log4j.ConsoleAppender | 输出到控制台 |
org.apache.log4j.FileAppender | 输出到文件 |
org.apache.log4j.DailyRollingFileAppender | 产生日志文件的周期 |
org.apache.log4j.RollingFileAppender | 日志文件达到指定大小产生一个新日志文件 |
org.apache.log4j.WriterAppender | 将日志信息以流格式发送到指定地方 |
Layout 日志布局
Layout即日志的格式formatter,对日志时间中的数据进行转换和格式化,Layout决定了数据在一条日志记录中的最终表现形式。log4j提供的以下几种Layout
Layout类型 | Layout描述 |
---|---|
org.apache.log4j.HTMLLayout | 以html格式布局 |
org.apache.log4j.PatternLayout | 可以灵活的指定布局格式 |
org.apache.log4j.SimpleLayout | 包含日志信息的级别和信息字符串 |
org.apache.log4j.TTCCLayout | 包含日志产生的时间、线程、类别等等信息 |
log4j采用类似C语言中printf的打印格式化日志信息,打印参数如下
类型 | 描述 |
---|---|
%m | 输出代码中制定的消息 |
%p | 输出日志级别 |
%r | 输出自应用启动到出处该日志记录耗费的毫秒数 |
%c | 输出触发该日志事件的类 |
%t | 输出触发该日志事件的线程 |
%d | 输出日志事件发生的时间,如:%-d{yyyy-MM-dd HH:mm:ss} |
%l | 输出日志发生的位置,包括类信息、线程、行数 |
Leval
每个打印日志都可以单独指定日志级别,通过配置文件来控制输出级别。log4j提供的日志级别如下:
类型 | 描述 |
---|---|
ALL | 最低级别,用于打开所有日志记录 |
TRACE | 指定粒度比DEBUG更细的事件 |
DEBUG | 指定细粒度信息事件,对调试应用程序有帮助 |
INFO | 指定粗粒度信息事件,突出强调程序运行过程 |
WARN | 指定具有潜在危害的情况 |
ERROR | 指定错误事件,程序仍然允许运行 |
FATAL | 指定非常严重的错误事件,可能导致应用程序终止 |
OFF | 最高等级,用于关闭日志记录 |
SLF4J+log4j实践
1. 添加依赖 slf4j-api-1.7.25.jar和log4j-2.10.jar
log4j必须指定配置文件或默认配置,如果没有编写配置文件,且没有设置默认配置器是,会报错。
偷懒方法:
通过BasicConfigurator.configure() 可指定log4j默认配置器,该配置默认生成rootLogger,并添加一个控制台Appender。可通过DOMConfigurator.configure( logger-properties-file-path )显示制定外部配置文件
log4j配置文件模板:
### set log levels ###
log4j.rootLogger = debug,stdout,D,E
### 输出到控制台 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} %p [%c] %m%n
### 输出到日志文件 ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = 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
### 保存异常信息到单独文件 ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File = 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
### logger ###
# 设置后,路径下的日志将只输出ERROR日志
#log4j.logger.com.xxx=ERROR
STEP1 :将 slf4j-api-version.jar和 log4j-2.10.jar 添加到 class-path 中。
STEP3:在程序中使用slf4j