目录
1. 什么是Logback?
记录日志的工具,包含三个模块:
- logback-core:是其他两个模块的基础模块,提供了Logback的核心功能
- logback-classic:它是一个完整的SLF4J API实现,使得可以方便地更换成其他日志系统,如log4j或JDK14 Logging
- logback-access:该模块与Servlet容器集成,提供通过Http来访问日志的功能
2. LogBack基本使用
2.1 导入jar包
2.2 编写XML配置文件
注意:一定要放在src目录下
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
<property name="LOG_HOME" value="D:\\repo\\javasepro\\special-file\\logs" />
<!-- 控制台输出:appender:控制日志的输出位置 CONSOLE:表示日志要输出到控制台 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<!-- 日志打印到控制台 -->
<target>System.out</target>
<!--
格式化输出:
%d:表示日期
%thread:线程名
%-5level:级别从左显示5个字符宽度
%msg:日志消息
%n:换行
-->
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %c [%thread] : %msg%n</pattern>
</encoder>
</appender>
<!-- 文件输出 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 格式化输出 -->
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{100} - %msg%n</pattern>
<charset>utf-8</charset>
</encoder>
<!-- 文件日志输出位置 -->
<file>${LOG_HOME}\ming-data.log</file>
<!-- 指定日志文件拆分和压缩规则 -->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 通过指定压缩文件名称,来确定分割文件方式 %i 指的是索引-->
<fileNamePattern>${LOG_HOME}\ming-data-%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<!-- 日志文件保留天数 -->
<MaxHistory>5</MaxHistory>
<!-- 日志文件最大尺寸 -->
<maxFileSize>10MB</maxFileSize>
</rollingPolicy>
</appender>
<!-- 控制日志的输出情况:如开启日志、取消日志 -->
<root level="ALL">
<!-- 输出控制台 -->
<appender-ref ref="CONSOLE" />
<!-- 输出到文件 -->
<appender-ref ref="FILE" />
</root>
</configuration>
2.3 测试
public class logbackTest1 {
// 创建一个Logger日志对象
public static final Logger LOGGER = LoggerFactory.getLogger("logbackTest1");
public static void main(String[] args) {
try {
// 输出基本信息
LOGGER.info("------ 除法开始执行 ------");
chu(10, 0);
LOGGER.info("------ 除法执行成功 ------");
} catch (Exception e) {
// 输出错误信息
LOGGER.error("------ 除法执行失败 ------");
LOGGER.error(e.toString());
}
}
private static void chu(int a, int b) {
// 输出参数信息
LOGGER.debug("参数a:" + a);
LOGGER.debug("参数b:" + b);
int c = a / b;
LOGGER.info("计算结果:" + c);
}
}
3. 日志级别
日志级别指的是日志信息的类型,日志都会分级别,依次从低到高如下。
日志级别 | 说明 |
---|---|
trace | 追踪,指明程序的运行轨迹 |
debug | 调试,实际应用中一般将其作为最低级别,而trace则很少使用 |
info | 输出重要的运行信息,数据连接、网络连接、IO操作等等,使用的较多 |
warn | 警告信息,可能会发生问题,使用较多 |
error | 错误信息,使用较多 |
为什么要学习日志级别?
用于对控制台以及文件输出进行控制。
<root level="info">
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE" />
</root>
只有日志的级别是大于等于核心配置文件配置的日志级别,才会被记录,否则不记录。
4. 更加详细的logback.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
<property name="LOG_HOME" value="D:\\repo\\javasepro\\special-file\\logs\\wcs_printer" />
<!-- 控制台输出 -->
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!-- 1格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>utf-8</charset>
</encoder>
<!--临界值日志过滤级别配置 -->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<!-- 1在日志级别的基础上过滤掉trace级别以下的日志 -->
<level>trace</level>
</filter>
</appender>
<!-- trace级别,按照每天生成日志文件 -->
<appender name="trace" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--只保留固定配置级别的日志 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>trace</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 之前的 rollingPolicy和triggeringPolicy冲突了 用一个新的标签 结合两者 -->
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}\trace-log-%d{yyyy-MM-dd}.%i.log</FileNamePattern>
<!-- 日志文件保留天数 -->
<MaxHistory>5</MaxHistory>
<!-- 日志文件最大尺寸 -->
<maxFileSize>10MB</maxFileSize>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>utf-8</charset>
</encoder>
</appender>
<!-- debug级别,按照每天生成日志文件 -->
<appender name="debug" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--只保留固定配置级别的日志 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>debug</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 之前的 rollingPolicy和triggeringPolicy冲突了 用一个新的标签 结合两者 -->
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}\debug-log-%d{yyyy-MM-dd}.%i.log</FileNamePattern>
<!-- 日志文件保留天数 -->
<MaxHistory>5</MaxHistory>
<!-- 日志文件最大尺寸 -->
<maxFileSize>10MB</maxFileSize>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>utf-8</charset>
</encoder>
</appender>
<!-- info级别,按照每天生成日志文件 -->
<appender name="info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--只保留固定配置级别的日志 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>info</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 之前的 rollingPolicy和triggeringPolicy冲突了 用一个新的标签 结合两者 -->
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}\info-log-%d{yyyy-MM-dd}.%i.log</FileNamePattern>
<!-- 日志文件保留天数 -->
<MaxHistory>5</MaxHistory>
<!-- 日志文件最大尺寸 -->
<maxFileSize>10MB</maxFileSize>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>utf-8</charset>
</encoder>
</appender>
<!-- warn级别,按照每天生成日志文件 -->
<appender name="warn" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--只保留固定配置级别的日志 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>warn</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 之前的 rollingPolicy和triggeringPolicy冲突了 用一个新的标签 结合两者 -->
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}\warn-log-%d{yyyy-MM-dd}.%i.log</FileNamePattern>
<!-- 日志文件保留天数 -->
<MaxHistory>5</MaxHistory>
<!-- 日志文件最大尺寸 -->
<maxFileSize>10MB</maxFileSize>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>utf-8</charset>
</encoder>
</appender>
<!-- error级别,按照每天生成日志文件 -->
<appender name="error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--只保留固定配置级别的日志 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>error</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 之前的 rollingPolicy和triggeringPolicy冲突了 用一个新的标签 结合两者 -->
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}\error-log-%d{yyyy-MM-dd}.%i.log</FileNamePattern>
<!-- 日志文件保留天数 -->
<MaxHistory>5</MaxHistory>
<!-- 日志文件最大尺寸 -->
<maxFileSize>10MB</maxFileSize>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>utf-8</charset>
</encoder>
</appender>
<!-- 日志级别排序为: TRACE < DEBUG < INFO < WARN < ERROR -->
<!-- 日志输出级别 -->
<root level="trace">
<appender-ref ref="stdout" />
<appender-ref ref="trace" />
<appender-ref ref="debug" />
<appender-ref ref="info" />
<appender-ref ref="warn" />
<appender-ref ref="error" />
</root>
</configuration>