logback.xml 是一个用于配置日志记录器的文件,它是 Logback 日志框架的配置文件。通过 logback.xml 文件,可以配置日志的输出格式、日志级别、日志文件路径等信息。在 Java 应用程序中,Logback 是一个常用的日志框架,它可以帮助开发人员记录应用程序中的各种事件和错误信息,以便于问题的排查和调试。logback.xml 日志配置文件中的配置项包括:
配置项 | 描述 |
---|---|
|
根标签,所有的配置都在该标签内进行 |
|
定义日志输出的目的地,可以配置控制台输出、文件输出等 |
|
定义日志记录器,指定日志输出的级别、输出目的地等 |
|
根日志记录器,即全局日志配置,用于定义默认的日志输出级别和输出目的地 |
|
指定日志输出的格式,可以自定义输出格式 |
指定日志输出的格式,样例如下:
<pattern>%red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{36}%n) - %msg%npattern>
常用占位符如下:
占位符 | 描述 |
---|---|
%d |
表示输出到毫秒的时间,例如%d{yyyy-MM-dd HH:mm:ss.SSS} |
%-5level |
输出日志级别,-5表示左对齐并且固定输出5个字符,如果不足在右边补0 |
%n |
输出换行符 |
%thread |
输出日志的线程名称,例如:main |
%logger |
输出日志记录器名称,例如:com.example.MyClass |
%msg |
输出日志的消息内容 |
%X |
输出 MDC(Mapped Diagnostic Context)中的键值对,例如:%X{user} |
%class |
输出日志的类名,例如:com.example.MyClass |
%method |
输出日志的方法名,例如:doSomething |
%file |
输出日志的文件名,例如:MyClass.java |
%line |
例如:10 |
%color() | 颜色:%black、%shired、%green、%yellow、%blue、%magenta、%cyan、%white、%gray、%boldRed、%boldGreen、%boldYellow、%boldBlue、%boldMagenta、%boldCyan、%boldWhite、%highlight |
以上是一些常用的占位符,可以根据需要自行组合使用。
Logback 的Appender 是用来定义日志输出的目的地。它可以向控制台、文件、数据库等不同的目的地输出日志。例如,ConsoleAppender 用来输出日志到控制台,FileAppender 用来输出日志到一个文件中,SMTPAppender 用来将日志以电子邮件的形式发送出去,等等。
在 Logback 中,可以使用多个 Appender 来输出同一条日志到不同的目的地,也可以为每个 Logger 都设置不同的 Appender,实现不同的输出效果。Appender 是 Logback 中比较重要的一个组件,通过灵活的配置,可以实现各种复杂的日志输出方式。
附加器 | 描述 |
---|---|
ConsoleAppender |
将日志输出到控制台 |
FileAppender |
将日志输出到指定文件 |
RollingFileAppender |
将日志输出到滚动的文件中,可以设置滚动的方式和文件大小 |
SocketAppender |
将日志输出到远程的日志服务器 |
SMTPAppender |
将日志以邮件的形式发送给指定的收件人 |
DBAppender |
将日志输出到数据库中 |
SyslogAppender |
将日志输出到 Syslog 服务器 |
Logback的ConsoleAppender用于将日志输出到控制台。它可以配置在logback.xml 或 logback-spring.xml 文件中。以下是 ConsoleAppender 的配置示例:
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} %-5level %logger{36} - %msg%npattern>
encoder>
appender>
解析:
name
: Appender 的名称,可自定义。class
: 指定 Appender 的类,这里是 ConsoleAppender。encoder
: Encoder 用于将日志事件转换为输出字符串的格式,可以根据需要自定义。pattern
: 输出格式,这里使用了时间戳、日志级别、Logger 名称、消息文本等信息。Logback 的 FileAppender 可以将日志输出到文件中。以下是一个简单的 FileAppender 的配置示例:
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>/logs/file.logfile>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%npattern>
encoder>
appender>
在上面的配置中,我们创建了一个名为 FILE 的 FileAppender。
:元素指定了日志文件的路径和名称。
:元素定义了将日志转换为字符串的方式。在这个示例中,我们使用了一个简单的模式:时间戳、线程名、日志级别、日志记录器名称和日志消息。RollingFileAppender 是 Logback 中常用的日志输出组件之一,可以按照一定的条件对日志文件进行滚动输出。以下是 RollingFileAppender 的配置示例:
<appender name="RollingFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/myapp.logfile>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>logs/%d{yyyy-MM-dd}.%i.logfileNamePattern>
<maxFileSize>10MBmaxFileSize>
<maxHistory>7maxHistory>
rollingPolicy>
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%npattern>
encoder>
appender>
其中,上述配置的含义如下:
配置项 | 说明 |
name | Appender 的名称,必须唯一 |
class | Appender 的类名,对应的类名为 ch.qos.logback.core.rolling.RollingFileAppender |
file | 默认日志输出的路径 |
rollingPolicy | 滚动策略,控制日志文件的滚动方式 |
encoder | 控制日志往文件里的输出格式 |
Logback 提供的控制日志文件的滚动方式如下:
滚动策略 | 属性 | 说明 |
TimeBasedRollingPolicy |
|
按时间来滚动日志文件,可以指定时间间隔、文件名模式等 |
SizeAndTimeBasedRollingPolicy |
|
基于时间和文件大小来滚动日志文件,可以指定时间间隔、文件大小等 |
Logback 的 SMTPAppender 允许日志信息以电子邮件形式发送。以下是 SMTPAppender 的配置示例:
<springProperty scope="context" name="user.host" source="spring.mail.host" defaultValue="smtp.qq.com"/>
<springProperty scope="context" name="user.email" source="spring.mail.username"/>
<springProperty scope="context" name="user.email.password" source="spring.mail.password"/>
<appender name="QQEMAIL" class="ch.qos.logback.classic.net.SMTPAppender">
<smtpHost>${user.host}smtpHost>
<smtpPort>465smtpPort>
<username>${user.email}username>
<password>${user.email.password}password>
<SSL>trueSSL>
<asynchronousSending>trueasynchronousSending>
<to>${user.email}to>
<from>${user.email}from>
<subject>【Error】:%logger{0}subject>
<charsetEncoding>UTF-8charsetEncoding>
<cyclicBufferTracker class="ch.qos.logback.core.spi.CyclicBufferTracker">
<bufferSize>10bufferSize>
cyclicBufferTracker>
<layout class="ch.qos.logback.classic.html.HTMLLayout" />
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERRORlevel>
filter>
appender>
解释一下 SMTPAppender 的配置参数:
配置项 | 说明 |
---|---|
name |
SMTPAppender的名称 |
class |
SMTPAppender的类名 |
smtpHost |
SMTP服务器主机名 |
smtpPort |
SMTP服务器端口号 |
STARTTLS |
是否启用TLS |
username |
SMTP服务器的用户名 |
password |
SMTP服务器的密码 |
to |
接收日志邮件的邮箱地址 |
from |
发件人的邮箱地址 |
subject |
邮件主题 |
layout |
日志输出格式 |
cyclicBufferTracker |
防止日志过多,可以设置日志的缓冲大小,超过指定数量时将会自动删除旧的日志 |
filter |
日志过滤条件,只有满足条件的日志才会被发送邮件 |
要使用 Logback 的 DBAppender,需要更改 Logback 的配置文件以引入 DBAppender,并配置连接数据库的相关参数。
以下是一个简单的 Logback 配置文件示例,使用 MySQ 作为数据库:
<appender name="MYSQL" class="ch.qos.logback.classic.db.DBAppender">
<connectionSource class="ch.qos.logback.core.db.DriverManagerConnectionSource">
<driverClass>com.mysql.cj.jdbc.DriverdriverClass>
<url>jdbc:mysql://localhost:3306/test?characterEncoding=UTF-8url>
<user>rootuser>
<password>rootpassword>
connectionSource>
appender>
参数如下:
配置项 | 说明 |
---|---|
name |
DBAppender 的名称 |
class |
DBAppender 的类名 |
connectionSource |
存储源 |
connectionSource.class |
DriverManagerConnectionSource 类,用于在运行时从 DriverManager 获取数据库连接 |
connectionSource.driverClass |
数据库驱动类 |
connectionSource.url |
数据库 Url |
connectionSource.user |
数据库用户名 |
connectionSource.password |
数据库密码 |
Logback 中的 Logger 是一种记录日志的对象,其作用是在程序运行时记录日志信息,它可以将日志记录到文件、控制台或其他目标。Logger 是 Logback中最基本的组件,它把日志信息传递给 Logback 框架。Logger 有多个级别,从高到低分别是TRACE、DEBUG、INFO、WARN和ERROR,表示打印日志的不同程度。使用 Logger 可以对不同级别的日志进行控制和分离,方便开发人员在不同场景下进行调试和查看日志信息。同时,Logger 还可以通过添加 Appender 来控制日志信息的输出目标,比如输出到控制台或文件。
一个简单的样例如下:
<logger name="com.example" level="DEBUG">
<appender-ref ref="CONSOLE" />
logger>
Logger 的配置项如下:
配置项 | 说明 |
---|---|
name | 用于唯一标识一个 Logger 实例。通过设置 logger 的 name 属性,可以根据不同的 logger 名称来区分不同的日志记录器,从而实现更细粒度的日志记录 |
level | Logger 的日志级别,可用的取值包括 TRACE、DEBUG、INFO、WARN、ERROR和OFF |
additivity | 是否继承父Logger的日志输出,默认为 true |
appender-ref | 指定要使用的 Appender,这里是 CONSOLE。多个 Appender 可以用逗号分隔,可以关联多个 Appender |
在 Logback 中,root 是指最高级别的 Logger,它是所有 Logger 的父 Logger。所有未被其他日志记录器匹配的日志事件都会由 root Logger 处理。可以通过设置 root 的日志级别和输出目的地来控制应用程序的整个日志记录。
在配置文件中,可以使用“”标签来定义root Logger的属性和行为。例如,以下是一个配置文件中root Logger的定义:
<configuration>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%npattern>
encoder>
appender>
<root level="info">
<appender-ref ref="CONSOLE" />
root>
configuration>
过滤器是附加器的一个组件,它用于决定附加器是否输出日志。一个附加器可以包含一个或多个过滤器。每个过滤器部会返回一个枚举值:DENY、NEUTRAL、ACCEPT。附加器根据过滤器返回值判断是否输出日志:
Logback 过滤器是一种可插拔的模块,可以在记录日志消息之前或之后以编程的方式更改或过滤消息。Logback 提供了多个预定义过滤器,常用过滤器如下:
过滤器 | 说明 |
LevelFilter | 级别过滤器:根据日志级别过滤,只接受指定级别的事件 |
ThresholdFilter | 阈值过滤器:根据日志级别过滤,只接受大于等于指定级别的事件 |
EvaluatorFilter | 求值过滤器:评估、鉴别日志是否符合指定条件 |
MarkerFilter | 根据一个标记来过滤日志,例如根据日志中的异常类型来过滤 |
TimeFilter | 根据时间范围来过滤日志 |
TurboFilter | 可以在运行时修改Logback的配置,例如动态地修改日志级别 |
RegexFilter | 根据一个正则表达式来过滤日志 |
LevelFilter是级别过滤器,根据日志级别进行过滤。如果日志级别等于配置级别,过滤器会根据 onMath 和 onMismatch 接收或拒绝日志。以下是一个使用 LevelFilter 过滤器的样例:
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg%npattern>
encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFOlevel>
<onMatch>ACCEPTonMatch>
<onMismatch>DENYonMismatch>
filter>
appender>
在此示例中,LevelFilter 过滤器用于仅记录 INFO 级别的消息。LevelFilter 的配置项如下:
配置项 | 说明 |
---|---|
level | 设置过滤级别 |
onMatch | 配置符合过滤条件的操作 |
onMismatch | 配置不符合过滤条件的操作 |
ThresholdFilter 是临界值过滤器,过滤掉低于指定临界值的日志。当日志级别等于或高于临界值时,过滤器返回 NEUTRAL;当日志级别低于临界值时,日志会被拒绝。
以下是一个基于logback的ThresholdFilter过滤器的样例:
<logger name="com.example" level="DEBUG" additivity="false">
<appender-ref ref="stdout" />
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFOlevel>
filter>
logger>
在这个样例中,我们定义了一个基于 ThresholdFilter 的过滤器,它会阻止 com.example 包下面的 DEBUG 级别的日志消息输出到控制台,只允许INFO级别和更高级别的日志消息通过,其他的日志消息将被过滤掉。
使用这个过滤器的方式非常简单。只需要在 Logback 的配置文件中,为指定 Logger 定义一个 ThresholdFilter ,并设置它的阈值级别即可。
以下是一个基于EvaluatorFilter
的示例:
<root level="DEBUG">
<appender-ref ref="STDOUT" />
<filter class="ch.qos.logback.classic.filter.EvaluatorFilter">
<evaluator>
<expression>return message.contains("error")expression>
evaluator>
<onMatch>DENYonMatch>
<onMismatch>NEUTRALonMismatch>
filter>
root>
在这个示例中,EvaluatorFilter
被用作根日志记录器的过滤器。它的 evaluator
子元素定义了一个表达式,该表达式自动返回一个布尔值,表示日志消息中是否包含“error”字符串。如果是,则过滤器的 onMatch
属性指示日志事件被拒绝。如果不是,则 onMismatch
属性指示日志事件将继续向下传递。最终,只有那些不包含“error”字符串的日志消息才会被输出到控制台,其他日志消息将被过滤掉。
通用配置样例如下:
<configuration>
<property name="log.path" value="logs"/>
<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n"/>
<property name="log.console.pattern" value="%red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{36}%n) - %msg%n"/>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${log.console.pattern}pattern>
encoder>
appender>
<appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/myapp-info.logfile>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${log.path}/info/%d{yyyy-MM-dd}.%i.logfileNamePattern>
<maxFileSize>100MBmaxFileSize>
<maxHistory>7maxHistory>
rollingPolicy>
<encoder>
<pattern>${log.pattern}pattern>
encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFOlevel>
<onMatch>ACCEPTonMatch>
<onMismatch>DENYonMismatch>
filter>
appender>
<appender name="DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/myapp-debug.logfile>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${log.path}/debug/%d{yyyy-MM-dd}.%i.logfileNamePattern>
<maxFileSize>100MBmaxFileSize>
<maxHistory>7maxHistory>
rollingPolicy>
<encoder>
<pattern>${log.pattern}pattern>
encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>DEBUGlevel>
<onMatch>ACCEPTonMatch>
<onMismatch>DENYonMismatch>
filter>
appender>
<appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/myapp-error.logfile>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${log.path}/error/%d{yyyy-MM-dd}.%i.logfileNamePattern>
<maxFileSize>100MBmaxFileSize>
<maxHistory>7maxHistory>
rollingPolicy>
<encoder>
<pattern>${log.pattern}pattern>
encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERRORlevel>
<onMatch>ACCEPTonMatch>
<onMismatch>DENYonMismatch>
filter>
appender>
<appender name="USER" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/myapp-user.logfile>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${log.path}/user/%d{yyyy-MM-dd}.%i.logfileNamePattern>
<maxFileSize>100MBmaxFileSize>
<maxHistory>7maxHistory>
rollingPolicy>
<encoder>
<pattern>${log.pattern}pattern>
encoder>
appender>
<root level="info">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="INFO"/>
<appender-ref ref="DEBUG"/>
<appender-ref ref="ERROR"/>
root>
<logger name="sys-user" level="info">
<appender-ref ref="USER"/>
logger>
configuration>