• Spring Boot 2.X(十四):日志功能 Logback


    Logback 简介

    Logback 是由 SLF4J 作者开发的新一代日志框架,用于替代 log4j。

    主要特点是效率更高,架构设计够通用,适用于不同的环境。

    Logback 分为三个模块:logback-core,logback-classic和logback-access。

    logback-core 模块是其他两个模块的基础。

    logback-classic 模块是 core 的扩展,是log4j的改进版。logback-classic 本身实现了 SLF4J API,因此可以很容易的在 logback 和其他日志框架之间来回切换,例如 log4j、java.util.logging(JUL)。

    logback-access 模块集成了 Servlet 容器,提供了 HTTP 访问日志的功能。

    官网:http://logback.qos.ch

    中文网:http://www.logback.cn

    github:https://github.com/qos-ch/logback

    Logback 使用

    1.使用 logback-spring.xml 配置

    <?xml version="1.0" encoding="UTF-8"?>
    <!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
    <!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。 -->
    <!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
    <!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
    <configuration scan="true" scanPeriod="60 seconds" debug="false">
    	<!-- 定义日志根目录 -->
    	<property name="LOG_PATH" value="/usr/local/log/" />
    	<!-- 定义应用名称 -->
    	<property name="APP_NAME" value="springboot-logback" />
    	<!-- 应用名称 -->
    	<contextName>${APP_NAME}</contextName>
    	<!-- 引用 Spring Boot 中默认的 logback 配置 -->
    	<!-- <include resource="org/springframework/boot/logging/logback/base.xml" /> -->
    	<!-- 可以动态修改日志输出等级 -->
    	<jmxConfigurator />
    		
    	 <!--输出到控制台-->
        <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
            <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
            <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                <level>debug</level>
            </filter>
            <encoder>
            	<pattern>%d [%t] %5p %c:%L - %m%n</pattern>
                <!-- 设置字符集 -->
                <charset>UTF-8</charset>
            </encoder>
        </appender>
     	<!-- 时间滚动输出 level为 INFO 日志 -->
    	<appender name="INFO_FILE"
    		class="ch.qos.logback.core.rolling.RollingFileAppender">
    		<File>${LOG_PATH}${APP_NAME}-info.log</File>
    		<encoder>
    			<pattern>%d [%t] %5p %c:%L - %m%n</pattern>
    		</encoder>
    		<!-- 日志记录器的滚动策略,按日期,按大小记录,日志按天分类压缩保存-->
    		<rollingPolicy
    			class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
    			<timeBasedFileNamingAndTriggeringPolicy
    				class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
    				<maxFileSize>100MB</maxFileSize>
    			</timeBasedFileNamingAndTriggeringPolicy>
    			<FileNamePattern>${LOG_PATH}${APP_NAME}/info/%d{yyyy-MM-dd}-%i.log.gz
    			</FileNamePattern>
    			 <!--日志文件保留天数-->
    			<MaxHistory>30</MaxHistory>
    		</rollingPolicy>
    	</appender>
    	<!-- 时间滚动输出 level为 ERROR 日志 -->
    	<appender name="ERROR_FILE"
    		class="ch.qos.logback.core.rolling.RollingFileAppender">
    		<File>${LOG_PATH}${APP_NAME}-error.log</File>
    		<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                <level>error</level>
            </filter>
    		<encoder>
    			<pattern>%d [%t] %5p %c:%L - %m%n</pattern>
    		</encoder>
    		<!-- 日志记录器的滚动策略,按日期,按大小记录,日志按天分类压缩保存-->
    		<rollingPolicy
    			class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
    			<timeBasedFileNamingAndTriggeringPolicy
    				class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
    				<maxFileSize>256MB</maxFileSize>
    			</timeBasedFileNamingAndTriggeringPolicy>
    			<FileNamePattern>${LOG_PATH}${APP_NAME}/error/%d{yyyy-MM-dd}-%i.log.gz
    			</FileNamePattern>
    			 <!--日志文件保留天数-->
    			<MaxHistory>30</MaxHistory>
    		</rollingPolicy>
    	</appender>
    	<!-- 设置需要打印日志的包及输出级别 -->
    	<logger name="org.springframework.web" level="INFO" />
    	<logger name="cn.zwqh.springboot.controller" level="TRACE" />
    	<!--
            使用mybatis的时候,sql语句只有在 debug 级别下才会打印
         -->
    	<logger name="cn.zwqh.springboot.dao" level="debug" />
    
    	<!--
            root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性
            level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
            不能设置为INHERITED或者同义词NULL。默认是DEBUG
            可以包含零个或多个元素,标识这个appender将会添加到这个logger。
        -->
        <root level="info">
            <appender-ref ref="CONSOLE" />
            <appender-ref ref="INFO_FILE" />
            <appender-ref ref="ERROR_FILE" />
        </root>
    </configuration>
    
    
    

    2.使用 logback.groovy 配置

    使用 groovy 配置需要添加依赖

     <dependency>
                <groupId>org.codehaus.groovy</groupId>
                <artifactId>groovy-all</artifactId>
                <version>2.4.17</version>
            </dependency>
    
    import ch.qos.logback.classic.encoder.PatternLayoutEncoder
    import ch.qos.logback.classic.filter.ThresholdFilter
    import ch.qos.logback.core.ConsoleAppender
    import ch.qos.logback.core.rolling.RollingFileAppender
    import ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP
    import ch.qos.logback.core.rolling.TimeBasedRollingPolicy
    import java.nio.charset.Charset
    
    import static ch.qos.logback.classic.Level.DEBUG
    import static ch.qos.logback.classic.Level.ERROR
    import static ch.qos.logback.classic.Level.INFO
    import static ch.qos.logback.classic.Level.TRACE
    
    scan("60 seconds")
    def LOG_PATH = "/usr/local/log/"
    def APP_NAME = "springboot-logback"
    context.name = "${APP_NAME}"
    jmxConfigurator()
    appender("CONSOLE", ConsoleAppender) {
      filter(ThresholdFilter) {
    	level = DEBUG
      }
      encoder(PatternLayoutEncoder) {
    	pattern = "%d [%t] %5p %c:%L - %m%n"
    	charset = Charset.forName("UTF-8")
      }
    }
    appender("INFO_FILE", RollingFileAppender) {
      file = "${LOG_PATH}${APP_NAME}-info.log"
      encoder(PatternLayoutEncoder) {
    	pattern = "%d [%t] %5p %c:%L - %m%n"
    	charset = Charset.forName("UTF-8")
      }
      rollingPolicy(TimeBasedRollingPolicy) {
    	timeBasedFileNamingAndTriggeringPolicy(SizeAndTimeBasedFNATP) {
    	  maxFileSize = "100MB"
    	}
    	fileNamePattern = "${LOG_PATH}${APP_NAME}/info/%d{yyyy-MM-dd}-%i.log.gz"
    	maxHistory = 30
      }
    }
    appender("ERROR_FILE", RollingFileAppender) {
      file = "${LOG_PATH}${APP_NAME}-error.log"
      filter(ThresholdFilter) {
    	level = ERROR
      }
      encoder(PatternLayoutEncoder) {
    	pattern = "%d [%t] %5p %c:%L - %m%n"
    	charset = Charset.forName("UTF-8")
      }
      rollingPolicy(TimeBasedRollingPolicy) {
    	timeBasedFileNamingAndTriggeringPolicy(SizeAndTimeBasedFNATP) {
    	  maxFileSize = "256MB"
    	}
    	fileNamePattern = "${LOG_PATH}${APP_NAME}/error/%d{yyyy-MM-dd}-%i.log.gz"
    	maxHistory = 30
      }
    }
    logger("org.springframework.web", INFO)
    logger("cn.zwqh.springboot.controller", TRACE)
    logger("cn.zwqh.springboot.dao", DEBUG)
    root(INFO, ["CONSOLE", "INFO_FILE", "ERROR_FILE"])
    

    详细的 logback.groovy 语法可以参考 http://logback.qos.ch/manual/groovy.html 。logback 也提供了 logback.xml 转 logback.groovy 的在线工具,地址:http://logback.qos.ch/translator/asGroovy.html (include 标签未作解析,所以转换前把该标签去除,否则会报错)

    logback.xml 配置说明

    configuration

    配置文件的根节点,主要包含以下三个属性:

    • scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。
    • scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。
    • debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。

    contextName

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

    property

    配置文件的变量定义,name 代表变量的名称,value 代表变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${name}”来使用变量。

    jmxConfigurator

    开启 JMX 的功能,可以从默认配置文件,指定文件或URL重新配置登录,列出记录器并修改记录器级别。

    JMX(Java Management Extensions,即 Java 管理扩展)是一个为应用程序、设备、系统等植入管理功能的框架。JMX 可以跨越一系列异构操作系统平台、系统体系结构和网络传输协议,灵活的开发无缝集成的系统、网络和服务管理应用。相关文档:http://logback.qos.ch/manual/jmxConfig.html

    appender

    日志输出组件,主要负责日志的输出以及格式化日志。常用的属性有name和class。

    • name:appender组件的名称,后面给logger指定appender使用。
    • class:appender的具体实现类。常用的有 ConsoleAppender、FileAppender、RollingFileAppender。

    appender的具体实现类:

    • ConsoleAppender:向控制台输出日志内容的组件,只要定义好encoder节点就可以使用。
    • FileAppender:向文件输出日志内容的组件,用法也很简单,不过由于没有日志滚动策略,一般很少使用。
    • RollingFileAppender:向文件输出日志内容的组件,同时可以配置日志文件滚动策略,在日志达到一定条件后生成一个新的日志文件。

    Threshold filter

    Logback 定义的日志打印级别的过滤器。可以过滤掉指定级别以下的日志不输出到文件。

    encoder charset

    表示对日志进行编码。

    encoder pattern

    • %d{HH:mm:ss.SSS} —— 日志输出时间。
    • %thread —— 输出日志的进程名称,用方括号括起来。这个信息在 Web 应用以及异步任务处理中很有用。
    • %-5level —— 日志级别,使用5个字符靠左对齐。
    • %logger{36} —— 日志输出者的名字。
    • %msg —— 日志消息。
    • %n —— 换行符。

    rollingPolicy

    日志记录器的滚动策略。

    • FileNamePattern:定义日志的切分方式,本文把每一天的日志归档到一个文件。
    • MaxHistory:表示日志保留的天数,本文设置为30天。

    logger

    用来设置某一个包或者具体的某一个类的日志打印级别、以及指定

    • name:用来指定受此logger约束的某一个包或者具体的某一个类。
    • level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,还有一个特殊值INHERITED或者同义词NULL,代表强制执行上级的级别。如果未设置此属性,那么当前logger将会继承上级的级别。

    使用mybatis的时候,sql语句只有在 debug 级别下才会打印

    root

    必选节点,用来指定最基础的日志输出级别,只有一个level属性
    level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,不能设置为INHERITED或者同义词NULL。默认是 DEBUG 可以包含零个或多个元素,标识这个appender将会添加到这个logger。

    示例代码

    github

    码云

    非特殊说明,本文版权归 朝雾轻寒 所有,转载请注明出处.

    原文标题:Spring Boot 2.X(十四):日志功能 Logback

    原文地址: https://www.zwqh.top/article/info/23

    如果文章对您有帮助,请扫码关注下我的公众号,文章持续更新中...

  • 相关阅读:
    六、Hadoop学习笔记————调优之操作系统以及JVM
    五、Hadoop学习笔记————调优之硬件选择
    四、Hadoop学习笔记————各种工具用法
    三、Hadoop学习笔记————从MapReduce到Yarn
    二、Hadoop学习笔记————架构学习
    一、Hadoop学习笔记————概述
    UTF-8和UTF-8无BOM,一个会导致文件中中文变量无法匹配的bug
    爬虫:用selenium+phantomJS实现简单的登录破解,本文以博客园的登录为例
    运用java接口操作Hadoop文件(一)
    企业级大数据hadoop的安装
  • 原文地址:https://www.cnblogs.com/zwqh/p/11792776.html
Copyright © 2020-2023  润新知