LogBack在项目中的应用

前言

前段时间,将团队框架中的Struts2切换到SpringMVC,做一个系统系统,同时将一些共用组件抽取、独立,团队成员提议使用LogBack记录日志,因之前做的基础组件使用的Log4j,对LogBack不太熟悉,所以自己学习了一下LogBack,学习过程中,发现心仪的中文资料比较少,结合自己开的项目,分享一下LogBack在项目中的应用及自己所遇到的问题。回过头思考使用LogBack的过程,官方文档还是最准确、最完成的学习资源,虽然是英文的,正好此时在翻译一本英文书籍,能静下心去看官方的文档,解决了项目中遇到的一些问题。
项目中使用的LogBack的配置如下:
[html]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!--   
  3.     说明:  
  4.     1、日志级别及文件  
  5.         日志记录采用分级记录,级别与日志文件名相对应,不同级别的日志信息记录到不同的日志文件中  
  6.         例如:error级别记录到log_error_xxx.log或log_error.log(该文件为当前记录的日志文件),而log_error_xxx.log为归档日志,  
  7.         日志文件按日期记录,同一天内,若日志文件大小等于或大于2M,则按0、1、2...顺序分别命名  
  8.         例如log-level-2013-12-21.0.log  
  9.         其它级别的日志也是如此。  
  10.     2、文件路径  
  11.         若开发、测试用,在Eclipse中运行项目,则到Eclipse的安装路径查找logs文件夹,以相对路径../logs。  
  12.         若部署到Tomcat下,则在Tomcat下的logs文件中  
  13.     3、Appender  
  14.         FILEERROR对应error级别,文件名以log-error-xxx.log形式命名  
  15.         FILEWARN对应warn级别,文件名以log-warn-xxx.log形式命名  
  16.         FILEINFO对应info级别,文件名以log-info-xxx.log形式命名  
  17.         FILEDEBUG对应debug级别,文件名以log-debug-xxx.log形式命名  
  18.         stdout将日志信息输出到控制上,为方便开发测试使用  
  19.  -->  
  20. <configuration>  
  21.       
  22.     <!-- 在Eclipse中运行,请到Eclipse的安装目录中找log文件,Tomcat下,请到Tomcat目录下找 -->  
  23.     <property name="LOG_PATH" value="../logs" />  
  24.       
  25.     <!-- 日志记录器,日期滚动记录 -->  
  26.     <appender name="FILEERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">  
  27.         <!-- 正在记录的日志文件的路径及文件名 -->  
  28.         <file>${LOG_PATH}/log_error.log</file>  
  29.         <!-- 日志记录器的滚动策略,按日期,按大小记录 -->  
  30.         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">  
  31.             <!-- 归档的日志文件的路径,例如今天是2013-12-21日志,当前写的日志文件路径为file节点指定,可以将此文件与file指定文件路径设置为不同路径,从而将当前日志文件或归档日志文件置不同的目录。  
  32.             而2013-12-21的日志文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->  
  33.             <fileNamePattern>${LOG_PATH}/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>  
  34.             <!-- 除按日志记录之外,还配置了日志文件不能超过2M,若超过2M,日志文件会以索引0开始,  
  35.             命名日志文件,例如log-error-2013-12-21.0.log -->  
  36.             <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">  
  37.                 <maxFileSize>2MB</maxFileSize>  
  38.             </timeBasedFileNamingAndTriggeringPolicy>  
  39.         </rollingPolicy>  
  40.         <!-- 追加方式记录日志 -->  
  41.         <append>true</append>  
  42.         <!-- 日志文件的格式 -->  
  43.         <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">  
  44.             <pattern>%-5p [%d] %C:%L - %m %n</pattern>  
  45.             <charset>utf-8</charset>  
  46.         </encoder>  
  47.         <!-- 此日志文件只记录error级别的 -->  
  48.         <filter class="ch.qos.logback.classic.filter.LevelFilter">  
  49.             <level>error</level>  
  50.             <onMatch>ACCEPT</onMatch>  
  51.             <onMismatch>DENY</onMismatch>  
  52.         </filter>  
  53.     </appender>  
  54.       
  55.     <appender name="FILEWARN" class="ch.qos.logback.core.rolling.RollingFileAppender">  
  56.         <file>${LOG_PATH}/log_warn.log</file>  
  57.         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">  
  58.             <fileNamePattern>${LOG_PATH}/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>  
  59.             <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">  
  60.                 <maxFileSize>2MB</maxFileSize>  
  61.             </timeBasedFileNamingAndTriggeringPolicy>  
  62.         </rollingPolicy>  
  63.         <append>true</append>  
  64.         <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">  
  65.             <pattern>%-5p [%d] %C:%L - %m %n</pattern>  
  66.             <charset>utf-8</charset>  
  67.         </encoder>  
  68.         <!-- 此日志文件只记录warn级别,不记录大于warn级别的日志 -->  
  69.         <filter class="ch.qos.logback.classic.filter.LevelFilter">  
  70.             <level>WARN</level>  
  71.             <onMatch>ACCEPT</onMatch>  
  72.             <onMismatch>DENY</onMismatch>  
  73.         </filter>  
  74.     </appender>  
  75.       
  76.     <appender name="FILEINFO" class="ch.qos.logback.core.rolling.RollingFileAppender">  
  77.         <file>${LOG_PATH}/log_info.log</file>  
  78.         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">  
  79.             <fileNamePattern>${LOG_PATH}/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>  
  80.             <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">  
  81.                 <maxFileSize>2MB</maxFileSize>  
  82.             </timeBasedFileNamingAndTriggeringPolicy>  
  83.         </rollingPolicy>  
  84.         <append>true</append>  
  85.         <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">  
  86.             <pattern>%-5p [%d] %C:%L - %m %n</pattern>  
  87.             <charset>utf-8</charset>  
  88.         </encoder>  
  89.         <!-- 此日志文件只记录info级别,不记录大于info级别的日志 -->  
  90.         <filter class="ch.qos.logback.classic.filter.LevelFilter">  
  91.             <level>INFO</level>  
  92.             <onMatch>ACCEPT</onMatch>  
  93.             <onMismatch>DENY</onMismatch>  
  94.         </filter>  
  95.     </appender>  
  96.       
  97.       
  98.     <appender name="FILEDEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">  
  99.         <file>${LOG_PATH}/log_debug.log</file>  
  100.         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">  
  101.             <fileNamePattern>${LOG_PATH}/log-debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern>  
  102.             <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">  
  103.                 <maxFileSize>2MB</maxFileSize>  
  104.             </timeBasedFileNamingAndTriggeringPolicy>  
  105.         </rollingPolicy>  
  106.         <append>true</append>  
  107.         <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">  
  108.             <pattern>%-5p [%d] %C:%L - %m %n</pattern>  
  109.             <charset>utf-8</charset>  
  110.         </encoder>  
  111.         <!-- 此日志文件只记录debug级别,不记录大于debug级别的日志 -->  
  112.         <filter class="ch.qos.logback.classic.filter.LevelFilter">  
  113.             <level>DEBUG</level>  
  114.             <onMatch>ACCEPT</onMatch>  
  115.             <onMismatch>DENY</onMismatch>  
  116.         </filter>  
  117.     </appender>  
  118.       
  119.     <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">  
  120.         <Target>System.out</Target>  
  121.         <encoder>  
  122.             <pattern>%-5p [%d] %C:%L - %m %n</pattern>  
  123.             <charset>utf-8</charset>  
  124.         </encoder>  
  125.         <!-- 此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->  
  126.         <filter class="ch.qos.logback.classic.filter.ThresholdFilter">  
  127.             <level>DEBUG</level>  
  128.         </filter>  
  129.     </appender>  
  130.     <!-- 为单独的包配置日志级别,若root的级别大于此级别, 此处级别也会输出  
  131.         应用场景:生产环境一般不会将日志级别设置为trace或debug,但是为详细的记录SQL语句的情况,  
  132.         可将hibernate的级别设置为debug,如此一来,日志文件中就会出现hibernate的debug级别日志,  
  133.         而其它包则会按root的级别输出日志  
  134.     -->  
  135.     <logger name="org.hibernate.SQL" level="DEBUG" />  
  136.     <logger name="org.hibernate.jdbc" level="DEBUG"/>  
  137.     <logger name="org.springframework" level="DEBUG"/>  
  138.       
  139.       
  140.     <!-- 生产环境,将此级别配置为适合的级别,以名日志文件太多或影响程序性能 -->  
  141.     <root level="INFO">  
  142.         <appender-ref ref="FILEDEBUG" />  
  143.         <appender-ref ref="FILEINFO" />  
  144.         <appender-ref ref="FILEWARN" />  
  145.         <appender-ref ref="FILEERROR" />  
  146.         <!-- 生产环境将请stdout去掉 -->  
  147.         <appender-ref ref="stdout" />  
  148.     </root>  
  149. </configuration>  


