zoukankan      html  css  js  c++  java
  • SpringBoot系列: logging

    我们的 SpringBoot 程序都会加 spring-boot-starter 包, 而该包一个依赖项 spring-boot-starter-logging, 所以SpringBoot 程序不需要再显式增加 spring-boot-starter-logging 包依赖.

    使用 mvn dependency:tree 命令可以分析出应用程序的依赖树, 从中可以看到 spring-boot-starter-logging 包也自动设置了
    slf4j 和 logback 依赖, SpringBoot 使用了 slf4j 日志接口框架, 而 logback 是默认的日志实现框架, springBoot缺省的日志实现是logback, 也可以选用其他日志实现, 比如 log4j, log4j2等, 其中logback完全符合slf4j规范.

    logback log4j 使用方式几乎一样, 功能更强大, 重要体现在:
    1. 可以自动加载配置文件, 这个太好了, 不需要重启系统就能实时调整日志设置.
    2. 配置文件可以支持多个environment.

    SpringBoot程序有一个默认的logback配置, 配置由一个关联到root logger的ConsoleAppender组成, 默认的级别是Debug, 也就是该最小化配置是非常适合程序开发环境.

    SpringBoot 使用 logback 作为日志引擎, 有下面三种方法:
    1. 全部使用 application.property 配置日志输出
    这种做法最简单了, 简单几个属性设置就行了, 适合简单的应用程序.
    2. 使用 logback-spring.xml 配置
    这种做法是最推荐的, 可以支持多环境, 可以支持实时修改日志设置. 当然也可以换个其他名字, 方法是在 application.properties文件中, 设置 logging.config 属性.
    3. 使用 logback.xml 配置
    SpringBoot程序不太推荐logback.xml 配置, Spring Boot包含很多有用的Logback扩展, 这些扩展不能在标准的 logback.xml 配置文件中配置, 因为logback.xml加载的太早了.


    ===============================
    application.property 配置方式
    ===============================

    # springBoot缺省的日志实现是logback, 也可以选用其他日志实现, 比如 log4j, log4j2, 或 none, 其中none是彻底关闭日志. 
    # org.springframework.boot.logging.LoggingSystem=Logback
    # logging.config=classpath:logback-spring.xml
    
    spring.application.name=<your app name here>
    
    # 推荐使用logging.file属性, 而不是 logging.path, 后者仅能指定日志文件的目录, 其文件名永远是spring.log
    logging.file=${java.io.tmpdir}/${spring.application.name}.log
    
    # debug=true
    #当使用debug模式时, SpringBoot和Hibernate等核心组件会输出更多的信息, debug模式下并不会确保我们应用程序能输出DEBUG级别信息. 要想输出com.springbootmybatis.mybatissample包的debug日志, 需要设置 logging.level.com.springbootmybatis.mybatissample=DEBUG
    
    # trace=true  
    # 不要打开 trace , 否则会输出太多的trace日志信息, 日志文件可读性非常差, 同时也会影响性能.  
    
    #root logger的级别, 
    logging.level.root=ERROR 
      
    #其他 class 的级别
    logging.level.org.springframework.web=ERROR
    logging.level.org.hibernate=ERROR
    logging.level.com.springbootmybatis.mybatissample=DEBUG
    
    # 设置高亮error/info日志输出
    spring.output.ansi.enabled=ALWAYS
    # NEVER: 禁用ANSI-colored输出(默认项)
    # DETECT:会检查终端是否支持ANSI,是的话就采用彩色输出(推荐项)
    # ALWAYS:总是使用ANSI-colored格式输出,若终端不支持的时候,会有很多干扰信息,不推荐使用


    ===============================
    logback-spring.xml 配置方式
    ===============================
    如果在application.properties 和 logback-spring.xml 都设置了日志配置, SpringBoot 会用logback-spring.xml覆盖 application.properties 中的配置项.

    application.properties 内容:

    # org.springframework.boot.logging.LoggingSystem=Logback 
    # logging.config=classpath:logback-spring.xml
    spring.profiles.active:prod

    logback-spring.xml 内容:

    注意 configuration tag 的三个重要属性:
    scan: 当此属性设置为 true 时,配置文件如果发生改变,将会被重新加载,默认值为 true.
    scanPeriod: 设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒.当 scan 为 true 时,此属性生效.默认的时间间隔为 1 分钟.
    debug: 当此属性设置为 true 时,将console上打印出 logback 内部日志信息,实时查看 logback 运行状态, 但这些logback内部日志不会记录到log文件中. 默认值为 false. 

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration  scan="true" scanPeriod="60 seconds" debug="false">
       <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
       <include resource="org/springframework/boot/logging/logback/console-appender.xml"/>
    
        <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
        <property name="PROD_LOG_HOME" value="C:\Users\Administrator\logs"  />
        <property name="DEV_LOG_HOME" value="C:\Users\Administrator\logs"  />
        <property name="APP_NAME" value="MyBatisSample"  />
    
        <!-- 测试环境+开发环境. 多个使用逗号隔开. -->
        <springProfile name="test,dev">
    
            <appender name="ROLLING-FILE"
                      class="ch.qos.logback.core.rolling.RollingFileAppender">
                <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                    <!--日志文件输出的文件名-->
                    <FileNamePattern>${DEV_LOG_HOME}/${APP_NAME}.%d{yyyy-MM-dd}.log</FileNamePattern>
                    <!--日志文件保留天数-->
                    <MaxHistory>30</MaxHistory>
                </rollingPolicy>
                 <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
                     <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
                     <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger:%line - %msg%n</pattern>
                 </encoder>
            </appender>
    
            <!-- 日志输出级别 -->
            <root level="INFO">
                <appender-ref ref="CONSOLE" />
                <appender-ref ref="ROLLING-FILE"/>
            </root>
    
            <!-- 自定义Class设置为DEBUG级别, 可以输出MyBatis的SQL和参数 -->
            <logger name="com.springbootmybatis.mybatissample" level="DEBUG" />
    
            <!-- show parameters for hibernate sql 专为 Hibernate 定制 -->
            <logger name="org.hibernate.type.descriptor.sql.BasicBinder"  level="DEBUG" />
            <logger name="org.hibernate.type.descriptor.sql.BasicExtractor"  level="DEBUG" />
            <logger name="org.hibernate.SQL" level="DEBUG" />
            <logger name="org.hibernate.engine.QueryParameters" level="DEBUG" />
            <logger name="org.hibernate.engine.query.HQLQueryPlan" level="DEBUG" />
    
            <!--myibatis log configure-->
            <logger name="java.sql.Connection" level="DEBUG"/>
            <logger name="java.sql.Statement" level="DEBUG"/>
            <logger name="java.sql.PreparedStatement" level="DEBUG"/>
        </springProfile>
    
        <!-- 生产环境. -->
        <springProfile name="prod">
            <appender name="ROLLING-FILE"
                      class="ch.qos.logback.core.rolling.RollingFileAppender">
                <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                    <!--日志文件输出的文件名-->
                    <FileNamePattern>${PROD_LOG_HOME}/${APP_NAME}.%d{yyyy-MM-dd}.log</FileNamePattern>
                    <!--日志文件保留天数-->
                    <MaxHistory>30</MaxHistory>
                </rollingPolicy>
                 <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
                     <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
                     <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger:%line - %msg%n</pattern>
                 </encoder>
            </appender>
    
            <!-- 日志输出级别 -->
            <root level="ERROR">
                <appender-ref ref="ROLLING-FILE"/>
            </root>
    
            <!-- 自定义Class设置为INFO级别, 可以禁止MyBatis的SQL和参数  -->
            <logger name="com.springbootmybatis.mybatissample" level="INFO" />
    
            <!-- show parameters for hibernate sql 专为 Hibernate 定制 -->
            <!--
            <logger name="org.hibernate.type.descriptor.sql.BasicBinder"  level="DEBUG" />
            <logger name="org.hibernate.type.descriptor.sql.BasicExtractor"  level="DEBUG" />
            <logger name="org.hibernate.SQL" level="DEBUG" />
            <logger name="org.hibernate.engine.QueryParameters" level="DEBUG" />
            <logger name="org.hibernate.engine.query.HQLQueryPlan" level="DEBUG" />
            -->
    
            <!--myibatis log configure-->
            <!--
            <logger name="com.apache.ibatis" level="DEBUG"/>
            <logger name="java.sql.Connection" level="DEBUG"/>
            <logger name="java.sql.Statement" level="DEBUG"/>
            <logger name="java.sql.PreparedStatement" level="DEBUG"/>
            -->
        </springProfile>
    </configuration>

    ===============================
    Java 代码中的logger使用
    ===============================
    root logger 是一个所有class logger 的根, 通常我们不需要用代码获取root logger, 直接在logback 配置文件中设置它的logging 输出配置即可, 下面是获取 root logger 和普通class的logger的代码, 注意代码中仅引入了slf4j的类, 而不会引入任何logback的类.

    # MyApp.java
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    Logger rootLogger = LoggerFactory.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME);
    Logger myAppLogger = LoggerFactory.getLogger(MyApp.class)

    ===============================
    参考
    ===============================
    http://tengj.top/2017/04/05/springboot7/
    http://www.hifreud.com/2017/06/27/spring-boot-07-log/
    https://www.mkyong.com/spring-boot/spring-boot-slf4j-logging-example/
    https://www.cnblogs.com/lixuwu/p/5804793.html
    https://howtoprogram.xyz/2016/12/23/how-to-configure-logging-in-spring-boot/
    http://www.cnblogs.com/lixuwu/p/6323739.html

  • 相关阅读:
    CSDN专栏收集
    Android英文文档翻译系列(5)——VPNService
    Android英文文档翻译系列(4)——PopupWindow
    Android英文文档翻译系列(3)——AsyncTask
    Android英文文档翻译系列(2)——HandlerThread
    Android英文文档翻译系列(1)——AlarmManager
    Apktool源码解析——第二篇
    Apktool源码解析——第一篇
    AndroidのBuild工具之Ant动手实践
    Java的switch是否支持String作为参数,还支持哪些类型?
  • 原文地址:https://www.cnblogs.com/harrychinese/p/springboot_logging.html
Copyright © 2011-2022 走看看