Logback的使⽤及如何配置
⽬录
1 为什么选⽤Logback?
2 Logback的配置
3 Logback的输出格式
4 Appender
5 Logback使⽤过程中遇到的问题
⽇志在项⽬开发过程的作⽤不⾔⽽喻,项⽬上线后,我们需要根据⽇志⽂件定位问题发⽣的位置以及产⽣的原因。以前在项⽬开发中,已经有前⼈在⼯程中配置过⽇志,所以完全不需要⾃⼰再进⾏⽇志的配置。这次在新的项⽬中⾃⼰来配置⽇志时,还是遇到了⼀些波折,下⾯慢慢道来。
1 为什么选⽤Logback?
⽬前,在Springboot⼯程体系中,使⽤较多的⽇志组件是Slf4j、Logback以及Log4j2。⽽Slf4j本⾝只是⼀
个接⼝类,具体的实现还是由Logback或Log4j2来完成的。由于Springboot⾃⾝就集成了Logback,默认使⽤的⽇志组件是Logback,Logback的体系结构具有⾜够的通⽤性,可以在不同的场景下使⽤。因此,在我们的DRS⼯程中,使⽤了Logback进⾏⽇志的打印。
⽬前,Logback包含三个部分:logback-core, logback-classic, logback-access。 Logback-core:为其他两个模块奠定了基础Logback-classic: 可以被同化为log4j的⼀个显著改进的版本,此外, logback-classic实现了slf4japi,因此您可以⽅便地在logback和其他⽇志框架(如log4j或log4j)之间来回切换java.util.logging⽂件 Logback-access: 集成了Servlet容器(如Tomcat和Jetty),以提供HTTP访问⽇志功能。
如果使⽤的是Springboot是2.4版本及以上,则不需要另外引⼊logback-core, logback-classic, logback-access和slf2j-api的依赖包的。
2 Logback的配置
⾸先,看⼀下我们在DRS⼯程中使⽤的Logback配置⽂件:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property name="log.path" value="/duan/drs-server/logs" />
<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />
<appender name="STDOUT" class="ch.ConsoleAppender">
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
</appender>
pattern属性<!-- 系统debug⽇志输出 -->
<appender name="FILE_DEBUG" class="ch.olling.RollingFileAppender">
<file>${log.path}/drs-server-debug.log</file>
<rollingPolicy class="ch.olling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/drs-server-debug.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>DEBUG</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 系统info⽇志输出 -->
<appender name="FILE_INFO" class="ch.olling.RollingFileAppender">
<file>${log.path}/drs-server-info.log</file>
<rollingPolicy class="ch.olling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/drs-server-info.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 系统warn⽇志输出 -->
<appender name="FILE_WARN" class="ch.olling.RollingFileAppender">
<file>${log.path}/drs-server-warn.log</file>
<rollingPolicy class="ch.olling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/drs-server-warn.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>WARN</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 系统error⽇志输出 -->
<appender name="FILE_ERROR" class="ch.olling.RollingFileAppender">
<file>${log.path}/drs-server-error.log</file>
<rollingPolicy class="ch.olling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/drs-server-error.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<logger name="com.nuonuo.middleware.drsserver" level="INFO" />
<logger name="org.springframework" level="warn" />
<root level="INFO">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE_DEBUG" />
<appender-ref ref="FILE_INFO" />
<appender-ref ref="FILE_WARN" />
<appender-ref ref="FILE_ERROR" />
</root>
</configuration>
说明:
属性说明
log.path定义⽇志⽂件的输出路径
log.pattern定义⽇志⽂件输出格式
appender定义了⽇志的输出⽂件,⽇志⽂件保留时长,使⽤何种模式输出,以及过滤规则。在上述⽂件中,分别针对DEBUG、INFO、WARN和ERROR⽇志进⾏了定义了四个Appender
logger⽤来设置某⼀个类或某个包的⽇志打印级别。在上述配置中,我们将DRS⼯程的⽇志输出级别定义为INFO,那么,如果只想打印出DRS⼯程中的⽇志,则只需将打印级别level设置为WARN
root是⼀个根logger,root下可以包含零个或多个appender。如果⼀个appender没有在root下引⼊,则不会⽣成对应的⽇志⽂件
3 Logback的输出格式
针对以上述配置中的格式进⾏说明:
%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n
字段说明
%d{HH:mm:ss.SSS}⽤于输出⽇志事件的⽇期,其中%d也可以替换成%date,该设置对应下图中的红⾊标记部分[%thread]输出对应的线程名。在上⾯的截图中可以看到,输出线程是主线程main
%-5level输出⽇志级别,其中-5表⽰如果记录器名称长度⼩于5个字符,则右键填充空格
%logger{20}输出⽇志事件起源处记录器的名称。其中20表⽰输出记录的名称长度限制,超过这个长度,记录器名将会进⾏缩写。但是,记录器名称中最右边的段从不缩写,即使其长度⽐“长度”选项长。其他段可以缩短到最多⼀个字符,但永远不会删除
[%method,%line]%method 输出发出⽇志记录请求的⽅法名称,%method也可替换成%M; %line——输出发出⽇志记录请求的⾏号,%line也可替换成%L
%msg输出应⽤程序提供的与⽇志事件关联的消息。其中%msg也可替换成%m或%message
%n输出平台相关的⾏分隔符字符
4 Appender
Appender⼦类包含Filter、Encoder、ConsoleAppender、FileAppender、以及RollingFileAppender。其类图关系如下所⽰。
顾名思义⽬标⽂件由file选项指定。如果该⽂件已存在,则根据append属性的值将其追加或截断。RollingFileAppender 扩展了FileAppender,具有滚动更新⽇志⽂件的功能。
类名encoder immediateFlush target withJansi append file prudent rollingPolicy triggeringPolicy OutputStreamAppender√√
ConsoleAppender√√√√
FileAppender√√--√√√
RollingFileAppender√√--√√√√√OutputStreamAppender 这个类提供了其他附加程序构建的基本服务。该类包含两个属性设置: encoder—— 确定⽇志写⼊的
编码格式。 immediateFlush——布尔值,默认为true,⽴即刷新输出流可确保⽴即写出⽇志事件,并且在应⽤程序退出⽽未正确关闭附加器时不会丢失这些事件。另⼀⽅⾯,将此属性设置为“false”可能会使⽇志吞吐量增加四倍。同样,如果immediateFlush设置为“false”,并且应⽤程序退出时appender未正确关闭,则尚未写⼊磁盘的⽇志事件可能会丢失。ConsoleAppender 将⽇志附加在控制台上,其包含三个属性: encoder——略 target—— System.out或者 字符串值之⼀默认⽬标是 System.out withJansi——布尔值,默认false。将withJansi设置为true将激活Jansi库,该库为Windows机器上的ANSI颜⾊代码提供⽀持。在Windows主机上,如果此属性设置为true,则应将⽹址:org.fusesource.jansi:jansi:
1.17“在类路径上进⾏设置。请注意,基于Unix的操作系统(如Linux和macosx)默认⽀持ANSI颜⾊代码。⼀般我们很少⽤到,使⽤默认值即可。
FileAppender 它将⽇志事件附加到⽂件中,其包含四个属性: append——布尔值,默认为true,表⽰事件附加在现有⽂件的末尾。如果append为false,则任何现有⽂件都将被截断。 encoder——略 file—— 要写⼊的⽂件的名称,如果⽂件不存在,则创建该⽂件。如果⽂件的⽗⽬录不存在,FileAppend
er将⾃动创建它,包括任何必要但不存在的⽗⽬录。 prudent——布尔值,默认值为false。如果设置为true, FileAppender将安全地写⼊指定的⽂件,即使存在运⾏在不同jvm(可能运⾏在不同主机上)中的其他FileAppender实例。
RollingFileAppender 扩展了FileAppender,具有滚动更新⽇志⽂件的功能,其包含以下⼏个属性: file——略 append——略encoder——略 rollingPolicy—— 此选项是在发⽣滚动时指定RollingFileAppender⾏为的组件,包含SizeAndTimeBasedRollingPolicy、FixedWindowRollingPolicy、TimeBasedRollingPolicy。在上述配置中我们使⽤的是最为⼴泛的TimeBasedRollingPolicy。 triggeringPolicy—— 此选项是通知RollingFileAppender何时激活滚动更新过程的组件prudent——布尔值,当为true时,不⽀持FixedWindowRollingPolicy。
5 Logback使⽤过程中遇到的问题
起初,在配置完l⽂件后,始终⽆法将⽇志输出到指定⽬录。第⼀步,调试确认使⽤的是logback组件;第⼆步,引⼊logback-core、logback-classic、logback-access和slf4j-api对应的jar包,验证是否可以将⽇志输出到指定⽬录。验证后发现,仍然⽆法解决问题,于是将引⼊的jar包删除。第三步,排除springboot中包含的log4j2相关的jar,验证后仍⽆法解决问题。第四步,在⽹上查到可能跟配置⽂件的命名有关,有说l加载的优先级最⾼,于是将⽂件名由l改为l,但是仍然⽆法解决问题。官⽹上看到的加载顺序是: l>
resolved to URL because it does not exist。
根据错误信息可以看到,系统中根本没有加载到l⽂件。第六步,由于第五步验证系统根本没有加载到l ⽂件,于是检查了⼀下l⽂件,发现在build时,没有引⼊资源⽂件,于是修改l⽂件,添加如下内容,成功将⽇志输出到指定⽬录。
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
以上就是Logback的使⽤及如何配置的详细内容,更多关于Logback的使⽤和配置的资料请关注其它相关⽂章!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。