zoukankan      html  css  js  c++  java
  • Logback的基本使用方法

    一、Logback简介

    Logback是由log4j创始人设计的又一个开源日志组件。

    1、logback当前分成三个模块:logback-core,logback- classic和logback-access。

         1)logback-core是其它两个模块的基础模块。

        2)logback-classic是log4j的一个改良版本,完整实现SLF4J API使你可以很方便地更换成其它日志系统如log4j或JDK14 Logging。

         3)logback-access访问模块与Servlet容器集成提供通过Http来访问日志的功能。

    2、Logback是要与SLF4J结合起来用两个组件的官方网站如下:

        logback的官方网站: http://logback.qos.ch

        SLF4J的官方网站:http://www.slf4j.org

    3、用到的jar包(原文写于2011年,jar内容和pom内容可能有所变化)

        logback-access-1.0.0.jar(这个可以不用)

        logback-classic-1.0.0.jar

        logback-core-1.0.0.jar

        slf4j-api-1.6.0.jar

    POM:

    <!-- logback+slf4j -->  
    <dependency>  
        <groupId>org.slf4j</groupId>  
        <artifactId>slf4j-api</artifactId>  
        <version>1.6.0</version>  
        <type>jar</type>  
        <scope>compile</scope>  
    </dependency>  
    <dependency>  
        <groupId>ch.qos.logback</groupId>  
        <artifactId>logback-core</artifactId>  
        <version>0.9.28</version>  
        <type>jar</type>  
    </dependency>  
    <dependency>  
        <groupId>ch.qos.logback</groupId>  
        <artifactId>logback-classic</artifactId>  
        <version>0.9.28</version>  
        <type>jar</type>  
    </dependency>

    二、Logback的配置介绍

    1、logger、appender以及layout

    logger:作为日志的记录器,把它关联到应用的对应的context后,主要用于存放日志对象,也可以定义日志类型、级别。

    appender:主要用于指定日志输出的目的地,目的地可以是控制台、文件、远程套接字服务器、MySQL、PostreSQL、

    Oracle和其他数据库、JMS和远程UNIX Syslog守护进程等。

    layout:负责把事件转换成字符串,格式化日志信息的输出

    2、logger context

    各个logger都被关联到一个loggerContext中,loggerContext负责制造logger,也负责以树结构排列个logger。

    logger的取得:通过org.slf4j.LoggerFactory的getLogger()方法取得,getLogger()方法有两种实现形式,getLogger(Class obj)方式是通过传入一个类的形式来进行logger对象和类的绑定;getLogger(String name)方式是通过传入一个contextName的形式来指定一个logger,用同一个名字调用该方法获取的永远都是同一个logger对象的引用。

    3、logger级别及继承

    logger可以被分配级别,级别包括:TRACE<DEBUG<INFO<WARN<ERROR,定义于ch.qos.logback.classic.Level类中。

    如果logger没有被分配级别,name它将从有被分配级别的最近的父类那里继承级别,root logger默认级别是DEBUG。

    4、打印方法及基本的选择规则

    打印方法决定记录请求的类别。例如,如果L是一个logger实例,那么logger.info("...")表明这是一条级别为INFO的记录请求。记录请求

    级别在高于或等于其logger的有效级别时为启用,否则为禁用。只有在请求级别大于有效级别时,该请求才会被执行。

    级别的排序为:TRACE<DEBUG<INFO<WARN<ERROR。

    5、logback的默认配置

    Logback默认配置步骤

    (1) 尝试在classpath下查找文件logback-test.xml

    (2) 如果文件不存在,则查找文件logback.xml

    (3) 如果两个文件都不存在,则用BasicConfigurator自动对自己进行配置,把记录输出到控制台

    输出模式:%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%msg%n

    输出模式解释:时间日期格式-调用的线程-日志界别-调用对象-日志信息-换行

    三、logback配置文件示例

    1、常用配置详解

    (1)根节点<configuration>,其下包含以下三个属性

    scan:此属性为true时,配置文件如果发生改变,将会重新加载,默认值为true。

    scanPeriod:设置监测配置文件是否有修改的时间间隔,当scan为true时,该属性生效。默认的时间间隔为1分钟。在设置

    时,如果没有指定时间单位,默认时间单位是毫秒。

    debug:当此属性为true时,将打印出logback内部日志信息,实时查看logback运行状态。

    示例:

    <configuration scan="true" scanPeriod="60 seconds" debug="false">
    
    <!-- 其他配置信息 -->
    
    </configuration>

    (2)子节点<contextName>用来设置上下文名称,每个logger都关联到logger上下文,默认上下文名称为default。可以用<contextName>

    其他名称来区分不同应用程序的记录,一旦设置,不能修改。

    示例:

    <configuration scan="true" scanPeriod="60 seconds" debug="false">
    
        <contextName>myName</contextName>
    
    </configuration>

    (3)子节点<property>用来定义变量值,通过该标签定义的值会被插入到logger上下文中,可以用"${变量的name}"来取得变量的值,其下

    有两个属性:name表示变量的名称,每一个变量有一个唯一的名称;value表示变量的值,不同的变量可以有相同的值。

    示例:

    <configuration scan="true" scanPeriod="60 seconds" debug="false">
    
        <property name="pName" value="pValue" />
    
        <contextName>${pName}</contextName>
    
    </configuration>

    这样我们的contextName就是我们上面定义的变量的值了。

    (4)子节点<timestamp>用于获取时间戳字符串,有两个基本属性:key用来标识此<timestamp>的名字,datePattern设置当前时间转化

    为字符串的模式,遵循java.txt.SimpleDateFormat的格式。

    示例:

    <configuration scan="true" scanPeriod="60 seconds" debug="false">
    
        <property name="pName" value="pValue" />
    
        <contextName>${pName}</contextName>
    
        <timestamp name="stampName" datePattern="yyyy-MM-dd"/>
    
    </configuration>

    (5)子节点<appender>用于配置写日志的组件,有两个必要属性:name用于指定appender的名称,每一个appender的名称

    唯一,class指定appender的全限定名。appender有三种类型,分别是:ConsoleAppender、FileAppender、RollingFileAppender,

    ConsoleAppender是把日志输出到控制台,FileAppender是把日志添加到文件,而RollingFileAppender是把日志输出到文件并且定期

    进行清理。三种类型需要配置的子节点如下:

    1)ConsoleAppender

    i.<encoder>用于对日志的格式进行格式化

    ii.<target>字符串System.out(默认)或者System.err()

    2)FileAppender

    i.<file>用于指定文件的输出路径

    ii.<append>用于设置日志是否追加到文件结尾,如果是false则清空现存文件,如果为true则直接追加到文件结尾

    iii.<encoder>用于对日志的格式进行格式化

    iv.<prudent>用于多线程,保障日志会被安全的写入文件,效率低,默认为false

    3)RollingFileAppender

    i.<file>用于指定文件的输出路径

    ii.<append>用于设置日志是否追加到文件结尾,如果是false则清空现存文件,如果为true则直接追加到文件结尾

    iii.<rollingPolicy>用于设置滚动策略,涉及文件移动和重命名。最常用的滚动策略是:ch.qos.logback.core.rolling.TimeBasedRollingPolicy,

    该策略根据时间来指定滚动策略,其下有两个子节点:

    a.<fileNamePattern>用于格式化根据时间滚动的日志的名称

    b.<maxHistory>用于设置日志的清理周期,超出数量就删除最旧的那个文件

    (6)子节点<logger>用于设置某一个包或具体的某一个类的日志打印级别、以及指定<appender>。<logger>有三个属性:name用来指定受此logger

    约束的某一个包或某一个具体的类;level用来设置打印级别,大小写无关;addtivity用于设置是否向上一级logger传递打印信息。

    (7)子节点<root>是所有logger的上级,只有一个level属性,level属性用来设置打印级别,除了普通的打印级别外,还支持ALL和OFF,不能设置为

    INHERITED或者同义词NULL。默认是DEBUG。

    2.配置文件示例

    1)

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
        <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->  
        <property name="LOG_HOME" value="c:/log" />  
        <!-- 控制台输出 -->   
        <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
           <!-- 日志输出编码 -->  
           <Encoding>UTF-8</Encoding>   
            <layout class="ch.qos.logback.classic.PatternLayout">   
                 <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--> 
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n   
                </pattern>   
            </layout>   
        </appender>   
        <!-- 按照每天生成日志文件 -->   
        <appender name="FILE"  class="ch.qos.logback.core.rolling.RollingFileAppender">   
            <Encoding>UTF-8</Encoding>   
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <!--日志文件输出的文件名-->
                <FileNamePattern>${LOG_HOME}/myApp.log.%d{yyyy-MM-dd}.log</FileNamePattern>   
                <MaxHistory>30</MaxHistory>
            </rollingPolicy>   
            <layout class="ch.qos.logback.classic.PatternLayout">  
                <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--> 
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n   
                </pattern>   
           </layout> 
            <!--日志文件最大的大小-->
           <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
             <MaxFileSize>10MB</MaxFileSize>
           </triggeringPolicy>
        </appender> 
       <!-- show parameters for hibernate sql 专为 Hibernate 定制 -->  
        <logger name="org.hibernate.type.descriptor.sql.BasicBinder"  level="TRACE" />  
        <logger name="org.hibernate.type.descriptor.sql.BasicExtractor"  level="DEBUG" />  
        <logger name="org.hibernate.SQL" level="DEBUG" />  
        <logger name="org.hibernate.engine.QueryParameters" level="DEBUG" />  
        <logger name="org.hibernate.engine.query.HQLQueryPlan" level="DEBUG" />  
        
        <!-- 日志输出级别 -->
        <root level="INFO">   
            <appender-ref ref="STDOUT" />   
            <appender-ref ref="FILE" />   
        </root> 
         
         <!--日志异步到数据库 -->  
        <appender name="DB" class="ch.qos.logback.classic.db.DBAppender">
            <!--日志异步到数据库 --> 
            <connectionSource class="ch.qos.logback.core.db.DriverManagerConnectionSource">
               <!--连接池 --> 
               <dataSource class="com.mchange.v2.c3p0.ComboPooledDataSource">
                  <driverClass>com.mysql.jdbc.Driver</driverClass>
                  <url>jdbc:mysql://127.0.0.1:3306/databaseName</url>
                  <user>root</user>
                  <password>root</password>
                </dataSource>
            </connectionSource>
      </appender> -->
    </configuration>

    2)

    <?xml version="1.0" encoding="UTF-8"?>
    <!-- scan属性未true时,如果配置文档发生改变将会进行重新加载 -->
    <!-- scanPeriod属性设置监测配置文件修改的时间间隔,默认单位为毫秒,在scan为true时才生效 -->
    <!-- debug属性如果为true时,会打印出logback内部的日志信息 -->
    <configuration scan="true" scanPeriod="60 seconds" debug="false">
        <!-- 定义参数常量 -->
        <!-- 日志级别:TRACE<DEBUG<INFO<WARN<ERROR,其中常用的是DEBUG、INFO和ERROR -->
        <property name="log.level" value="debug" />
    
        <!-- 文件保留时间 -->
        <property name="log.maxHistory" value="30" />
    
        <!-- 日志存储路径 -->
        <property name="log.filePath" value="${catalina.base}/logs/webapps" />
    
        <!-- 日志的显式格式 -->
        <property name="log.pattern"
        value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}-%msg%n"></property>
    
        <!-- 用于说明输出介质,此处说明控制台输出 -->
        <appender name="consoleAppender"
            class="ch.qos.logback.core.ConsoleAppender">
    
            <!-- 类似于layout,除了将时间转化为数组,还会将转换后的数组输出到相应的文件中 -->
            <encoder>
                <!-- 定义日志的输出格式 -->
                <pattern>${log.pattern}</pattern>
            </encoder>
        </appender>
    
        <!-- DEBUG,表示文件随着时间的推移按时间生成日志文件 -->
        <appender name="debugAppender"
            class="ch.qos.logback.core.rolling.RollingFileAppender">
    
            <!-- 文件路径 -->
            <file>${log.filePath}/debug.log</file>
    
            <!-- 滚动策略 -->
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
    
                <!-- 设置文件名称 -->
                <fileNamePattern>
                    ${log.filePath}/debug/debug.%d{yyyy-MM-dd}.log.gz
                </fileNamePattern>
    
                <!-- 设置最大保存周期 -->
                <MaxHistory>${log.maxHistory}</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="infoAppender"
            class="ch.qos.logback.core.rolling.RollingFileAppender">
    
            <!-- 文件路径 -->
            <file>${log.filePath}/info.log</file>
    
            <!-- 滚动策略 -->
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        
                <!-- 设置文件名称 -->
                <fileNamePattern>
                    ${log.filePath}/info/info.%d{yyyy-MM-dd}.log.gz
                </fileNamePattern>
    
                <!-- 设置最大保存周期 -->
                <MaxHistory>${log.maxHistory}</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>
    
        <!-- ERROR,表示文件随着时间的推移按时间生成日志文件 -->
        <appender name="errorAppender"
            class="ch.qos.logback.core.rolling.RollingFileAppender">
    
            <!-- 文件路径 -->
            <file>${log.filePath}/error.log</file>
    
            <!-- 滚动策略 -->
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
    
                <!-- 设置文件名称 -->
                <fileNamePattern>
                    ${log.filePath}/error/error.%d{yyyy-MM-dd}.log.gz
                </fileNamePattern>
    
                <!-- 设置最大保存周期 -->
                <MaxHistory>${log.maxHistory}</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>
    
        <!-- 用于存放日志对象,同时指定关联的package位置 -->
        <!-- name指定关联的package -->
        <!-- level表明指记录哪个日志级别以上的日志 -->
        <!-- appender-ref指定logger向哪个文件输出日志信息 -->
        <!-- additivity为true时,logger会把根logger的日志输出地址加入进来,但logger水平不依赖于根                    logger -->
        <logger name="com.campus.o2o" level="${log.level}" additivity="true">
            <appender-ref ref="debugAppender" />
            <appender-ref ref="infoAppender" />
            <appender-ref ref="errorAppender" />
        </logger>
    
        <!-- 特殊的logger,根logger -->
        <root lever="info">
    
            <!-- 指定默认的日志输出 -->
            <appender-ref ref="consoleAppender" />
        </root>
    
    </configuration>

    四、在程序用引用Logback

    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    public class BlogAction{
         //定义一个全局的记录器,通过LoggerFactory获取
         private static final Logger logger = LoggerFactory.getLogger(BlogAction.class); 
         /**
         * @param args
         */
        public static void main(String[] args) {
            logger.info("logback 成功了");
            logger.error("logback 成功了");
        }
    }

    原文出处:

    [1] weixin_39413952, Logback的基本使用方法, https://blog.csdn.net/weixin_39413952/article/details/78884119
    [2] Jim, Java日志框架-logback的介绍及配置使用方法(纯Java工程)(转), https://www.cnblogs.com/EasonJim/p/7800880.html

    Reference:

    [3] Evankaka, logback与Spring、SpringMVC结合使用教程, https://blog.csdn.net/evankaka/article/details/50637994

  • 相关阅读:
    Atitit.ati orm的设计and架构总结 适用于java c# php版
    Atitit.ati dwr的原理and设计 attilax 总结 java php 版本
    Atitit.ati dwr的原理and设计 attilax 总结 java php 版本
    Atitit. 软件设计 模式 变量 方法 命名最佳实践 vp820 attilax总结命名表大全
    Atitit. 软件设计 模式 变量 方法 命名最佳实践 vp820 attilax总结命名表大全
    Atitit 插件机制原理与设计微内核 c# java 的实现attilax总结
    Atitit 插件机制原理与设计微内核 c# java 的实现attilax总结
    atitit.基于  Commons CLI 的命令行原理与 开发
    atitit.基于  Commons CLI 的命令行原理与 开发
    atitit.js 与c# java交互html5化的原理与总结.doc
  • 原文地址:https://www.cnblogs.com/ryelqy/p/10104057.html
Copyright © 2011-2022 走看看