slf4j+logback日志框架的搭建与使用

版权声明:转载请注明出处与链接。 https://blog.csdn.net/With_Her/article/details/82184936

据说马上要开项目了,自己闲来无事就基于SpringBoot来搭建一套开发框架,在日志框架上,我本次选用了Slf4j+Logback的日志框架。特此在这里记录一下。

 

前景提要:

slf4j :定义了一套接口,是一个日志门面,可实现多个日志系统间快速切换(通过修改配置文件)。ps:Slf4j相当于一个接口,它没有具体的日志实现,但可以通过它来调用如log4j、logback等具体的log日志实现

Logback:和log4j是同一作者,是log4j的升级版,是日志框架的具体实现

logback 主要分为三个模块,分别是:

  • logback-core:提供基础功能,是其他两个模块的基础
  • logback-classic : log4j的升级,实现了self4j api
  • logback-access:用于与sevlet容器进行集成、提供网络访问日志的功能

 

开始正文:

jar:

如果在你maven的pom.xml中,依赖了如下内容:

那么就不用再导入关于slf4j与logback的jar了。我们看看spring-boot-starter-web的依赖树:

logback.xml:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- %m输出的信息,%p日志级别,%t线程名,%d日期,%c类的全名,%i索引【从数字0开始递增】,,, -->
    <!-- appender是configuration的子节点,是负责写日志的组件。 -->
    <!-- ConsoleAppender:把日志输出到控制台 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d %p (%file:%line\)- %m%n</pattern>
            <!-- 控制台也要使用UTF-8,不要使用GBK,否则会中文乱码 -->
            <charset>UTF-8</charset>
        </encoder>
    </appender>
    <!-- RollingFileAppender:滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件 -->
    <!-- 以下的大概意思是:1.先按日期存日志,日期变了,将前一天的日志文件名重命名为XXX%日期%索引,新的日志仍然是sys.log -->
    <!--             2.如果日期没有发生变化,但是当前日志的文件大小超过1KB时,对当前日志进行分割 重命名-->
    <appender name="INFO_LOGs" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>logs/Info/Info.log</File>
        <!-- 所有error日志都在这里-->
        <!--LevelFilter: 级别过滤器,根据日志级别进行过滤。只输出某一级别日志
       ThresholdFilter: 临界值过滤器,过滤掉低于指定临界值的日志。
       EvaluatorFilter: 求值过滤器,评估、鉴别日志是否符合指定条件。需要额外的两个JAR包,commons-compiler.jar和janino.jar-->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level><!--设置过滤级别-->

            <!--返回DENY,日志将立即被抛弃不再经过其他过滤器-->
            <!--返回NEUTRAL,有序列表里的下个过滤器过接着处理日志-->
            <!--返回ACCEPT,日志会被立即处理,不再经过剩余过滤器-->
            <onMatch>ACCEPT</onMatch><!--用于配置符合过滤条件的操作-->
            <onMismatch>DENY</onMismatch><!--用于配置不符合过滤条件的操作-->
        </filter>
        <!-- rollingPolicy:当发生滚动时,决定 RollingFileAppender 的行为,涉及文件移动和重命名。 -->
        <!-- TimeBasedRollingPolicy: 最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责出发滚动 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 活动文件的名字会根据fileNamePattern的值,每隔一段时间改变一次 -->
            <!-- 文件名:log/sys.2017-12-05.0.log -->
            <fileNamePattern>logs/Info/Info.%d.%i.log</fileNamePattern>
            <!-- 每产生一个日志文件,该日志文件的保存期限为30天 -->
            <maxHistory>500</maxHistory>
            <timeBasedFileNamingAndTriggeringPolicy  class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!-- maxFileSize:这是活动文件的大小,默认值是10MB,本篇设置为1KB,只是为了演示 -->
                <maxFileSize>30MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <encoder>
            <!-- pattern节点,用来设置日志的输入格式 -->
            <pattern>
                %d %p (%file:%line\)- %m%n
            </pattern>
            <!-- 记录日志的编码 -->
            <charset>UTF-8</charset> <!-- 此处设置字符集 -->
        </encoder>
    </appender>

    <!--错误日志-->
    <appender name="ERROR_LOGs" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>logs/Error/Error.log</File>
        <!-- 所有error日志都在这里-->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>logs/Error/Error.%d.%i.log</fileNamePattern>
            <maxHistory>500</maxHistory>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <encoder>
            <pattern>%d %p (%file:%line\)- %m%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!--警告日志-->
    <appender name="WARN_LOGs" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>logs/warn/warn.log</File>
        <!-- 所有warn日志都在这里-->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>WARN</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>logs/warn/warn.%d.%i.log</fileNamePattern>
            <maxHistory>500</maxHistory>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>30MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <encoder>
            <pattern>%d %p (%file:%line\)- %m%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!--主日志-->
    <appender name="FILE_LOGs" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>logs/File/File.log</File>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>logs/File/File.%d.%i.log</fileNamePattern>
            <maxHistory>500</maxHistory>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>30MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <encoder>
            <pattern>%d %p (%file:%line\)- %m%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!-- 控制台输出日志级别 -->
    <root level="DEBUG">
        <appender-ref ref="STDOUT" />
        <!--<appender-ref ref="FILE_LOGs" />-->
    </root>
    <!-- 指定项目中某个包,当有日志操作行为时的日志记录级别 -->
    <!-- com.appley为根包,也就是只要是发生在这个根包下面的所有日志操作行为的权限都是DEBUG -->
    <!-- additivity:是否向上级传递打印信息,默认true -->
    <!-- 级别依次为【从高到低】:FATAL > ERROR > WARN > INFO > DEBUG > TRACE  -->
    <logger name="com.lvjia" level="INFO" additivity="false">
        <appender-ref ref="INFO_LOGs" />
        <appender-ref ref="ERROR_LOGs"/>
        <appender-ref ref="FILE_LOGs"/>
        <appender-ref ref="WARN_LOGs"/>
    </logger>

</configuration>

该logback.xml实现的内容是:

  • 在控制台打印DEBUG级别及以上的信息
  • 对于INFO、ERROR、WARN级别的日志分别保存到专属的文件夹下
  • 对于INFO级别及以上的所有日志都保存到File文件内
  • 自动将今天之前的log分别保存到不同日期的文件内

注:

  • 在SpringBoot下,如果logback配置文件名为:logback.xml,无需在application中初始化(也可以去配置初始化,但个人觉得没意义)
  • 如果想扩展logback的配置文档,则配置文档的命名必须为:logback-XXX.xml,且需在application.xml中进行初始化
#在application.properties文件中引入日志配置文件
#=====================================  log  =============================
logging.config=classpath:logback-boot.xml

总结:

对于log以前很少关注,上次自己配了一下,但当时对于里面的配置与生产log文件等还是有些许疑惑。

现在在新项目上重新搭建slf4j+logback的log框架,之前遗留了疑惑问题,都通通解决。所以实践永远是检验真理的唯一标准啊。

总的来说,配置slf4j+logback的日志框架,就两步,1.引入jar,2.配置logback.xml配置文件

如果想再丰富更多关于log日志框架,可在此基础上继续塞进一些自己的东西

彩笔一枚,如有错误不足,希望及时评论指正!

 

参考文档:
https://blog.csdn.net/appleyk/article/details/78717388#commentsedit
https://blog.csdn.net/a314773862/article/details/79808407#t4

猜你喜欢

转载自blog.csdn.net/With_Her/article/details/82184936