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
中配置
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
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
的最终父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
打印
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration
PUBLIC "-//log4j/log4j Configuration//EN" "log4j.dtd" >
<log4j:configuration>
<!-- appender-->
<appender name="console" class="org.apache.log4j.ConsoleAppender">
<param name="encoding" value="UTF-8"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="conversionPattern" value="%d{HH:mm:ss.SSS} [%-5p] %c: %m%n"/>
</layout>
</appender>
<logger name="com.sj.main.TestLog4j1_02" additivity="false">
<level value="INFO" />
<appender-ref ref="file"/>
</logger>
<!-- logger-->
<root>
<level value="TRACE" />
<appender-ref ref="console"/>
<appender-ref ref="file"/>
</root>
</log4j:configuration>
2、file
输出到文件
<appender name="file" class="org.apache.log4j.FileAppender">
<param name="file" value="log4j.log"/>
<param name="encoding" value="UTF-8"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="conversionPattern" value="%d{HH:mm:ss.SSS} [%-5p] %c: %m%n"/>
</layout>
</appender>
2、rollingFile
输出
<appender name="rollingFile" class="org.apache.log4j.RollingFileAppender">
<param name="file" value="log4j.log"/>
<param name="encoding" value="UTF-8"/>
<param name="maxFileSize" value="100KB"/>
<param name="maxBackupIndex" value="10"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="conversionPattern" value="%d{HH:mm:ss.SSS} [%-5p] %c: %m%n"/>
</layout>
</appender>
3、dailyRollingFile
输出
<appender name="dailyRollingFile" class="org.apache.log4j.DailyRollingFileAppender">
<param name="file" value="log4j.log"/>
<param name="encoding" value="UTF-8"/>
<param name="datepattern" value="'.'yyyy-MM-dd-HH-mm-ss"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="conversionPattern" value="%d{HH:mm:ss.SSS} [%-5p] %c: %m%n"/>
</layout>
</appender>
4、Filter
1、LevelMatchFilter
<!-- 关闭FATAL级别-->
<filter class="org.apache.log4j.varia.LevelMatchFilter">
<param name="levelToMatch" value="DEBUG"/>
<param name="acceptOnMatch" value="true"/>
</filter>
2、LevelRangeFilter
<!-- 只有符合范围内的日志才会输出-->
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="levelMin" value="WARN"/>
<param name="levelMax" value="ERROR"/>
</filter>
3、StringMatchFilter
<filter class="org.apache.log4j.varia.StringMatchFilter">
<param name="stringToMatch" value="错误"/> <!--带有错误的文字都排除-->
<param name="acceptOnMatch" value="false"/>
</filter>
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
中添加依赖
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.30</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.30</version>
</dependency>
日志桥接如官方提供的图如下:
slf4j
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
依赖如下
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
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
依赖如下
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
2、在resources
中实现logback.xml
配置文件
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 抽取公共内容 -->
<property name="PATTERN" value="%d{HH:mm:ss.SSS} [%-5p] %c: %m%n" />
<property name="CHARSET" value="UTF-8" />
<!-- appender-->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<charset>${CHARSET}</charset>
<pattern>${PATTERN}</pattern>
</encoder>
</appender>
<!-- logger-->
<root level="TRACE">
<appender-ref ref="console"></appender-ref>
</root>
<logger name="com.sj" level="DEBUG" additivity="false">
<appender-ref ref="console" />
</logger>
</configuration>
3、Logback
彩色控制台打印
<property name="PATTERN" value="%d{HH:mm:ss.SSS} [%highlight(%-5p)] %yellow(%c): %m%n" />
6.2、configuration
标签
configuration
设置常用属性,debug="true"
:可以打印Logback
的内部日志
scan="true"
+ scanPeriod="30 seconds"
每隔30
秒扫描配置文件,使用配置文件的最新修改
scanPeriod
的单位可以是:milliseconds
、seconds
、minutes
、hours
<configuration debug="true" scan="true" scanPeriod="30 seconds">
</configuration>
6.3、appender
标签
公共标签如下
<property name="FILE_PATTERN" value="%d{HH:mm:ss.SSS} [%-5p] %c: %m%n" />
<property name="CONSOLE_PATTERN" value="%d{HH:mm:ss.SSS} [%highlight(%-5p)] %yellow(%c): %m%n" />
<property name="HTML_PATTERN" value="%d{HH:mm:ss.SSS} %-5p%c: %m%n" />
<property name="CHARSET" value="UTF-8" />
<property name="BASE_PATH" value="/Users/shiji/development" />
1、FileAppender
PatternLayoutEncoder
<appender name="file" class="ch.qos.logback.core.FileAppender">
<file>${BASE_PATH}/logback_file.log</file>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<charset>${CHARSET}</charset>
<pattern>${FILE_PATTERN}</pattern>
</encoder>
</appender>
HTMLLayout
<appender name="htmlFile" class="ch.qos.logback.core.FileAppender">
<file>${BASE_PATH}/logback_file.html</file>
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<charset>${CHARSET}</charset>
<layout class="ch.qos.logback.classic.html.HTMLLayout">
<pattern>${HTML_PATTERN}</pattern>
</layout>
</encoder>
</appender>
2、RollingFileAppender
基于时间滚动策略TimeBasedRollingPolicy
<appender name="rollingFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${BASE_PATH}/logback.log</file>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<charset>${CHARSET}</charset>
<pattern>${FILE_PATTERN}</pattern>
</encoder>
<!-- 基于时间的滚动策略-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${BASE_PATH}/%d{yyy-MM-dd-HH-mm-ss}.log</fileNamePattern>
<!-- 删除20s以前的配置文件-->
<maxHistory>20</maxHistory>
<!-- 总的日志大小限制(超过了,就删除最早的日志)-->
<totalSizeCap>10KB</totalSizeCap>
</rollingPolicy>
</appender>
基于时间和大小的滚动策略SizeAndTimeBasedRollingPolicy
<appender name="rollingFile2" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${BASE_PATH}/logback_rolling2.log</file>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<charset>${CHARSET}</charset>
<pattern>${FILE_PATTERN}</pattern>
</encoder>
<!-- 基于时间和大小的滚动策略-->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${BASE_PATH}/logback_rolling2_%d{dd-HH-mm}_%i.log.zip</fileNamePattern>
<!--当日志文件大小超过1MB时生成新的日志文件-->
<maxFileSize>1MB</maxFileSize>
</rollingPolicy>
</appender>
3、Filter
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<charset>${CHARSET}</charset>
<pattern>${CONSOLE_PATTERN}</pattern>
</encoder>
<!-- 只打印WARN级别的信息-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>WARN</level>
<!-- 当匹配 接收(开启打印)-->
<onMatch>ACCEPT</onMatch>
<!-- 当不匹配 否定(关闭打印)-->
<onMisMatch>DENY</onMisMatch>
</filter>
</appender>
4、AsyncAppender
异步打印
<appender name="async" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="console" />
</appender>
网友评论