zoukankan      html  css  js  c++  java
  • 日志框架一logback配置和使用

    把logback或者log4j放在src/main/resources下,Spring容器就可以自动加载日志文件。

    前言

    Logback是由log4j创始人设计的又一个开源日志组件, 比log4j的性能好.

    1.导入依赖

    <!--这个依赖直接包含了 logback-core 以及 slf4j-api的依赖-->
    <dependency>
         <groupId>ch.qos.logback</groupId>
         <artifactId>logback-classic</artifactId>
         <version>1.2.3</version>
    </dependency>
    

    2.Logback的主要模块

    • logback-core: 核心代码模块
    • logback-classic: log4j的一个改良版本,同时实现了slf4j的接口,这样你如果之后要切换其他日志组件也是一件很容易的事
    • logback-access: 访问模块与Servlet容器集成提供通过Http来访问日志的功能

    3.配置获取顺序

    logback在启动的时候,会按照下面的顺序加载配置文件:

    1. 如果java程序启动时指定了logback.configurationFile属性,就用该属性指定的配置文件。
      java -Dlogback.configurationFile=/path/to/mylogback.xml Test,这样执行Test类的时候就会加载/path/to/mylogback.xml配置.
    2. 在classpath中查找 logback.groovy 文件
    3. 在classpath中查找 logback-test.xml 文件
    4. 在classpath中查找 logback.xml 文件
    5. 如果是 jdk6+,那么会调用ServiceLoader 查找 com.qos.logback.classic.spi.Configurator接口的第一个实现类,
      自动使用ch.qos.logback.classic.BasicConfigurator,在控制台输出日志.

    4.配置文件的节点的结构

    contextName节点

    设置日志上下文名称,后面输出格式中可以通过定义%contextName来打印日志上下文名称

    property节点

    用来设置相关变量,通过key-value的方式配置,然后在后面的配置文件中通过${key}来访问

    appender:负责写日志的组件, 主要用来设置日志的输出位置, 日志文件的生成策略等
    • appender
      1. ConsoleAppender:向控制台输出日志内容的组件,只要定义好encoder节点就可以使用。
        • <encoder>:对记录事件进行格式化。
        • filter :定义了一个过滤器,在LEVEL之下的日志输出不会被打印出来
      2. FileAppender:向文件输出日志内容的组件,用法也很简单,不过由于没有日志滚动策略,一般很少使用
      3. RollingFileAppender:向文件输出日志内容的组件,同时可以配置日志文件滚动策略,在日志达到一定条件后生成一个新的日志文件. 它有下面几个子节点:
        • <file>:被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。
        • <append>:如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true。
        • <encoder>:对记录事件进行格式化。
        • Policy:两个常用热门的策略,TimeBaseRollingPolicy, SizeBasedTriggeringPolicy
          - TimeBaseRollingPolicy:根据fileNamePattern标签来表示什么周期触发一次,生成新的日志文件
          - SizeBasedTriggeringPolicy:表示基于文件大小进行滚动
        • <rollingPolicy>:当发生滚动时,决定RollingFileAppender的行为,涉及文件移动和重命名。
        • <triggeringPolicy>: 告知RollingFileAppender何时激活滚动。
        • <prudent>:当为true时,不支持FixedWindowRollingPolicy。支持TimeBasedRollingPolicy,但是有两个限制,1不支持也不允许文件压缩,2不能设置file属性,必须留空。
        • filter :定义了一个过滤器,在LEVEL之下的日志输出不会被打印出来
    logger:为不同的包使用不同的log配置,用来设置某一个包或者具体的某一个类的日志打印级别
    • name:用来指定受此loger约束的某一个包或者具体的某一个类。
    • level:用来设置打印级别(日志级别),大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,还有一个特俗值INHERITED或者同义词NULL,代表强制执行上级的级别。如果上面的logger没有设置level属性, 会继承root的属性
    • addtivity:是否向上级loger传递打印信息。默认是true。我们可以使用logger节点的additivity="false"属性来屏蔽rootLogger的appender。这样就可以不使用rootLogger的appender输出日志了。

    <logger>可以包含零个或多个<appender-ref>元素,标识这个appender将会添加到这个loger。

    root:也是元素,但是它是根logger,只有一个level属性
    1. level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,不能设置为INHERITED或者同义词NULL。默认是DEBUG。
    2. 如果上面的logger没有设置level属性, 会继承root的属性。
    3. 可以包含零个或多个元素。

    注:
    1. rootlogger同时引入同一个appender,并且additivity="true",则这个appender会输出多份
    2. level默认是以覆盖的方式继承的,如果父亲的级别是DEBUG,如果在这个logger中设置了INFO,最终这个logger的级别就是INFO
    3. 如果一个指定的logger标签没有指定level的话,就会继承离他最近的祖先的级别
    4. 如果appender指定了filterlogger不用写level属性。
    <?xml version="1.0" encoding="utf-8"?>
    
    <!--scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。-->
    <!--scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。-->
    <!--debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。-->
    <configuration scan="true" scanPeriod="60 seconds" debug="false">
    
        <!--日志上下文名称-->
        <contextName>logback</contextName>
    
        <!--定义参数常量-->
        <property name="log.level" value="debug"></property>
        <property name="log.maxHistory" value="30"></property>
        <property name="log.filePath" value="/"></property>
        <property name="log.pattern"
                  value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n">
        </property>
    
    
        <!--级别从高到低 OFF 、 FATAL 、 ERROR 、 WARN 、 INFO 、 DEBUG 、 TRACE 、 ALL-->
        <!--日志输出规则:根据当前ROOT级别,日志输出时,级别高于root默认的级别时会输出-->
    
    
        <!--控制台设置-->
        <appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
    
            <!--记录事件进行格式化-->
            <encoder>
                <pattern>${log.pattern}</pattern>
            </encoder>
    
        </appender>
    
    
        <!--日志文件-->
        <!--滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件RollingFileAppender-->
        <!--debug-->
        <appender name="debugAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
    
            <!--文件路径-->
            <file>${log.filePath}/debug.log</file>
    
            <!--当发生滚动时,决定RollingFileAppender的行为,涉及文件移动和重命名。-->
            <!--最常用的滚动策略,它根据时间来制定滚动策略.既负责滚动也负责触发滚动。根据<fileNamePattern>确定滚动时间-->
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <!--文件名称-->
                <fileNamePattern>${log.filePath}/debug/debug.%d{yyyy-MM-dd}.log.zip</fileNamePattern>
                <!--文件最大保存历史 30天-->
                <maxHistory>${log.maxHistory}</maxHistory>
                <!--日志文件最大的大小-->
                <MaxFileSize>5M</MaxFileSize>
            </rollingPolicy>
    
            <!--记录事件进行格式化-->
            <encoder>
                <pattern>${log.pattern}</pattern>
            </encoder>
    
            <!--定义了一个过滤器,在level之下的日志输出不会被打印出来-->
            <!--这里定义了DEBUG,也就是控制台不会输出比DEBUG级别小的日志-->
            <filter class="ch.qos.logback.classic.filter.LevelFilter">
                <!-- 设置过滤级别 -->
                <level>DEBUG</level>
                <!--ACCEPT–打印
                    DENY– 不打印
                    NEUTRAL–中立-->
                <!-- 用于配置符合过滤条件的操作 -->
                <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>
    
            <!--按照固定窗口模式生成日志文件,当文件大于5MB时,生成新的日志文件。窗口大小是1到3,当保存了3个归档文件后,将覆盖最早的日志。-->
            <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
                <fileNamePattern>${log.filePath}/info/info.%d{yyyy-MM-dd}.log.zip</fileNamePattern>
                    <minIndex>1</minIndex>
                    <maxIndex>3</maxIndex>
            </rollingPolicy>
    
            <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
                <maxFileSize>5MB</maxFileSize>
            </triggeringPolicy>
    
            <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>
    
    
        <!--设置一个向上传递的appender,所有级别的日志都会输出-->
        <appender name="appender" class="ch.qos.logback.core.rolling.RollingFileAppender">
    
            <file>${log.filePath}/all.log</file>
    
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <fileNamePattern>${log.filePath}/all/all.%d{yyyy-MM-dd}.log.zip</fileNamePattern>
                <maxHistory>${log.maxHistory}</maxHistory>
                <MaxFileSize>5M</MaxFileSize>
            </rollingPolicy>
    
            <encoder>
                <pattern>${log.pattern}</pattern>
            </encoder>
    
        </appender>
    
    
        <!--设置某一个包或者具体的某一个类的打印级别,name代表包名。会屏蔽rootLogger的appender-->
        <logger name="com.Logger" additivity="false">
    
            <appender-ref ref="consoleAppender"/>
    
            <!--分级别分别输出(debugAppender和infoAppender),屏蔽root的appender-->
            <appender-ref ref="debugAppender"/>
            <appender-ref ref="infoAppender"/>
        </logger>
    
    
        <!-- 打印debug级别日志及以上级别日志 -->
        <root level="DEBUG">
            <!-- 控制台输出 -->
            <appender-ref ref="consoleAppender"/>
    
            <!-- 不管什么包下的日志都输出到文件,所有级别的日志分级别输出-->
            <!--<appender-ref ref="ERROR"/>-->
            <!--<appender-ref ref="INFO"/>-->
            <!--<appender-ref ref="WARN"/>-->
            <!--<appender-ref ref="DEBUG"/>-->
            <!--<appender-ref ref="TRACE"/>-->
        </root>
    
    </configuration>
    

    五.使用Log大致需要下面三个步骤:

    1. 配置logback运行参数,一般通过logback.xml配置即可
    2. 在每个需要进行log的类中,创建一个Logger实例
      private static final Logger log= LoggerFactory.getLogger(this.class);
    3. 使用这个实例,调用debug(), info(), warn(), error(),trace()等方法向Appenders输出不同级别的Log
      Appenders是输出源,在LogBack中可以使用控制台、文件、系统log、TCP端口等等多种输出源。
      log.info("I am fine.");
  • 相关阅读:
    [c++]在类中定义常量的几个做法
    VC6中使用高版本系统API的方法
    Delphi编程中实现窗口分割
    Win32 SDK窗口程序代码(含详细注释)
    [c++]在C++中定义常量的两种方法的比较
    VC6里的_WIN32_WINNT宏
    [VC]自己实现TRACE功能
    [delphi]保证程序只运行一个实例
    转载:C# 设置文件夹权限(代码简单)
    VC:动态链接库
  • 原文地址:https://www.cnblogs.com/loveer/p/11327115.html
Copyright © 2011-2022 走看看