zoukankan      html  css  js  c++  java
  • spring boot项目07:日志

    JDK 8

    spring boot 2.4.5

    ---

    S.B. 使用 Apache Commons Logging 记录日志,但开放了 底层具体日志记录实现,默认的实现提供了 Java Util Logging、Log4j2、Logback。

    日志记录 预先配置为 1)输出到控制台(Console),但可以选择2)输出到文件。

    使用各种 starters 包时,默认使用 Logback记录日志;有些独立的包不使用Logback时,可以通过 Logback路由(Routing) 使之正确输出日志。

    默认日志格式

    输出的日志(下面是 一行):

    2021-08-14 09:30:23.355 [main] INFO  org.springframework.boot.web.embedded.tomcat.TomcatWebServer-Tomcat 
    started on port(s): 8081 (http) with context path ''

    分别是:时间、线程名、级别、完整类名、记录的信息,,各段使用 空格 分隔开。

    日志级别:ERROR, WARN, INFO, DEBUG, TRACE,,严重性 从高到低(↓)。

    改变默认格式:logging.pattern.*

    试验配置 

    # 在 application.properties 配置
    logging.pattern.console=IN console %d{yyyy-MM-dd HH:mm:ss.SSS} ${PID} [%thread] [%+5level] L%+5L %logger{100} M:%msg%n

    效果:

    调试用

    默认只输出 INFO及以上级别 的日志,

    命令行添加 --debug 可以输出 DEBUG及以上日志,更详细,如名所言,调试时可以使用,

    还可以使用 --trace 输出 TRACE及以上 日志,包含内容非常多,,一定是非常特殊的时候才使用(看更具体细节时)。

    以上 两个命令行配置 可以分别使用配置 debug=true、trace=true 替代。

    注:实测发现 输出TRACE级别+ 日志时,配置在 命令行 和 配置文件中的效果不一致——输入内容或有差别(不再详细区分了)。

    输出到文件(简单配置版本)

    添加配置 logging.file.name 或 logging.file.path。

    测试:Windows 10,,新建立 D:logging 文件夹,配置 logging.file.path=d:\logging。

    结果:没有看到日志文件生产。

    原因:盘符下顶级目录不可以处理(疑问,TODO)

    进一步:在 d:\logging 下建立 prj1 文件夹,再配置 logging.file.path=d:\logging\prj1。

    此时启动prj1项目,启动后,可以看到 新配置的目录下的配置文件了——spring.log:

    成功。

    进一步:再配置 logging.file.name,启动项目。

    结果:d:\logging\prj1 中 附加(append)了新的项目日志,,而my.log没有出现在这里

    那么,在哪里呢?项目根目录下(启动项目 的当前目录,Eclipse启动,则是在 项目根目录中)。

    按照 官文 的说明,这两个文件 配置一个即可。

    再进一步:

    不想my.log出现在 项目根目录下的话,如下配置即可实现:

    # 根目录下新建一个 logging 目录来存放 my.log
    logging.file.name=logging/my.log
    
    # 存到了 D:logging 目录下了,,这样的话,就可以取代了 logging.file.path 的作用
    logging.file.name=d:/logging/my.log
    
    # 注意 单斜杠 和 双反斜杠 的使用,Windows下测试是 都支持的。

    上面两个肯定不够 生产使用 啊!生产还需要 更定制化的日志,比如,日志文件名动态变化、每天一个日志文件、不同级别日志输出到不同文件等

    日志归档

    日志超过一定大小后,就压缩保存,压缩文件名称可以配置。

    不同的日志实现组件 会有不同的、灵活的配置,比如,使用Logback的话(默认使用它),可以在 日志文件中使用下面的配置来实现 更复杂的 日志输出需求。

    # 文件名格式
    logging.logback.rollingpolicy.file-name-pattern
    
    logging.logback.rollingpolicy.clean-history-on-start
    logging.logback.rollingpolicy.max-file-size
    logging.logback.rollingpolicy.total-size-cap
    logging.logback.rollingpolicy.max-history
    

    试验配置 logging.logback.rollingpolicy.file-name-pattern=${spring.application.name}.%d{yyyy-MM-dd}.%i.gz,但没有看到 任何 gz文件。

    原来,上面的配置是用来归档使用的,日志超过某个限制了,就建立 gz 文件,而不是 log文本文件。

    再添加下面的配置 logging.logback.rollingpolicy.max-file-size=100KB 就可以看到 各个gz文件了(开启输出 trace日志),这个配置默认 10MB。

    gz文件出现在 项目根目录下:

    注意,这个大小是 压缩后的,配置的max-file-size 是指 压缩前的log文件大小。

    配置中修改日志记录器的日志级别

    单个修改:

    logging.level.<logger-name>=<level>

    <logger-name> 可以简单理解为 包名,配置后,改包下,低于这个<level>的日志不再输出。

    项目启动后,可以通过 Spring Environment对象 查询。

    可以调高,可以降低。

    日志分组:logging.group

    上面是一个一个地修改,使用 日志分组功能,可以一组一组地修改。

    # 官文示例
    logging.group.tomcat=org.apache.catalina,org.apache.coyote,org.apache.tomcat

    先配置 分组,再统一设置 分组中 日志记录器 的级别。

    S.B. 默认有 web、sql 两个日志分组。

    配置 logging.level.web=warn 后,启动时看到更少日志了。

    疑问:既然配置可以修改,是否可以动态修改呢?使用actuator。

    日志关机钩子

    logging.register-shutdown-hook=true

    配置后,关闭项目时,只有一条日志输出,默认情况下,会有两条日志输出。

    更多区别 说不上来了。

    还有什么用呢?

    定制文件配置(Logback)

    使用 org.springframework.boot.logging.LoggingSystem 来选择不同的 日志实现系统,或者 关闭(none,输出了好多日志)。

    这里介绍默认的 Logback 的定制文件配置。可用文件名:

    logback-spring.xml  // 自己使用过,也是官方推荐
    logback-spring.groovy
    logback.xml
    logback.groovy

     建好文件,放到 classpath下即可——/src/main/resources。

    日志配置文件中 可以使用一些 系统属性(System Properties),以下是从 Spring Environment对象 中传来的值(官文 截图):

    如果是 Logback,还有下面的:

    logback-spring.xml 配置技巧:

    1、输出进出ID

    ${PID}

    2、输出行号

    %L

    注:检查了一些 系统包的行号,不准确;自己的包下 还是能很好地定位的。

    3、使用配置中的属性

    配置文件配置 logging.file.name=${spring.application.name},会被转换为 LOG_FILE

    logback-spring.xml 中使用 ${LOG_FILE}。

    搞定。记得之前看过另外的方法的。

    4、%号后的 +、- 、数字 用于对齐

    + 右对齐,

    - 左对齐。

    下面是我自己的一份配置:

    logback-spring.xml
    <?xml version="1.0" encoding="UTF-8"?>
    
    <configuration>
    	<property name="logDir" value="d:/data/spring" />
    	<property name="maxHistory" value="30" />
    	
    	<!-- 控制台输出日志 -->
    	<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    		<encoder>
    			<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ${PID} [%thread] [%+5level] L%+5L %logger{100} M:%msg%n</pattern>
    			<charset class="java.nio.charset.Charset">UTF-8</charset>
    		</encoder>
    	</appender>
    	
    	<!--文件日志, 按照每天生成日志文件 -->
    	<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <!--日志文件输出的文件名-->
                <FileNamePattern>${logDir}/${LOG_FILE}.%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} ${PID} [%thread] [%+5level] L%+5L %logger{100} M:%msg%n</pattern>
            </encoder>
            
            <!--日志文件最大的大小
            <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
                <MaxFileSize>10MB</MaxFileSize>
            </triggeringPolicy>-->
    	</appender>
    	
    	<root level="INFO">
    		<appender-ref ref="STDOUT" />
    		<appender-ref ref="FILE" />
    	</root>
    	
    </configuration>

    更多 Logback 的日志配置,请参考其它文档,会更专业。

    S.B.的Logback扩展项

    特定Profile配置: <springProfile>标签

    官文示例如下

    <springProfile name="staging">
      <!-- configuration to be enabled when the "staging" profile is active -->
    </springProfile>
    <springProfile name="dev | staging">
      <!-- configuration to be enabled when the "dev" or "staging" profiles are active
    -->
    </springProfile>
    <springProfile name="!production">
      <!-- configuration to be enabled when the "production" profile is not active -->
    </springProfile>

    环境变量的使用: <springProperty>标签

    前面提到 logback-spring.xml 中使用 spring.application.name,用了特别的方式来处理。

    而这里使用 <springProperty>标签 即可搞定。

    # 添加
    <springProperty scope="context" name="appName" source="spring.application.name" defaultValue="localhost" />
    
    # 使用 替换前面的 ${LOG_FILE}
    ${appName}

    疑问:

    1)S.B. 默认使用Logback,对于其它 使用 非Logback 的 包,其日志输出 有什么问题?

    2)日志配置生效时机:ApplicationContext 准备好之后吗?那么,之前的日志输出怎么弄的?

    3)slf4j是什么?使用 lombok 时,会用到它的一个 lombok.extern.slf4j.Slf4j,直接就可以使用 log对象 记录日志了。

    ---全文完---

    其实自己对 日志系统 其实是一知半解的,就知道这么用了能输出日志,输出到文件,知道配置格式。

    所以,本文主要参考官文编写,过程中自己又做一些试验,尽量保证准确性。

    继续前进方向:

    1)Logback配置、2)日志怎么搞到ELK、3)日志怎么搞到Kafka做分析 等。

    参考文档

    0、Spring Boot官方手册

    S.B.版本 2.4.5 的 4.4. Logging。

    1、SpringBoot默认日志logback配置解析

    2、Spring Boot 日志各种使用姿势,是时候捋清楚了!

    3、logback日志详细解析

    4、Logback 为日志配置颜色搭配

    5、

  • 相关阅读:
    OpenCV 入门示例之三:AVI 视频播放控制
    CSS3 图标神器 => content:"我是特殊符号"
    【angular5项目积累总结】优秀组件以及应用实例
    基于angular2+ 的 http服务封装
    【angular5项目积累总结】遇到的一些问题以及解决办法
    【angular5项目积累总结】panel组件
    【angular5项目积累总结】http请求服务封装
    【angular5项目积累总结】消息订阅服务
    【angular5项目积累总结】表单复杂校验
    【angular5项目积累总结】列表多选样式框(2)
  • 原文地址:https://www.cnblogs.com/luo630/p/15135821.html
Copyright © 2011-2022 走看看