1、日志的发展史
1、最原始的打印日志
System.out
、System.err
2、JUL(Java Util Logging)
JDK
自带的日志框架,在java.util.logging
包下
API
不完善、对开发者不友好,很少人使用
3、Log4j(Log For Java)
由Apache
组织推出,1.x
版本于2015-08-05宣布停止维护
4、JCL(Jakarta Commons Logging)
由Apache
组织推出的日志门面接口
提供一套API
来实现不同Logger
之间的切换
5、SLF4J(Simple Logging Facade For Java
)
由Log4j
作者开发的日志门面接口,比JCL
更优秀更好用
6、Logback
由Log4j
作者开发,比Log4j 1.x
的性能高很多,实现了SLF4J
7、Log4j2
由Apache
组织推出的,Log4j 1.x
的重大升级改进版,改进了Logback
的一些问题,既是门面接口,又是日志实现
2、Log4j
log4j
是apache
推出的日志实现,于2015
年停止更新了,目前最新版本为1.2.17
2.1、在pom.xml
中配置
log4j
log4j
1.2.17
2.2、配置文件
classpath:log4j.xml
(优先级高)、classpath:log4j.properties
log4j.rootLogger=TRACE, console
# 输出目标(控制台,文件)
# log4j.appender.名称=Appender的类型
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.encoding=UTF-8
# layout:输出格式
log4j.appender.console.layout=org.apache.log4j.PatternLayout
# %-5p错误信息、%t线程、%m错误信息、%n换行
log4j.appender.console.layout.conversionPattern=%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5p] [%t]: %m%n
2.3、日志级别
日志级别由小到大:
TRACE
<DEBUG
<INFO
<WARN
<ERROR
<FATAL
<OFF
2.4、pattern
%c
:Logger
的全类名
%C
: 日志调用所在类,如: com.sj.log.Slf4jAndLogbackMain
%d
:时间,%d{yyyy-MM-dd HH:mm:ss.SSS}
%t
:线程的名称
%F
:文件名
%L
:代码行号
%M
:方法
%l
:代码的具体位置(哪个类的哪个方法?哪一行?)
%m
:消息
%n
:换行
%p
:日志级别
%%
:一个%
%pid
:进程号
%threadId
(简写:%tid
):线程号
%exception
(简写:%ex
):异常记录
宽度设置
%20logger
:当字符数少于20个字符时,则左侧留空白;
%-20logger
:当字符数少于20个字符时,则右侧留空白;
%.30logger
:当字符数据大于30个时,则截断;
显示设置
%highligth
:突出显示
%green(%red、%blue、%white)
:字体显示为指定颜色
{length}
可指定长度,如%logger{36}
2.5、子Logger
子
Logger
可以是包级别、类级别
所有子
Logger
的最终父Logger
是rootLogger
子
Logger
默认会继承父Logger
的Appender
additivity
:代表不继承关系
# 从下到上依此为继承关系
log4j.rootLogger=TRACE, console3
# 默认继承rootLogger
log4j.logger.com.sj.test=ERROR, console3
# 子Logger会默认继承父Logger的Appender
log4j.logger.com.sj.test.TestLog4j1_04=FATAL, console4
# additivity不继承关系
log4j.additivity.com.sj.test.TestLog4j1_04=FATAL, console4
2.6、日志输入到文件
1、file
:只输入到一个文件中。
encoding=UTF-8
pattern=%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5p] [%t]: %m%n
log4j.rootLogger=TRACE, file
#输出到文件(FileAppender)
log4j.appender.file=org.apache.log4j.FileAppender
# 文件名称
log4j.appender.file.file=log4j.log
log4j.appender.file.encoding=${encoding}
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.conversionPattern=${pattern}
2、rollingFile
:文件大小超过一定的值时会出入到新的文件中。
encoding=UTF-8
pattern=%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5p] [%t]: %m%n
log4j.rootLogger=TRACE, rollingFile
#输出到文件(FileAppender)
log4j.appender.rollingFile=org.apache.log4j.RollingFileAppender
# 生成的文件最大索引值(备份文件个数)
log4j.appender.rollingFile.maxBackupIndex=10
# 每个备份文件的大小
log4j.appender.rollingFile.maxFileSize=10KB
# 输出到的文件目录
log4j.appender.rollingFile.file=log4j.log
log4j.appender.rollingFile.encoding=${encoding}
log4j.appender.rollingFile.layout=org.apache.log4j.PatternLayout
log4j.appender.rollingFile.layout.conversionPattern=${pattern}
3、dailyRollingFile
:它能够按一定的频度滚动日志记录文件。
encoding=UTF-8
pattern=%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5p] [%t]: %m%n
log4j.appender.dailyRollingFile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.dailyRollingFile.datePattern='.'yyyy-MM-dd-HH-mm
log4j.appender.dailyRollingFile.file=log4j.log
log4j.appender.dailyRollingFile.encoding=${encoding}
log4j.appender.dailyRollingFile.layout=org.apache.log4j.PatternLayout
log4j.appender.dailyRollingFile.layout.conversionPattern=${pattern}
2.7、xml格式的配置文件
1、console
打印
2、file
输出到文件
2、rollingFile
输出
3、dailyRollingFile
输出
4、Filter
1、LevelMatchFilter
2、LevelRangeFilter
3、StringMatchFilter
3、JCL
jcl
是定义的一组通用日志接口
log4j
是日志的实现,log4j2
也是日志的实现,log4j2
对是对log4j
的重写,功能更完善
1、JCL的介绍
通过
LogFactory
动态加载Log
实现类,如果要适配新的日志,需要修改JCL
内部代码,因此被apache
淘汰
4、SLF4J
简单日志门面(Simple Logging Facade For Java
) SLF4J
主要是为了给Java
日志访问提供一套标准、规范的API
框架,其主要意义在于提供接口,具体的实现可以交由其他日志框架
4.1、绑定日志的实现(Binding)
1、添加slf4j-api
的依赖
2、使用slf4j
的API
在项目中进行统一的日志记录
3、绑定具体的日志实现框架
4、绑定已经实现了slf4j
的日志框架,直接添加对应依赖
5、绑定没有实现slf4j
的日志框架,先添加日志的适配器,再添加实现类的依赖
6、slf4j
有且仅有一个日志实现框架的绑定(如果出现多个默认使用第一个依赖日志实现)
在maven
中添加依赖
log4j
log4j
1.2.12
org.slf4j
slf4j-api
1.7.30
org.slf4j
slf4j-log4j12
1.7.30
日志桥接如官方提供的图如下:
4.2、旧的日志框架桥接
通常,依赖的某些组件依赖于SLF4J
以外的日志记录API
。也可以假设这些组件在不久的将来不会切换到SLF4J
。为了解决这种情况,SLF4J
附带了几个桥接模块,这些模块将对log4j
,JCL
和java.util.logging API
的调用重定向,就好像它们是对SLF4J API
一样。
桥接步骤如下:
1、先去除之前老的日志框架的依赖
2、添加SLF4J
提供的桥接组件
3、为项目添加SLF4J
的具体实现
5、Lombok的使用
Lombok
可以自动生成SLF4J
的Logger
的定义
具体实现如下:
1、添加maven
依赖如下
org.projectlombok
lombok
1.18.12
2、在java
中实现@CommonLog
的注解
@CommonsLog
public class TestLog4j1 {
public static void main(String[] args) {
// 实际使用中log的实现如下的形式,
// private static final Log log = LogFactory.getLog(TestLog4j1.class);
log.error("错误_ERROR");
log.warn("警告_WARN");
log.info("信息_INFO");
log.debug("调试_DEBUG");
log.trace("痕迹_TRACE");
}
}
6、Logback
Logback
内部有一套默认配置,可以不用提供配置文件
6.1、Logback
的打印实现
1、添加maven
依赖如下
ch.qos.logback
logback-classic
1.2.3
2、在resources
中实现logback.xml
配置文件
${CHARSET}
${PATTERN}
3、Logback
彩色控制台打印
6.2、configuration
标签
configuration
设置常用属性,debug="true"
:可以打印Logback
的内部日志
scan="true"
+ scanPeriod="30 seconds"
每隔30
秒扫描配置文件,使用配置文件的最新修改
scanPeriod
的单位可以是:milliseconds
、seconds
、minutes
、hours
6.3、appender
标签
公共标签如下
1、FileAppender
PatternLayoutEncoder
${BASE_PATH}/logback_file.log
${CHARSET}
${FILE_PATTERN}
HTMLLayout
${BASE_PATH}/logback_file.html
${CHARSET}
${HTML_PATTERN}
2、RollingFileAppender
基于时间滚动策略TimeBasedRollingPolicy
${BASE_PATH}/logback.log
${CHARSET}
${FILE_PATTERN}
${BASE_PATH}/%d{yyy-MM-dd-HH-mm-ss}.log
20
10KB
基于时间和大小的滚动策略SizeAndTimeBasedRollingPolicy
${BASE_PATH}/logback_rolling2.log
${CHARSET}
${FILE_PATTERN}
${BASE_PATH}/logback_rolling2_%d{dd-HH-mm}_%i.log.zip
1MB
3、Filter
${CHARSET}
${CONSOLE_PATTERN}
WARN
ACCEPT
DENY
4、AsyncAppender
异步打印