服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - Logback的使用及如何配置

Logback的使用及如何配置

2021-08-30 11:40江湖段小二 Java教程

这篇文章主要介绍了Logback的使用及如何配置,帮助大家更好的理解和学习使用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配置文件:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <configuration>
  3. <property name="log.path" value="/duan/drs-server/logs" />
  4. <property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />
  5.  
  6. <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
  7. <encoder>
  8. <pattern>${log.pattern}</pattern>
  9. </encoder>
  10. </appender>
  11.  
  12. <!-- 系统debug日志输出 -->
  13. <appender name="FILE_DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">
  14. <file>${log.path}/drs-server-debug.log</file>
  15. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  16. <fileNamePattern>${log.path}/drs-server-debug.%d{yyyy-MM-dd}.log</fileNamePattern>
  17. <maxHistory>30</maxHistory>
  18. </rollingPolicy>
  19. <encoder>
  20. <pattern>${log.pattern}</pattern>
  21. </encoder>
  22. <filter class="ch.qos.logback.classic.filter.LevelFilter">
  23. <level>DEBUG</level>
  24. <onMatch>ACCEPT</onMatch>
  25. <onMismatch>DENY</onMismatch>
  26. </filter>
  27. </appender>
  28.  
  29. <!-- 系统info日志输出 -->
  30. <appender name="FILE_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
  31. <file>${log.path}/drs-server-info.log</file>
  32. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  33. <fileNamePattern>${log.path}/drs-server-info.%d{yyyy-MM-dd}.log</fileNamePattern>
  34. <maxHistory>30</maxHistory>
  35. </rollingPolicy>
  36. <encoder>
  37. <pattern>${log.pattern}</pattern>
  38. </encoder>
  39. <filter class="ch.qos.logback.classic.filter.LevelFilter">
  40. <level>INFO</level>
  41. <onMatch>ACCEPT</onMatch>
  42. <onMismatch>DENY</onMismatch>
  43. </filter>
  44. </appender>
  45.  
  46. <!-- 系统warn日志输出 -->
  47. <appender name="FILE_WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
  48. <file>${log.path}/drs-server-warn.log</file>
  49. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  50. <fileNamePattern>${log.path}/drs-server-warn.%d{yyyy-MM-dd}.log</fileNamePattern>
  51. <maxHistory>30</maxHistory>
  52. </rollingPolicy>
  53. <encoder>
  54. <pattern>${log.pattern}</pattern>
  55. </encoder>
  56. <filter class="ch.qos.logback.classic.filter.LevelFilter">
  57. <level>WARN</level>
  58. <onMatch>ACCEPT</onMatch>
  59. <onMismatch>DENY</onMismatch>
  60. </filter>
  61. </appender>
  62.  
  63. <!-- 系统error日志输出 -->
  64. <appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
  65. <file>${log.path}/drs-server-error.log</file>
  66. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  67. <fileNamePattern>${log.path}/drs-server-error.%d{yyyy-MM-dd}.log</fileNamePattern>
  68. <maxHistory>30</maxHistory>
  69. </rollingPolicy>
  70. <encoder>
  71. <pattern>${log.pattern}</pattern>
  72. </encoder>
  73. <filter class="ch.qos.logback.classic.filter.LevelFilter">
  74. <level>ERROR</level>
  75. <onMatch>ACCEPT</onMatch>
  76. <onMismatch>DENY</onMismatch>
  77. </filter>
  78. </appender>
  79.  
  80. <logger name="com.nuonuo.middleware.drsserver" level="INFO" />
  81. <logger name="org.springframework" level="warn" />
  82.  
  83. <root level="INFO">
  84. <appender-ref ref="STDOUT" />
  85. <appender-ref ref="FILE_DEBUG" />
  86. <appender-ref ref="FILE_INFO" />
  87. <appender-ref ref="FILE_WARN" />
  88. <appender-ref ref="FILE_ERROR" />
  89. </root>
  90. </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的输出格式

针对以上述配置中的格式进行说明:

  1. %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。其类图关系如下所示。

Logback的使用及如何配置

顾名思义目标文件由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.err字符串值之一 默认目标是 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—— 要写入的文件的名称, 如果文件不存在,则创建该文件。 如果文件的父目录不存在,FileAppender将自动创建它,包括任何必要但不存在的父目录。 prudent——布尔值,默认值为false。如果设置为true, FileAppender将安全地写入指定的文件,即使存在运行在不同jvm(可能运行在不同主机上)中的其他FileAppender实例。

