logback基本配置(一)附配置文件

 
 
 
 
 
 
Logback 主要由三个模块组成:
  • logback-core  
  • logback-classic 
  • logback-access
logback-core 提供了一些关键的通用机制。
logback-classic 等同于 Log4J,Log4J 的一个改进版,实现了简单日志门面 SLF4J;
logback-access 主要作为一个与 Servlet 容器交互的模块,比如说 tomcat 或者 jetty,提供一些与 HTTP 访问相关的功能。

添加依赖

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.5</version>
</dependency>

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-core</artifactId>
    <version>1.0.11</version>
</dependency>

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.0.11</version>
</dependency>


在 logback 里,最重要的三个类分别是

  • Logger
  • Appender
  • Layout
Logger 类位于 logback-classic 模块中, 而 Appender 和 Layout 位于 logback-core 中,这意味着, Appender 和 Layout 并不关心 Logger 的存在,不依赖于 Logger,同时也能看出, Logger 会依赖于 Appender 和 Layout 的协助,日志信息才能被正常打印出来。

Logger:

logger 的 name 格式决定了多个 logger 能够组成一个树状的结构,为了维护这个分层的树状结构,每个 logger 都被绑定到一个 logger 上下文中,这个上下文负责厘清各个 logger 之间的关系。

可通过以下方式获得这个 logger :

Logger rootLogger = LoggerFactory.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME);
在 logback 中,每个 logger 都是一个单例,调用LoggerFactory.getLogger()方法时,如果传入的 logger name 相同,获取到的 logger 都是同一个实例。l

ogger 有日志打印级别,可以为一个 logger 指定它的日志打印级别。
如果不为一个 logger 指定打印级别,那么它将继承离他最近的一个有指定打印级别的祖先的打印级别,直到它找到 root logger。因此,要使用 logback, 必须为 root logger 指定日志打印级别。

日志打印级别从低级到高级排序的顺序是:
TRACE < DEBUG < INFO < WARN < ERROR
如果一个 logger 允许打印一条具有某个日志级别的信息,那么它也必须允许打印具有比这个日志

级别更高级别的信息,而不允许打印具有比这个日志级别更低级别的信息。

Appender 和 Layout:

日志信息可以打印至 console、文件,输出到网络流中,日志打印的目的地由 Appender 决定,不同的 Appender 能将日志信息打印到不同的目的地去。Appender 是绑定在 logger 上的,同时,一个 logger 可以绑定多个 Appender,意味着一条信息可以同时打印到不同的目的地去。

Appender 是绑定在 logger 上的,而 logger 又有继承关系,因此一个 logger 打印信息时的目的地 Appender 需要参考它的父亲和祖先。在 logback 中,默认情况下,如果一个 logger 打印一条信息,那么这条信息首先会打印至它自己的 Appender,然后打印至它的父亲和父亲以上的祖先的 Appender,但如果它的父亲设置了additivity = false ,那么这个 logger 除了打印至它自己的 Appender 外,只会打印至其父亲的 Appender,因为它的父亲的 additivity 属性置为了 false,开始变得忘祖忘宗了,所以这个 logger 只认它父亲的 Appender;此外,对于这个 logger 的父亲来说,如果父亲的 logger 打印一条信息,那么它只会打印至自己的 Appender中(如果有的话),因为父亲已经忘记了爷爷及爷爷以上的那些父辈了。

打印的日志除了有打印的目的地外,还有日志信息的展示格式。在 logback 中,用 Layout 来代表日志打印格式。比如说,PatternLayout 能够识别以下这条格式:
%-4relative [%thread] %-5level %logger{32} - %msg%n
然后打印出来的格式效果是:
176 [main] DEBUG manual.architecture.HelloWorld2 - Hello world.

第一个字段代表从程序启动开始后经过的毫秒数,
第二个字段代表打印出这条日志的线程名字,
第三个字段代表日志信息的日志打印级别,
第四个字段代表 logger name,
第五个字段是日志信息,
第六个字段仅仅是代表一个换行符。




 
 
<?xml version="1.0" encoding="UTF-8" ?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
    <!-- scan&scanPeriod: 60秒扫一次配置 发生改变重新加载配置 不必重启服务器 -->
    <!-- debug:不打印logback内部日志-->


    <!--定义参数常量-->
    <!--trace < debug < info < warn < error-->
    <!--例如:logger.trace("message") logger.debug...-->
    <property name="log.level" value="debug"></property><!--日志等级-->
    <property name="log.maxHistory" value="30"></property><!--文件保留时间-->
    <property name="log.filePath" value="${catalina.base}/logs/webapps"></property><!--定义日志保存路径-->
    <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">
        <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>
        <!--等级过滤 接收debug级别的信息 过滤非dubug的信息-->
        <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>
        <!--等级过滤 接收info级别的信息 过滤非info的信息-->
        <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>
        <!--等级过滤 接收ERROR级别的信息 过滤非ERROR的信息-->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!--logger name:对哪个包生效-->
    <logger name="com.imooc.o2o" level="${log.level}" additivity="true">
        <!--additivity
            false:表示只用当前logger的appender-ref。
            true:表示当前logger的appender-ref和rootLogger的appender-ref都有效。-->
        <appender-ref ref="debugAppender"></appender-ref>
        <appender-ref ref="infoAppender"></appender-ref>
        <appender-ref ref="errorAppender"></appender-ref>
    </logger>

    <!--根logger -->
    <root level="info">
        <appender-ref ref="consoleAppender"></appender-ref>
    </root>
</configuration>


猜你喜欢

转载自blog.csdn.net/asd104/article/details/80054637