LogBack——LogBack在项目(Web或Java)中的应用

前言

前段时间,将团队框架中的Struts2切换到SpringMVC,做一个系统系统,同时将一些共用组件抽取、独立,团队成员提议使用LogBack记录日志,因之前做的基础组件使用的Log4j,对LogBack不太熟悉,所以自己学习了一下LogBack,学习过程中,发现心仪的中文资料比较少,结合自己开的项目,分享一下LogBack在项目中的应用及自己所遇到的问题。回过头思考使用LogBack的过程,官方文档还是最准确、最完成的学习资源,虽然是英文的,正好此时在翻译一本英文书籍,能静下心去看官方的文档,解决了项目中遇到的一些问题。
项目中使用的LogBack的配置如下:
其文件已经放到GitHub上,地址: https://github.com/wangdongsong/java/blob/master/src/main/java/com/wds/java/base/web/log/logback.xml



	
	
	
	
	
	
		
		${LOG_PATH}/log_error.log
		
   		
   			
   			${LOG_PATH}/log-error-%d{yyyy-MM-dd}.%i.log
   			
   			
       	 		2MB
    		
   		
   		
		true
		
		
			%-5p [%d] %C:%L - %m %n
			utf-8
		
		
		
			error
			ACCEPT
      		DENY
		
	
	
	
		${LOG_PATH}/log_warn.log
   		
   			${LOG_PATH}/log-warn-%d{yyyy-MM-dd}.%i.log
   			
       	 		2MB
    		
   		
		true
		
			%-5p [%d] %C:%L - %m %n
			utf-8
		
		
		
			WARN
			ACCEPT
      		DENY
		
	
	
	
		${LOG_PATH}/log_info.log
   		
   			${LOG_PATH}/log-info-%d{yyyy-MM-dd}.%i.log
   			
       	 		2MB
    		
   		
		true
		
			%-5p [%d] %C:%L - %m %n
			utf-8
		
		
		
			INFO
			ACCEPT
      		DENY
		
	
	
	
	
		${LOG_PATH}/log_debug.log
   		
   			${LOG_PATH}/log-debug-%d{yyyy-MM-dd}.%i.log
   			
       	 		2MB
    		
   		
		true
		
			%-5p [%d] %C:%L - %m %n
			utf-8
		
		
		
			DEBUG
			ACCEPT
      		DENY
		
	
	
	
		System.out
		
			%-5p [%d] %C:%L - %m %n
			utf-8
		
		
		
			DEBUG
		
	
	
	
	
	
	
	
	
	
		
		
		
		
		
		
	


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的目录结构图:
LogBack——LogBack在项目(Web或Java)中的应用_第1张图片
Java工程的目录结构图:
LogBack——LogBack在项目(Web或Java)中的应用_第2张图片

Appender

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

LogBack——LogBack在项目(Web或Java)中的应用_第3张图片
项目中使用的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,该类未使用,可参考官方文件。
此外,我们还可以根据时间和大小来决定滚动策略,在项目中使用的就是这种类型,项目中使用配置文件可见上述,下面为官方提供的配置文件:

  
    mylog.txt
    
      
      mylog-%d{yyyy-MM-dd}.%i.txt
      
        
        100MB
      
    
    
      %msg%n
    
  


  
    
  


TriggeringPolicy
SizeBasedTriggeringPolicy:控制当前文件大小,如果日志文件大于指定的大小,则触发滚动,由maxFileSize属性指定,该值可以取KB、MB、及GB,如下下面的配置文件(官方提供的,未在项目中使用):

  
    test.log
    
      test.%i.log.zip
      1
      3
    

    
      5MB
    
    
      %-4relative [%thread] %-5level %logger{35} - %msg%n
    
  
	
  
    
  

Filter

项目中使用到了LevelFilter和ThresholdFilter两种,官方还提供了其它的Filter可参考。
LevelFilter:基于精确匹配,如果事件的级别与配置的级别相同,则将会根据已经配置的onMatch和onMismatch的属性决定接受或拒绝,如果项目中的使用的配置文件中的FILEERROR、FILEWARN、FILEINFO、FILEDEBUG,下面的配置是官方提供的配置:

  
    
      INFO
      ACCEPT
      DENY
    
    
      
        %-4relative [%thread] %-5level %logger{30} - %msg%n
      
    
  
  
    
  

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


  
    
    
      INFO
    
    
      
        %-4relative [%thread] %-5level %logger{30} - %msg%n
      
    
  
  
    
  
官方提供了其它的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开发,依赖如下:

			ch.qos.logback
			logback-core
			1.0.13
		
		
			ch.qos.logback
			logback-classic
			1.0.13
		
		
			org.slf4j
			jcl-over-slf4j
			1.7.0
		
		
			ch.qos.logback
			logback-access
			1.0.13
		
3、代码区别
源写法:
if (logger.isInfoEnabled()) {
	logger.info("***** BaseAuthoritiesResourcesServiceImpl.getList() method begin*****");
}
使用LogBack之后,可将if判断去掉,如下:
logger.debug("***** BaseDictionaryServiceImpl.delete() method begin*****");
如果 日志级别高于Debug,则这一行日志信息将不会输出。

你可能感兴趣的:(Java,工作总结)