RollingFileAppender 扩展了FileAppender,具有滚动更新日志文件的功能,其包含以下几个属性: file——略 append——略 encoder——略 rollingPolicy—— 此选项是在发生滚动时指定RollingFileAppender行为的组件,包含SizeAndTimeBasedRollingPolicy、FixedWindowRollingPolicy、TimeBasedRollingPolicy。在上述配置中我们使用的是最为广泛的TimeBasedRollingPolicy。 triggeringPolicy—— 此选项是通知RollingFileAppender何时激活滚动更新过程的组件 prudent——布尔值,当为true时,不支持FixedWindowRollingPolicy。

5 Logback使用过程中遇到的问题

起初,在配置完logback.xml文件后,始终无法将日志输出到指定目录。 第一步,调试确认使用的是logback组件; 第二步,引入logback-core、logback-classic、logback-access和slf4j-api对应的jar包,验证是否可以将日志输出到指定目录。验证后发现,仍然无法解决问题,于是将引入的jar包删除。 第三步,排除springboot中包含的log4j2相关的jar,验证后仍无法解决问题。 第四步,在网上查到可能跟配置文件的命名有关,有说logback-spring.xml加载的优先级最高,于是将文件名由logback.xml改为logback-spring.xml,但是仍然无法解决问题。官网上看到的加载顺序是: logback-test.xml> logback.groovy> logback.xml。具体可见官方文档logback.qos.ch/manual/conf… 第五步,怀疑可能没加载logback.xml文件,于是在application.properties中加入logging.config=classpath:logback.xml,启动工程时报错,错误信息是: class path resource [logback.xml] cannot be resolved to URL because it does not exist。

Logback的使用及如何配置

根据错误信息可以看到,系统中根本没有加载到logback.xml文件。 第六步,由于第五步验证系统根本没有加载到logback.xml文件,于是检查了一下pom.xml文件,发现在build时,没有引入资源文件,于是修改pom.xml文件,添加如下内容,成功将日志输出到指定目录。

  1. <resource>
  2. <directory>src/main/resources</directory>
  3. <includes>
  4. <include>**/*.xml</include>
  5. </includes>
  6. <filtering>false</filtering>
  7. </resource>

以上就是Logback的使用及如何配置的详细内容,更多关于Logback的使用和配置的资料请关注服务器之家其它相关文章!

原文链接:https://juejin.cn/post/6944961954796535816

延伸 · 阅读

精彩推荐
  • Java教程20个非常实用的Java程序代码片段

    20个非常实用的Java程序代码片段

    这篇文章主要为大家分享了20个非常实用的Java程序片段,对java开发项目有所帮助,感兴趣的小伙伴们可以参考一下 ...

    lijiao5352020-04-06
  • Java教程xml与Java对象的转换详解

    xml与Java对象的转换详解

    这篇文章主要介绍了xml与Java对象的转换详解的相关资料,需要的朋友可以参考下...

    Java教程网2942020-09-17
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    这篇文章主要介绍了Java使用SAX解析xml的示例,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程升级IDEA后Lombok不能使用的解决方法

    升级IDEA后Lombok不能使用的解决方法

    最近看到提示IDEA提示升级,寻思已经有好久没有升过级了。升级完毕重启之后,突然发现好多错误,本文就来介绍一下如何解决,感兴趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程小米推送Java代码

    小米推送Java代码

    今天小编就为大家分享一篇关于小米推送Java代码,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧...

    富贵稳中求8032021-07-12
  • Java教程Java8中Stream使用的一个注意事项

    Java8中Stream使用的一个注意事项

    最近在工作中发现了对于集合操作转换的神器,java8新特性 stream,但在使用中遇到了一个非常重要的注意点,所以这篇文章主要给大家介绍了关于Java8中S...

    阿杜7472021-02-04
  • Java教程Java BufferWriter写文件写不进去或缺失数据的解决

    Java BufferWriter写文件写不进去或缺失数据的解决

    这篇文章主要介绍了Java BufferWriter写文件写不进去或缺失数据的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望...

    spcoder14552021-10-18
  • Java教程Java实现抢红包功能

    Java实现抢红包功能

    这篇文章主要为大家详细介绍了Java实现抢红包功能,采用多线程模拟多人同时抢红包,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙...

    littleschemer13532021-05-16