日志框架--Java常用日志框架+Logback的使用方法

1、Java常用日志框架历史及其总结分类

1)1996年左右,以Ceki Gulcu为首的团队创建了Log4j,后被Apache收归麾下;
2)2002年Sun公司推出了日志库JUL(java util logging),基本照搬Log4j,后来Sun也被Google收购,JUL自然也成为Apache的一员;
3)后来Apache又推出了Commons Logging,组成了日志接口Commons Logging,实现可选Log4j或JUL的架构;
4)2006年Ceki Gulcu离开Apache,先后创建了Slf4j和Logback,组成了日志接口Slf4j,实现以Logback为主的架构;
5)至此,java界两大日志框架阵营形成,主流应用都选这两个组合中的一个,由于Slf4j在各项性能及接入方式上都优于Commons Logging,而且Slf4j完全开源、而Commons Logging部分开源,所以Slf4j大有后来者居上的趋势。
现在,如果接手老项目,就沿用以前的的日志框架;如果是新建项目,建议用Slf4j的组合。

2、Logback使用方法

1)约定




<dependency>
    <groupId>ch.qos.logbackgroupId>
    <artifactId>logback-classicartifactId>
    <version>1.0.6version>
dependency>

2)配置
在用户没有对logback进行任何配置的情况下,logback会使用默认配置输出简单的日志到控制台。但在实际工作中,我们通常对项目日志的输出有很多要求,比如将日志文件按天分割、将日志文件按大小进行分割、定期删除旧日志等。因此需要在项目中创建logback的配置文件,当在项目的classpath路径下存在logback.xml(或者logback-test.xml、logback.groovy),logback框架能够自动扫描到它并读取配置。

配置文件的根节点是configuration,它有三个属性,scan、scanPeriod、debug,一般都采用默认设置
scan: 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。
 scanPeriod: 设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效,默认的时间间隔为1分钟。
 debug: 当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态,默认值为false。
先看一段简单的配置示例

<configuration scan="true" scanperiod="10 seconds">
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    
    <encoder>
      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%npattern>
    encoder>
  appender>

  <root level="debug">
    <appender-ref ref="STDOUT" />
  root>
configuration>

configuration节点主要又包含appdender、logger、root三个标签,如下图:
日志框架--Java常用日志框架+Logback的使用方法_第1张图片
首先是appender,它用来配置日志的输出位置、格式等等,这里介绍几个常用的appender:

ConsoleAppender 顾名思义,即在控制台上输出,示例如下

<configuration>

  
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender" >
        
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:  %msg%npattern>
        encoder>
    appender>

  <root level="DEBUG">
    <appender-ref ref="STDOUT" />
  root>
configuration>

RollingFileAppender将FileAppender都是将日志输出到文件,RollingFileAppender将FileAppender的功能进行扩展,提供了切割日志文件的功能。例如,RollingFileAppender可以记录日志到一个名为log.txt的文件,一旦满足一定条件,将其日志目标更改为另一个文件。
在使用时,RollingFileAppender必须同时具有RollingPolicy和TriggeringPolicy设置。但是,如果它的RollingPolicy也实现TriggeringPolicy接口,那么只需要显式地指定前者。

<configuration>

  
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            
            <fileNamePattern>${LOG_HOME}/logback.log.%d{yyyy-MM-dd}fileNamePattern>
            
            <MaxHistory>1MaxHistory>
        rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:  %msg%npattern>
        encoder>
    appender>
    <encoder>
      
      <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%npattern>
      
      <charset>UTF-8charset>
    encoder>
  appender> 

  <root level="DEBUG">
    <appender-ref ref="FILE" />
  root>
configuration>

然后是root,它可以指定日志的默认输出级别,但是我们在代码中设置的日志输出级别,会覆盖root的设置,root的配置,上面两个实例中都有。
另外日志级别为:TRACE < DEBUG < INFO < WARN < ERROR。

最后,写一个总的示例,一般的项目就写这样的配置文件就可以使用了

<configuration>

    
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender" >
        
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:  %msg%npattern>
        encoder>
    appender>
    
	
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            
            <fileNamePattern>${LOG_HOME}/logback.log.%d{yyyy-MM-dd}fileNamePattern>
            
            <MaxHistory>1MaxHistory>
        rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            
      		<pattern>%-4relative [%thread] %-5level %logger{35} - %msg%npattern>
      		
      		<charset>UTF-8charset>
        encoder>
    appender>
    
    <root level="warn">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="FILE" />
    root>
configuration>

3、实际项目中的一些情况

1)实际开发中如果是springboot项目,不需要我们添加logback的依赖,这是因为spring-boot-starter这个依赖其中包含了 spring-boot-starter-logging,这个包下有所有日志框架需要的依赖(也包含log4j的依赖);

2)如果项目中使用了lombok插件,写日志时甚至都不用创建日志对象,只要在需要日志的类上加一个@Slf4j,就可以直接在方法中用 log.info();或者log.error();等写日志了,非常简单方便。
@Slf4j注解是lombok的一个注解,它会为类提供一个属性名为log的slf4j日志对象。

你可能感兴趣的:(面试,后端,java,系统架构)