zoukankan      html  css  js  c++  java
  • logback+slf4j作为日志系统

    一、logback简介

    log4j和logback作者是同一人:CekiGülcü。log4j和logback都是实打实的日志系统。
    commons-logging,slf4j这两者是日志大管家。slf4j几乎完爆commons-logging。

    Logback是由log4j创始人设计的又一个开源日志组件。logback当前分成三个模块:

    • logback-core
    • logback- classic
    • logback-access

    logback-core是其logback-classic和logback-access的基础模块,另两个模块只是对core模块进行一些封装
    logback-classic在logback-core的基础上遵循slf4j的标准实现日志系统,在maven中配置时,只配置logback-classic就够了,因为它会自动引入logback-core包。
    此外logback-classic完整实现了SLF4J API。也就是说,logback-classsic服从slf4j这个日志大管家的管理。这就使我们可以很方便地更换成其它日志系统,如log4j或JDK14 Logging。
    logback-access访问模块与Servlet容器集成提供通过Http来访问日志的功能。

    slf4j是一个大管家,它管着

    • java.util.logging,中间的协调人是slf4j-jdk14.jar
    • log4j,中间的协调人是slf4j-log4j12.jar
    • logback-core,中间的协调人是logback-classic

    二、一份够用的logback配置

    使用logback+slf4j只需要两个依赖:slf4j和logback-classic,其中logback-classic会自动引用logback-core
    pom.xml中添加依赖

            <!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-classic -->
            <dependency>
                <groupId>ch.qos.logback</groupId>
                <artifactId>logback-classic</artifactId>
                <version>1.2.3</version>
            </dependency>
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-api</artifactId>
                <version>1.7.25</version>
            </dependency>
    

    需要注意的是slf4j的版本跟logback-classic的版本、JDK的版本协调一致。

    slf4j对开发者非常友好,它把几乎可能遇到的问题全部列出来了,抛出警告时直接抛出一个url,在这个网页上一看便知是何原因:https://www.slf4j.org/codes.html#version_mismatch
    这是一种非常优美的设计:抛出异常时,给出一个URL。

    下面是logback配置,logback支持groovy、xml等多种语法配置。
    注意,在logback.xml中可以配置property,属性可以引用user.home,user.dir等目录。

    • 最佳实践是把全部的日志相关的配置都放在logback.xml中足够了。
    • 日志存放位置应该跟webapp目录分离,最好放在user.home/webappName-log目录下
    <!-- Logback configuration. See http://logback.qos.ch/manual/index.html -->
    <configuration scan="true" scanPeriod="10 seconds">
        <include resource="org/springframework/boot/logging/logback/base.xml"/>
        <property name="LOG_PATH" value="${user.home}/come/logs"/>
        <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <File>${LOG_PATH}/info.log</File>
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <fileNamePattern>${LOG_PATH}/info-%d{yyyyMMdd}.log.%i</fileNamePattern>
                <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                    <maxFileSize>10MB</maxFileSize>
                </timeBasedFileNamingAndTriggeringPolicy>
                <maxHistory>2</maxHistory>
            </rollingPolicy>
            <layout class="ch.qos.logback.classic.PatternLayout">
                <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%msg%n
                </Pattern>
            </layout>
        </appender>
    
        <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                <level>ERROR</level>
            </filter>
            <File>${LOG_PATH}/error.log</File>
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <fileNamePattern>${LOG_PATH}/error-%d{yyyyMMdd}.log.%i
                </fileNamePattern>
                <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                    <maxFileSize>10MB</maxFileSize>
                </timeBasedFileNamingAndTriggeringPolicy>
                <maxHistory>2</maxHistory>
            </rollingPolicy>
            <layout class="ch.qos.logback.classic.PatternLayout">
                <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%msg%n
    
                </Pattern>
            </layout>
        </appender>
    
        <root level="INFO">
            <appender-ref ref="INFO_FILE"/>
            <appender-ref ref="ERROR_FILE"/>
        </root>
    </configuration>
    

    对于logback,官方没有XSD这样的XML文档格式定义的,但是民间有。
    https://stackoverflow.com/questions/5731162/xml-schema-or-dtd-for-logback-xml

    三、我说

    日志系统是成熟语言的标配。任何系统只要部署到服务器肯定需要日志。不然出了问题根本没法定位错误。
    日志系统的好坏普通用户是感觉不到的,比如log4j和logback到底哪个更好,我认为二者差别并不大,选择上也不用太纠结。logback是后起之秀,这倒是事实。
    不要试图搞清楚日志系统的每一个细节。日志系统庞大复杂,作者都是大牛级人物。看上去日志很简单,可是现代化的日志功能非常丰富:比如说定义输出格式,定义输出位置,定义存储日志文件的策略(包括定时压缩、定时删除、定时回滚覆盖等等)。在平时应用上,找到一份比较够用的配置文件基本上就足以应对一切日志问题了。
    不要试图弄清楚世界上的每一个细节。

  • 相关阅读:
    C语言作业9
    C语言作业8
    学习体会
    C语言作业7
    C语言作业6
    C语言作业5
    C语言作业4
    C语言作业3
    丛铭俣 160809324 (作业12)
    丛铭俣 160809324 (作业10)
  • 原文地址:https://www.cnblogs.com/weiyinfu/p/7384901.html
Copyright © 2011-2022 走看看