目录
日志框架出现的历史顺序:Log4j → JUL → JCL → slf4j → logback → log4j2
Logback的使用
Logback 是由log4j 创始人设计的另一个开源日志组件,性能比log4j要好
Logback目前比较受欢迎的日志实现框架,很多项目中都在使用,包括SpringBoot,它默认的日志实现就是logback
➳ Logback 主要分为三个模块:
- Logback-core:其它两个模块的基础模块
- Logback-classic:它是log4j的一个改良版本,同时它完整实现了slf4j API
- Logback-access:访问模块与servlet容器集成提供通过http来访问日志的功能
!! 注意:后续的日志代码都是通过slf4j日志门面搭建日志系统,所以在代码上是没有区别,主要是通过修改配置文件和pom.xml依赖
▎入门案例
创建普通的maven项目即可
1. 导入 slf4j日志门面技术依赖 + logback 日志实现依赖
<dependencies>
<!-- junit 测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.1</version>
</dependency>
<!-- slf4 日志门面-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.30</version>
</dependency>
<!-- logback日志实现框架 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.9</version>
</dependency>
</dependencies>
❥ 小知识:导入logback-classic.jar 一个依赖即可,因为maven有传递思想,会自动传递core包
2. 编写测试用例
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Demo {
public static final Logger logger = LoggerFactory.getLogger(Demo.class);
@Test
public void testQuick(){
logger.error("hello error");
logger.warn("hello error");
logger.info("hello error");
logger.debug("hello error"); // 默认日志级别
logger.trace("hello error"); // 低于默认日志级别debug的级别不会日志被打印
}
}
3. 运行结果
logback日志级别
logback有5种级别(除去两个特殊级别),定义于ch.qos.logback.classic.Level类中。
日志级别(降序) | 使用 |
---|---|
OFF | 关闭所有级别的日志记录(不捕获任何内容) |
ERROR | 输出错误信息日志 |
WARN | 警告信息,可能会发生问题 |
INFO | 运行信息,数据连接、网络连接、IO 操作等 |
DEBUG(默认) | 调试信息,一般在开发中使用,记录程序变量参数传递信息等 |
TRACE | 追踪信息,记录程序所有的流程信息 |
ALL | 打开所有级别的日志记录(捕获所有内容) |
➳ 结论:级别依次从高到低,其中OFF可用来关闭日志记录,ALL启用所有消息的日志记录
★ 特别说明
- 如果logger没有被分配级别,则默认从父类logger对象中继承属性
- 输出当前日志级别及比当前当前日志级别高的信息,比当前日志级别小的级别不会被输出
logback 基础配置文件
logback会依次读取以下类型配置文件:
- logback.groovy groovy表达式
- logback-test.xml 在开发环境进行测试的时候进行配置的日志文件
- logback.xml 如果均不存在会采用默认配置
★ logback组件之间的关系
所有日志实现框架的组件基本雷同,由三部分组成:日志记录器、输出端、格式化组件
Logger
日志的记录器,把它关联到应用的对应的context上后,主要用于存放日志对象,也可以定义日志类型、级别
Appender
用于指定日志输出的目的地,目的地可以是控制台、文件、数据库等等
layout
负责把时间转换成字符串,格式化的日志信息的输出。在logback中layout对象被封装在encoder中
▎基本配置信息
1. 在resource目录下建立logback.xml 配置文件
2. logback.xml配置具体信息:appender输出端、layout格式化组件、logger对象配置
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<!-- 配置集中管理属性-->
<!-- 作用:如果其他标签要使用,可以直接通过表达式来引用:${property的name值}-->
<!-- 1.配置日志的输出格式,name:自定义名称 value:具体格式值 -->
<property name="pattern" value="[%-5level] %d{yyyy-MM-dd HH:mm:ss} %c %M %L %thread %m %n"></property>
<!-- 2.配置控制台输出的appender, name:自定义appender名称 class:appender类型-->
<appender name="myConsole" class="ch.qos.logback.core.ConsoleAppender">
<!-- 2.1控制输出流对象,默认是System.out控制台黑色字体,可修改为System.err 红色字体 -->
<target>System.err</target>
<!-- 2.2日志消息的格式 -->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!-- 引用上方配置的property标签指向的value -->
<pattern>${pattern}</pattern>
</encoder>
</appender>
<!-- 3.配置RootLogger(所有未指定父元素的logger的父对象,默认继承父对象所有属性) -->
<root level="ALL">
<!-- 引用上方定义的appender标签的name属性名称指向的appender -->
<appender-ref ref="myConsole"></appender-ref>
</root>
</configuration>
☛ 基本参数说明
logback节点关系。从外层到里层依次是:configuration -> appender -> encoder ->pattern
encoder 一是用于将日志信息转为字节数组,二是将字节数组写入到输入流(encoder的关键就是pattern,设定好pattern就ok)
pattern是用于控制日志的输出格式。(对于ConsoleAppender输出到控制台的,只需要设定好encoder下pattern即可。对于RollingFileAppender 、FileAppender还需要设置路径等属性)
① <property>:配置集中管理属性,name为自定义名称,这里定义了pattern具体日志输出格式,value值为下方表格的pattern具体日志输出指定的格式
占位符 | 含义 |
---|---|
%level | 输出日志级别 [%-5level]:日志级别占位5个字符,“-”表示向左对齐,[ ] 括号是为了凸显消息 |
%d | 输出服务器当前时间,默认为ISO8601,也可以指定格式,如:%d{yyyy-MM-dd HH:mm:ss} |
%c | 输出打印语句所属的类全名 |
%M | 输出当前运行的方法名 |
%L | 输出代码中的行号 |
%thread | 输出产生该日志的线程全名 |
%m 或 %msg | 输出代码指定的日志信息 |
%n | 换行符 |
② <appender>:定义appender输出端的类型、输出流类型、layout类型
子标签<target>:输出流类型,该标签属性是其<appender>的value指向的ConsoleAppender类中的成员变量:
子标签<encoder>:一是用于将日志信息转为字节数组,二是将字节数组写入到输入流,该标签属性是其<appender>的value值指向的ConsoleAppender类继承的父类OutputStreamAppender的成员参数
③ <root>:设置了root根对象的相关配置属性
固定的基本配置格式如下:
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<!--属性标签-->
<property ...></property>
<!--appender输出端标签-->
<appender ...> ...输出流对象、指定layout</appender>
<!--RootLogger标签-->
<root>... 指定appender</root>
</configuration>
3. logback.xml 配置完毕后,查看测试用例运行结果
➳ 结论:控制台打印日志的格式,严格按照我们自定义配置文件中设置的格式进行了输出
▎pattern 格式表达式拓展
pattern的输出表达式太长了,可参考官方给的格式:common (简单)、combined (复杂组合)
官网链接:Logback-access
common
<!-- 以下三种都是等价的,表达式太长可以使用英文单词代替 -->
<pattern> %h %l %u %user %date "%r" %s %b </pattern>
<pattern> common </pattern>
<pattern> clf </pattern>
combined
<!-- 以下两种等价 -->
<pattern>%h %l %u [%t] "%r" %s %b "%i{Referer}" "%i{User-Agent}"</pattern>
<pattern>combined</pattern>
logback的FileAppender
我们希望日志消息既能打印到控制台,也能输出到指定文件
跟上述所讲的基本配置信息差不多,在logback.xml 基础上增加 FileAppender的配置即可
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<!-- 1.配置集中管理属性-->
<!-- 配置日志的输出格式,name:自定义名称 value:具体格式值 -->
<property name="pattern" value="[%-5level] %d{yyyy-MM-dd HH:mm:ss} %c %M %L %thread %m %n"/>
<!-- 配置日志文件保存的目录:路径必须存在,否则报错-->
<property name="log_dir" value="/Users/wpf01/log" />
<!-- 2.配置日志输出到文件的appender -->
<appender name="fileAppender" class="ch.qos.logback.core.FileAppender">
<!-- 日志文件保存路径(logback.log日志文件不用存在,会自动生成) -->
<file>${log_dir}/logback.log</file>
<!-- 配置日志输出到文件的格式-->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
</appender>
<!-- 3.配置RootLogger属性-->
<root level="ALL">
<appender-ref ref="fileAppender" />
</root>
</configuration>
2. 执行如下测试用例
public class Demo {
public static final Logger logger = LoggerFactory.getLogger(Demo.class);
@Test
public void testQuick(){
logger.error("hello error");
logger.warn("hello warn");
logger.info("hello info");
logger.debug("hello debug");
logger.trace("hello trace");
}
}
3. 执行结果:文件目录下生成了对应log文件,文件内容是按照我们设置的格式进行输出的
也可以配置多个不同的appender,在根root配置属性里引用多个即可
<root level="ALL">
<!-- ConsoleAppender 输出到控制台 -->
<appender-ref ref="myConsole" />
<!-- FileAppender 输出到文件 -->
<appender-ref ref="fileAppender" />
</root>
▎HTML 格式日志
输出到文件的FileAppender的日志内容不易阅读,那么可以定义一个html类型的appender
1. 配置文件如下:
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<!-- 配置集中管理属性
作用:如果其他标签要使用,可以直接通过表达式来引用:${property的name值}-->
<!-- 1.配置日志的输出格式,name:自定义名称 value:具体格式值 -->
<property name="pattern" value="[%-5level] %d{yyyy-MM-dd HH:mm:ss} %c %M %L %thread %m %n"/>
<!-- 配置日志文件保存的目录:路径必须存在,否则报错-->
<property name="log_dir" value="/Users/wpf01137679/log" />
<!-- 2.配置控制台输出的appender, name:自定义appender名称 class:appender类型-->
<appender name="myConsole" class="ch.qos.logback.core.ConsoleAppender">
<!-- 2.1控制输出流对象,默认是System.out控制台黑色字体,我们可以修改为System.err 红色字体 -->
<target>System.err</target>
<!-- 2.2日志消息的格式(指定layout) -->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
</appender>
<!-- 配置日志输出到文件的appender -->
<appender name="fileAppender" class="ch.qos.logback.core.FileAppender">
<!-- 日志文件保存路径(log日志文件不用存在,会自动生成) -->
<file>${log_dir}/logback.log</file>
<!-- 配置日志输出到文件的格式-->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
</appender>
<!-- 配置日志为html类型输出到文件的appender -->
<appender name="fileHtmlAppender" class="ch.qos.logback.core.FileAppender">
<!-- 日志文件保存路径(log日志文件不用存在,会自动生成) -->
<file>${log_dir}/logback.html</file>
<!-- html消息格式设置-->
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="ch.qos.logback.classic.html.HTMLLayout">
<pattern>%level%d{yyyy-MM-dd HH:mm:ss}%c%M%L%thread%m%n</pattern>
</layout>
</encoder>
</appender>
<!-- 3.配置RootLogger属性(所有未指定父元素logger对象的父对象,默认继承父对象所有属性) -->
<root level="ALL">
<appender-ref ref="myConsole" />
<appender-ref ref="fileAppender" />
<appender-ref ref="fileHtmlAppender" />
</root>
</configuration>
2. 测试案例输出结果
3. 查看文件路径
4. 打开logback.html文件,详细的内容将以table表格形式展示
➳ 结论:本质上html格式的日志文件也是FileAppender,默认输出格式是PatternLayoutEncoder,为了让日志文件增加可读性,可以配置其<layout>标签为HTMLLayout格式即可
logback的拆分Appender
按照一定的规则将一个日志文件拆分成多个
使用FileAppender将日志输出到文件时,所有的日志消息都输入到同一个日志文件当中,随着系统运行,日志文件会滚雪球一样越来越大,就容易造成文件难以维护和管理。那么我们希望是能够按照一定的规则进行拆分,如果拆分的内容还是很大,则进行归档和压缩处理
▎文件归档
按照年月日和文件大小进行日志文件归档
1. 配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<!-- 配置集中管理属性
作用:如果其他标签要使用,可以直接通过表达式来引用:${property的name值}-->
<!-- 1.配置日志的输出格式,name:自定义名称 value:具体格式值 -->
<property name="pattern" value="[%-5level] %d{yyyy-MM-dd HH:mm:ss} %c %M %L %thread %m %n"/>
<!-- 配置日志文件保存的目录:路径必须存在,否则报错-->
<property name="log_dir" value="/Users/wpf01137679/log" />
<!-- 2.配置日志拆分和归档压缩的appender:RollingFileAppender -->
<appender name="rollAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 日志文件保存路径(log日志文件不用存在,会自动生成) -->
<file>${log_dir}/roll_logback.log</file>
<!-- 日志消息格式配置-->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
<!-- 指定拆分规则 -->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 按照时间和压缩格式拆分的文件名 -->
<!-- %d{yyyy-MM-dd}表示文件名以当前日期来命名 年-月-日 -->
<!-- %i表示当文件大小超出maxFileSize值,文件名按序号自动增长 -->
<fileNamePattern>${log_dir}/rolling.%d{yyyy-MM-dd}.log%i</fileNamePattern>
<!-- 按照文件大小进行拆分 -->
<maxFileSize>1MB</maxFileSize>
</rollingPolicy>
</appender>
<!-- 3.配置RootLogger属性(所有未指定父元素logger对象的父对象,默认继承父对象所有属性) -->
<root level="ALL">
<appender-ref ref="rollAppender" />
</root>
</configuration>
RollingFileAppender,该appender对象也是继承FileAppender的,因此配置方式大差不差,在此基础上我们再配置一个<rollingPolicy>标签属性即可,主要是拆分的规则
2. 测试用例如下:for循环多输出点日志,让日志大小超出我们设置的1MB
public class Demo {
public static final Logger logger = LoggerFactory.getLogger(Demo.class);
@Test
public void testQuick(){
for (int i = 0; i < 10000; i++) {
logger.error("hello error");
logger.warn("hello warn");
logger.info("hello info");
logger.debug("hello debug");
logger.trace("hello trace");
}
}
}
3. 测试结果:查看生成的日志文件
生成的文件大小差不多是1mb,超出会创建新的文件,而不是日志消息都放在同一个日志文件中,日志文件名称也是按照我们配置的: rolling.年-月-日.log序号 格式。日期和maxSize都没有超出才不会生成新文件
注意:roll_logback.log永远存放的是后面产生的日志,不足以生成新文件的日志内容,假设日志是350条,log01存放的是0-100条的日志,log2存放的是100-200的... roll_logback.log存放的是剩下50条,也就是未超出maxSize的日志内容
▎文件压缩
生成环境可能每天生成的日志文件很多,那文件固然庞大,我们还可以将文件进行压缩处理
1. 在<fileNamePattern>标签设置文件名格式处,增加文件后缀
<!-- 文件名以.zip 结尾,还可以是gz等压缩格式-->
<fileNamePattern>${log_dir}/rolling.%d{yyyy-MM-dd}.log%i.zip</fileNamePattern>
2. 执行测试用例结果:超出maxSize设置的1MB的文件将会以zip格式进行压缩
3. 解压后的文件大小差不多都是1mb左右
▎特别标签说明
<rollingPolicy>标签是 RollingFileAppender 类的成员变量,意指设置拆分规则项
<rollingPolicy>标签的class值是 SizeAndTimeBasedRollingPolicy,它是rollingPolicy的实现类,我们的诉求是按照指定的时间和大小进行拆分,因此选择它
<fileNamePattern> 标签是SizeAndTimeBasedRollingPolicy类的成员变量属性
而<maxFileSize>标签是SizeAndTimeBasedRollingPolicy父类的父类中的属性,格式化文件名
xml中的标签都是相关类中的成员变量,而不是自己瞎设置的
logback的过滤器(filter)
可以给每个appender指定一个过滤器,来进行更加细粒度的筛选功能
当我们需要对日志的打印要做一些范围的控制的时候,通常都是通过为各个Appender设置不同的Filter配置来实现。在Logback中自带了两个过滤器实现:
- LevelFilter
- ThresholdFilter
假设有如下appender配置,为其增加一个LevelFilter类型的过滤器
<!-- 配置集中管理属性
作用:如果其他标签要使用,可以直接通过表达式来引用:${property的name值}-->
<property name="pattern" value="[%-5level] %d{yyyy-MM-dd HH:mm:ss} %c %M %L %thread %m %n"/>
<!-- 配置控制台输出的appender, name:自定义appender名称 class:appender类型-->
<appender name="myConsole" class="ch.qos.logback.core.ConsoleAppender">
<!-- 日志消息的格式-->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
<!-- 过滤器 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level> <!-- 日志级别error -->
<onMatch>ACCEPT</onMatch> <!-- 放行 -->
<onMismatch>DENY</onMismatch> <!-- 拦截 -->
</filter>
</appender>
测试用例执行结果:error日志级别的消息内容就会放行在控制台输出,否则就拦截
通过定义日志级别,并设置匹配与不匹配的处理策略来控制针对某个级别日志的输出策略。当我们要设置多个不同级别的日志策略时,通过LevelFilter,我们就要定义多个filter来控制才能实现。
显然不是很方便,那么我们可以使用ThresholdFilter过滤器来控制。比如下面的配置,实现了只记录WARN及以上级别的控制,比WARN级别低(如:INFO、DEBUG、TRACE)都不会记录。
<!-- ThresholdFilter:低于WARN日志级别的日志将会拦截 -->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>WARN</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
异步日志(AsyncAppender)
异步记录日志。
目前所有的日志记录方式采用的都是同步的方式,即直接将日志写入文件。默认的同步日志是跟主线程一起执行的,也就是说日志记录完毕之后,才会执行后面的代码。
在一定程度上会造成性能延迟,尤其在写入文件、集中式日志处理系统(ELK)等场景中。
☛ 配置示例
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<!-- 配置集中管理属性
作用:如果其他标签要使用,可以直接通过表达式来引用:${property的name值}-->
<!-- 1.配置日志的输出格式,name:自定义名称 value:具体格式值 -->
<property name="pattern" value="[%-5level] %d{yyyy-MM-dd HH:mm:ss} %c %M %L %thread %m %n"/>
<!-- 配置日志文件保存的目录:路径必须存在,否则报错-->
<property name="log_dir" value="/Users/wpf01137679/log" />
<!-- 配置日志输出到文件的appender:FileAppender -->
<appender name="fileAppender" class="ch.qos.logback.core.FileAppender">
<!-- 日志文件保存路径(log日志文件不用存在,会自动生成) -->
<file>${log_dir}/logback.log</file>
<!-- 配置日志输出到文件的格式-->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
</appender>
<!-- 异步日志 -->
<appender name ="async" class= "ch.qos.logback.classic.AsyncAppender">
<!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
<discardingThreshold >0</discardingThreshold>
<!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
<queueSize>512</queueSize>
<!-- 指定某个具体的appender,最多只能添加一个 -->
<appender-ref ref ="fileAppender"/>
</appender>
<!-- 3.配置RootLogger属性 -->
<root level="ALL">
<appender-ref ref="async" />
</root>
</configuration>
✦ 说明:上述定义了两个appender:输出到文件FileAppender、异步日志AsyncAppender,其中AsyncAppender并不是单独的配置,而是使用某个具体的appender对象
AsyncAppender常用的几个属性配置信息:
属性名 | 类型 | 描述 |
queueSize | int | BlockingQueue的最大容量,默认情况下,大小为256。 |
discardingThreshold | int | 默认情况下,当BlockingQueue高于阈值时(80%),会丢弃ERROR以下的级别的日志,如果不希望丢弃日志(日志全量保存),则设置为0。 如正常日志可以丢弃,那可以极大的提升性能,并保存关键的error日志。 |
includeCallerData | boolean | 提取调用者数据的代价是相当昂贵的。为了提升性能,默认情况下,当event被加入到queue时,event关联的调用者数据不会被提取。默认情况下,只有"cheap"的数据,如线程名。 |
▎工作原理
AsyncAppender并不处理日志,只是将日志写入BlockingQueue中,并在内部创建一个工作线程从队列头部获取日志,交给对应的appender进行后面的日志推送,从而达到不阻塞主线程的效果。
AsyncAppender只是提供一种异步方式,写入日志还需其它具体的 Appender 执行,如 FileAppender、RollingFileAppender 等。
日志进入到BlockingQueue前,会先判断当前队列容量以及丢弃日志特性是否开启,当消费能力不如生产能力时,队列容量高于80%时将error以下级别的日志进行丢弃,作为防止队列溢出处理的一种方案
注意事项
由于使用了BlockingQueue来缓存日志,可能会出现队列满的情况。AsyncAppender会做出一些处理:默认情况下如果队列已满80%,AsyncAppender将丢弃error以下级别的日志以此为代价。
自定义logger对象
logger对象默认继承RootLogger,为了方便后期的灵活指定,我们可以自定义logger对象设置自己的日志级别等相关属性
配置代码如下
<root level="ALL">
<appender-ref ref="myConsole" />
</root>
<!-- 自定义logger 对象,additivity:是否继承父元素RootLogger的属性配置-->
<logger name="Test01" level="info" additivity="false">
<appender-ref ref="myConsole" />
</logger>
上述配置了名为“Test01”的logger对象,其日志级别是info,根对象root的日志级别是all
2. 测试用例如下
package Test01;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Demo {
public static final Logger logger = LoggerFactory.getLogger(Demo.class);
@Test
public void testQuick2(){
logger.error("hello error");
logger.warn("hello warn");
logger.info("hello info");
logger.debug("hello debug");
logger.trace("hello trace");
}
}
3. 执行结果
如上图所示,名为“Test01”的logger对象配置的是info级别的日志,由于名称敏感存在继承关系,因此名为“Test01.Demo"的logger对象将会继承Test01的这个对象,将不再继承root根对象的属性了,控制台只输出info级别以上的日志信息
配置文件转换器
logback提供了一个 log4j.properties配置文件自动转换为logback.xml 文件的转换器
logback.xml 配置文件是通过标签块进行相关参数配置,学习了log4j的朋友可能知道,这两者的配置文件还是有很多差异化,为了解决这一问题,logback官方提供了一个转换器,将之前的log4j配置信息实现一个转换的功能
logback官网:Logback Home
1. 进入logback 官网,找到translator菜单项
2. 进入转换器页后,我们只需要将log4j.properties配置文件的内容粘贴到下方文本区域,logback转换器会为我们自动转换成logback.xml格式的配置参数
比如,下面一份标准的log4j.properties 配置文件,设置了root根对象和自定义logger对象,包括三个appender输出端
# 设置rootLogger的日志级别为trace,appender处理器类型为ConsoleAppender
log4j.rootLogger = trace,consoleAppender
# 自定义logger对象的日志级别以及输出位置(logger对象的名称为:com.Log4j,一般设置类的所在package)
log4j.logger.com.Log4j = info,fileAppender
# ---------------------------设置ConsoleAppender-------------------------
# "log4j.appender." 是前缀规范设置参数,myAppender是我们自己定义的appender的名称
# 设置appender类型为ConsoleAppender:将日志输出到控制台
log4j.appender.consoleAppender = org.apache.log4j.ConsoleAppender
# 设置名为myAppender的appender处理器的layout日志格式化类型
log4j.appender.consoleAppender.layout = org.apache.log4j.PatternLayout
# 指定日志消息的内容格式
log4j.appender.consoleAppender.layout.conversionPattern = [%p] %r %l %d{yyyy-MM-dd HH:mm:ss} %m%n
# ---------------------------设置FileAppender-------------------------
# 日志文件输出的Appender对象
log4j.appender.fileAppender = org.apache.log4j.FileAppender
# 指定消息格式 layout
log4j.appender.fileAppender.layout = org.apache.log4j.SimpleLayout
# 指定文件保存路径
log4j.appender.fileAppender.file = /Users/wpf011/log/log4j.log
# 指定文件的字符编码集
log4j.appender.fileAppender.encoding = UTF-8
复制内容到官网提供的转换器,进行翻译
翻译之后它会自动生成logback.xml格式的相关参数配置
3. 转换之后的logback.xml配置文件如下
<configuration>
<!-- Errors were reported during translation. -->
<!-- Could not find transformer for org.apache.log4j.SimpleLayout -->
<appender name="fileAppender" class="ch.qos.logback.core.FileAppender">
<encoding>UTF-8</encoding>
<file>/Users/wpf011/log/log4j.log</file>
<layout class="org.apache.log4j.SimpleLayout"/>
</appender>
<appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>[%p] %r %l %d{yyyy-MM-dd HH:mm:ss} %m%n</pattern>
</encoder>
</appender>
<logger name="com.Log4j" level="info">
<appender-ref ref="fileAppender"/>
</logger>
<root level="trace">
<appender-ref ref="consoleAppender"/>
</root>
</configuration>
!! 注意点:日志输出的表达式<pattern>里的内容还是log4j的,logback是在原有功能上进行升级,比如 %l 在logback中是没有的,我们需要修改为logback里支持的表达式