LogBack

LogBack是由log4j的创始人开发的一个日志组件,用于替代log4j。LogBack的架构设计足够通用,可适用于不同的环境,目前LogBack分为三个模:lobback-core,logback-classic和logback-access。

core模块是其它两个模块的基础,classic是core的扩展,是log4j巨大改进的版本。LogBack-classic本身实现了SL4J的API,因此可以很容易的在logback与其它日志系统之间转换,例如log4j、JDK1.4中的java.util.logging(JUL)。第三个模块access,它集成了Servlet容器,提供了通过HTTP访问日志的功能,若了解access可访问其独立文档http://logback.qos.ch/access.html

LogBack的日志级别有trace、debug、info、warn、error,关于基级别,可参考官方文档(http://logback.qos.ch/manual/architecture.html)。

配置

LogBack可以通过编程式或以XML、Groovy格式配置,原来使用log4j的用户可以通过 属性转换器将log4j.properties转换成logback.xml文件。我在使用这个转换器的时候,能转换成功,但是在Web-App中日志输出的有点小问题,后来就自己写logback.xml文件,LogBack读取配置或属性文件的步骤:
  1. LogBack在类路径下尝试查找logback.groovy的文件。
  2. 如果logback.groovy没有找到,就在类路径下查找logback-test.xml文件。
  3. 若logback-test.xml文件没有找到,就会在类路径下查找logback.xml文件(自己使用的就是这种方式,将logback.xml配置文件放到类路径下)。
  4. 如果都找不到,LogBack就会使用BasicConfigurator启动默认配置,该配置会将日志输出到控制上。
第4步,意味着使用缺省配置,它提供了默认(最基础)的日志功能。
如果使用Maven,可以将logback-test.xml的配置文件置于src/test/resources文件夹下,因此,可以在测试时使用logback-test.xml配置,而在产品中使用logback.xml,这一点,我也木用使用到。我的用法是Web-App中,将logback.xml文件放到了src/main/resources路径下,而在Java-App中,将文件放到src/main/java下,如下图:

Web-App的目录结构图:

Java工程的目录结构图:

Appender

LogBack的日志Appender都必须实现 ch.qos.logback.core.Appender接口,常用的有ConsoleAppender、FileAppender和RollingFileAppender,类图如下:


项目中使用的Appender有两种:ConsoleAppender和RollingFileAppender
ConsoleAppender:主要是将日志信息输出到控制上,在上面的日志文件中,stdout的Append就是ConsoleAppender
RollingFileAppender:是按日期滚动记录日志,例如RollingFileAppender将日志记录到log.txt文件中,一旦设置的条件满足,就将日志信息记录到另一个文件中,它继承FileAppender。与RollingFileAppender交互的两个重要组件分别是:RollingPolicy和TriggeringPolicy。前者负责滚动神马,后者负责神马时候滚动。
任何时候使用,RollingFileAppender都必须有RollingFileAppender和TriggeringPolicy的配置,但是如果它的RollingPolicy也实现了TriggeringPolicy接口,只需要指定前者即可。此点需要注意:笔者在使用时,就忽略这一点,导致日志滚动不成功。其具体属性如下:(以项目中使用到的为例 )
  • file:继承自FileAppender,指定日志文件名。
  • append:继承自FileAppender,为true,日志将追加到日志文件的尾部,false将删除已经存在的日志文件,默认为true。
  • encoder:Encoder,指定日志格式及编码
RollingPolicy
TimeBaseRollingPolicy可能是最常用的滚动策略了,它是基于时间的,例如可以以天或月为周期,同时,这个类同时实现了RollingPolicy接口和TriggeringPolicy接口。在RollingFileAppender中只使用这个类就可以了,项目中就是使用的这个RollingPolicy,日期格式由%d{yyyy-MM-dd}指定,%i是索引。具体配置可参考上述的配置文件。RollingPolicy还有一此其它属性,具体可参考官方文档,项目中未使用到,例如最大历史期限等。
LogBack也提供了FixedWindowRollingPolicy,该类未使用,可参考官方文件。
此外,我们还可以根据时间和大小来决定滚动策略,在项目中使用的就是这种类型,项目中使用配置文件可见上述,下面为官方提供的配置文件:
[html]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. <configuration>  
  2.   <appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">  
  3.     <file>mylog.txt</file>  
  4.     <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">  
  5.       <!-- rollover daily -->  
  6.       <fileNamePattern>mylog-%d{yyyy-MM-dd}.%i.txt</fileNamePattern>  
  7.       <timeBasedFileNamingAndTriggeringPolicy  
  8.             class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">  
  9.         <!-- or whenever the file size reaches 100MB -->  
  10.         <maxFileSize>100MB</maxFileSize>  
  11.       </timeBasedFileNamingAndTriggeringPolicy>  
  12.     </rollingPolicy>  
  13.     <encoder>  
  14.       <pattern>%msg%n</pattern>  
  15.     </encoder>  
  16.   </appender>  
  17.   
  18.   
  19.   <root level="DEBUG">  
  20.     <appender-ref ref="ROLLING" />  
  21.   </root>  
  22.   
  23. </configuration>  

TriggeringPolicy
SizeBasedTriggeringPolicy:控制当前文件大小,如果日志文件大于指定的大小,则触发滚动,由maxFileSize属性指定,该值可以取KB、MB、及GB,如下下面的配置文件(官方提供的,未在项目中使用):
[html]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. <configuration>  
  2.   <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">  
  3.     <file>test.log</file>  
  4.     <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">  
  5.       <fileNamePattern>test.%i.log.zip</fileNamePattern>  
  6.       <minIndex>1</minIndex>  
  7.       <maxIndex>3</maxIndex>  
  8.     </rollingPolicy>  
  9.   
  10.     <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">  
  11.       <maxFileSize>5MB</maxFileSize>  
  12.     </triggeringPolicy>  
  13.     <encoder>  
  14.       <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>  
  15.     </encoder>  
  16.   </appender>  
  17.       
  18.   <root level="DEBUG">  
  19.     <appender-ref ref="FILE" />  
  20.   </root>  
  21. </configuration>  

Filter

项目中使用到了LevelFilter和ThresholdFilter两种,官方还提供了其它的Filter可参考。
LevelFilter:基于精确匹配,如果事件的级别与配置的级别相同,则将会根据已经配置的onMatch和onMismatch的属性决定接受或拒绝,如果项目中的使用的配置文件中的FILEERROR、FILEWARN、FILEINFO、FILEDEBUG,下面的配置是官方提供的配置:
[html]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. <configuration>  
  2.   <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">  
  3.     <filter class="ch.qos.logback.classic.filter.LevelFilter">  
  4.       <level>INFO</level>  
  5.       <onMatch>ACCEPT</onMatch>  
  6.       <onMismatch>DENY</onMismatch>  
  7.     </filter>  
  8.     <encoder>  
  9.       <pattern>  
  10.         %-4relative [%thread] %-5level %logger{30} - %msg%n  
  11.       </pattern>  
  12.     </encoder>  
  13.   </appender>  
  14.   <root level="DEBUG">  
  15.     <appender-ref ref="CONSOLE" />  
  16.   </root>  
  17. </configuration>  

ThresholdFilter:指定下限级别,低于此级别的事件将被拒绝,如果项目中使用的配置文件中的stdout的配置,下面为官方提供的配置:

[html]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. <configuration>  
  2.   <appender name="CONSOLE"  
  3.     class="ch.qos.logback.core.ConsoleAppender">  
  4.     <!-- deny all events with a level below INFO, that is TRACE and DEBUG -->  
  5.     <filter class="ch.qos.logback.classic.filter.ThresholdFilter">  
  6.       <level>INFO</level>  
  7.     </filter>  
  8.     <encoder>  
  9.       <pattern>  
  10.         %-4relative [%thread] %-5level %logger{30} - %msg%n  
  11.       </pattern>  
  12.     </encoder>  
  13.   </appender>  
  14.   <root level="DEBUG">  
  15.     <appender-ref ref="CONSOLE" />  
  16.   </root>  
  17. </configuration>  
官方提供了其它的Filter,也可以自己实现自己的Filter,具体参考官方文档。

问题

1、路径
这个问题在配置文件中做了详细的注释,请参考。
2、关于Spring或其它已经使用了log4j、common-logging或java.util.longging的集成
LogBack提供了jcl-over-slf4j和jul-to-slf4j,jcl是指common-logging,jul指java.utils.longging,如果需要将Spring的日志统一处理,就需要将jcl-over-slf4j的包加入到工作中,项目中使用Maven开发,依赖如下:
[html]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. <dependency>  
  2.             <groupId>ch.qos.logback</groupId>  
  3.             <artifactId>logback-core</artifactId>  
  4.             <version>1.0.13</version>  
  5.         </dependency>  
  6.         <dependency>  
  7.             <groupId>ch.qos.logback</groupId>  
  8.             <artifactId>logback-classic</artifactId>  
  9.             <version>1.0.13</version>  
  10.         </dependency>  
  11.         <dependency>  
  12.             <groupId>org.slf4j</groupId>  
  13.             <artifactId>jcl-over-slf4j</artifactId>  
  14.             <version>1.7.0</version>  
  15.         </dependency>  
  16.         <dependency>  
  17.             <groupId>ch.qos.logback</groupId>  
  18.             <artifactId>logback-access</artifactId>  
  19.             <version>1.0.13</version>  
  20.         </dependency>  
3、代码区别
源写法:
[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. if (logger.isInfoEnabled()) {  
  2.     logger.info("***** BaseAuthoritiesResourcesServiceImpl.getList() method begin*****");  
  3. }  
使用LogBack之后,可将if判断去掉,如下:
[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. logger.debug("***** BaseDictionaryServiceImpl.delete() method begin*****");  
如果 日志级别高于Debug,则这一行日志信息将不会输出。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Spring Boot使用Logback作为日志框架非常常见。Logback是一个灵活且高性能的日志框架,它是Log4j框架的继任者。 要在Spring Boot项目使用Logback,首先需要在项目的依赖添加Logback的相应依赖项。通常,在pom.xml文件添加以下依赖项: ```xml <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> </dependency> ``` 接下来,你可以在项目的src/main/resources目录下创建一个名为`logback.xml`的文件,用于配置Logback的行为。在这个配置文件,你可以定义日志输出的格式、日志级别、输出路径等等。以下是一个简单的`logback.xml`配置示例: ```xml <configuration> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <root level="info"> <appender-ref ref="CONSOLE" /> </root> </configuration> ``` 上述配置示例定义了一个名为`CONSOLE`的输出器,将日志输出到控制台。`%d{yyyy-MM-dd HH:mm:ss}`定义了日期时间的格式,`[%thread]`显示了线程信息,`%-5level`显示了日志级别,`%logger{36}`显示了日志记录器的名称,`%msg%n`显示了日志消息和换行符。 最后,你可以在Spring Boot的应用程序使用Logback来记录日志。例如,在你的类,你可以使用Logback的Logger对象来记录不同级别的日志。以下是一个使用Logback的示例: ```java import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class MyService { private static final Logger logger = LoggerFactory.getLogger(MyService.class); public void doSomething() { logger.debug("Debug message"); logger.info("Info message"); logger.warn("Warning message"); logger.error("Error message"); } } ``` 在上面的示例,我们通过调用Logger对象的不同方法来记录不同级别的日志。你可以根据需要选择合适的日志级别。 这就是在Spring Boot使用Logback进行日志记录的基本步骤。当然,你还可以进行更高级的配置,例如将日志输出到文件、使用不同的日志文件等。你可以参考Logback的文档来获取更多信息和配置选项。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值