• 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

  • 相关阅读:
    轻松自动化---selenium-webdriver(python) (八)
    Ubuntu 18.04 LTS 启用 WakeOnLAN
    lower_bound 和 upper_bound
    [LeetCode 201.] Bitwise AND of Numbers Range
    [LeetCode 162.] Find Peak Element
    [LeetCode 33. 81. 153. 154.] 旋转数组中的二分查找
    C++ unordered_map 的一个疑问
    [LintCode 386.] 最多有k个不同字符的最长子字符串
    [LintCode 550.] 最常使用的K个单词II
    [LintCode 1029.] 寻找最便宜的航行旅途(最多经过k个中转站)
  • 原文地址:https://www.cnblogs.com/ryelqy/p/10104057.html
Copyright © 2020-2023  润新知