一、logback说明
Logback本质上是一个优化后的Log4j,但相比于Log4j有太多的优点。
1.更快的实施:Logback重写了Log4j内部实现,在关键路径提升了十倍速度,减少了内存损耗。
2.更广泛的测试:Logback比Log4j进行了更长时间、更高级别的测试。
与SLF4J的完美结合.
3.更广泛的文档:Logback具有更详细并且不断更新的文档。
4.Logback从0.9.22版本开始同时支持XML与Groovy语法的配置文件。
5.Logback可以自动扫描并加载修改后的配置文件,并且不启用新的线程资源。
6.Logback在I/O失败的情况下,不需要重新应用即可在server正常后恢复正常输出。
7.Logback通过对于maxHistory属性的设置可以自动删除旧的日志文件。
8.Logback的RollingFileAppender可以异步的对旧的日志文档进行压缩。
9.Logback的谨慎模式下多个FileAppender可以写入同一个日志文件。
10.Logback具有Lilith可以查看大数据量级的日志与访问事件查看器工具。
11.Logback配置文件中支持条件判断语句的写法,从而实现不同环境个别配置自动替换。
12.Logback中支持对于特定用户显示较低与配置日志等级的日志。
13.Logback提供了可以通过给定的属性对日志进行分离的SiftingAppender
14.Logback的异常堆栈信息将会打印出相应包的信息。
15.Logback的Logback-access提供了HTTP访问日志功能。
二、配置文件和引入
与Log4j相同,其首先会在classpath下搜寻配置文件,但在搜寻不到的情况下Logback会自动调用BasicConfigurator默认配置,输出到控制台。
<!-- logback-core -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
<!-- 引入logback对SLF4J的实现 logback-classic -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
<scope>compile</scope>
</dependency>
<!-- 引入SLF4J -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.26</version>
</dependency>
在resources下创建logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--
scan属性:默认为true,Logback将会扫描配置文件,如果配置文件发生改变时,会自动加载
scanPeriod:Logback扫描配置文件时间间隔,默认单位为毫秒,可配置单位为毫秒、秒、分、时 milliseconds, seconds, minutes or hours
debug:默认为false,是否打印Logback内部信息,当为true时可以查看Logback的运行信息
packagingData:默认false,在打印异常堆栈时是否打印相关包信息
-->
<configuration scan="true" scanPeriod="30 seconds" >
<!-- 定义参数变量 -->
<property name="log.dir" value="appLogs"/>
<property name="encoding" value="UTF-8"/>
<property name="normal-pattern" value="%d{yyyy-MM-dd.HH:mm:ss} %-5level [%thread] %logger.%M:%L %msg%n"/>
<property name="plain-pattern" value="%d{yyyy-MM-dd.HH:mm:ss} %msg%n"/>
<property name="common-pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %p [%c{50}#%M:%L] [%X{traceId}] %m%n"/>
<!-- consoleAppender:控制台输出 -->
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
<!-- encoder:对日志日期格式化,类似于layout,除了将时间转化为数组,还会将转换后的数组输出到相应的文件中 -->
<encoder charset="UTF-8">
<!-- 定义日志的输出格式 -->
<pattern>${common-pattern}</pattern>
</encoder>
</appender>
<!-- 文件输出策略设置 -->
<appender name="mainlog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 过滤器,过滤掉不是指定日志水平的日志 -->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<!-- 文件路径 -->
<file>${log.dir}/main.log</file>
<!--当为true时,不支持FixedWindowRollingPolicy。支持TimeBasedRollingPolicy,但是有两个限制,1不支持也不允许文件压缩,2不能设置file属性,必须留空。日志会被安全的写入文件,即使其他的FileAppender也在向此文件做写入操作,效率低。-->
<prudent>false</prudent>
<encoder charset="UTF-8">
<pattern>${common-pattern}</pattern>
</encoder>
<!--配置日志所生成的目录以及生成文件名的规则-->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 设置文件名称 当前日志为每个小时做一次历史日志压缩文件保存 -->
<fileNamePattern>${log.dir}/main.%d{yyyy-MM-dd-HH}-%i.log.gz</fileNamePattern>
<!--文件达到 最大值时会被压缩和切割 当单个文件大于100M后,会创建下一个文件(%i参数) -->
<maxFileSize>100MB</maxFileSize>
</rollingPolicy>
</appender>
<!-- 文件输出策略设置 -->
<appender name="errorlog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 过滤器,过滤掉不是指定日志水平的日志 -->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<file>${log.dir}/errors.log</file>
<prudent>false</prudent>
<encoder charset="UTF-8">
<pattern>${common-pattern}</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${log.dir}/error.%d{yyyy-MM-dd-HH}-%i.log.gz</fileNamePattern>
<maxFileSize>100MB</maxFileSize>
</rollingPolicy>
</appender>
<!-- 子节点logger:用来设置某一个包或具体的某一个类的日志打印级别、以及指定Appender -->
<!--
name:指定此logger管理的包或者类
level:指定此logger的消息输出级别
additivity:默认为true,是否向上级logger传递消息
-->
<logger name="com.example.service.*" level="ERROR" additivity="false">
<appender-ref ref="errorlog" />
</logger>
<!-- 根Logger节点,最顶级 代表所有的类-->
<root level="ERROR">
<appender-ref ref="errorlog"/>
<appender-ref ref="stdout"/>
</root>
<root level="INFO">
<appender-ref ref="mainlog"/>
</root>
</configuration>
三、代码
package com.example.service;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
@Service
public class AdminService {
//创建日志对象
private final Logger logger = LoggerFactory.getLogger(AdminService.class);
public void doSomething() {
String msg = "内容";
//用占位符做日志处理
("这是日志{}",msg);
}
}