Spring-3-日志管理

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: Spring-3-日志管理
Spring-3-日志管理

1 日志框架简介

我们在开发过程中会经常使用的日志,目前存在很多日志框架:JCL、SLF4J、log4j、logback等等。


日志抽象层 日志实现
SLF4J log4j2、Logback



选择一个日志抽象层框架+日志实现,类似我们使用JDBC选择不同的数据驱动

SpringBoot日志默认设置


  • SLF4J+Logback
  • 默认值输出到控制台
  • 默认级别Level为INFO
  • 默认日志文件大小为10M

输出格式为

2019-03-05 10:57:51.702 INFO 45469 --- [ost-startStop-1] osbcembedded.FilterRegistrationBean:映射过滤器:'hiddenHttpMethodFilter' 到:[/*]


输出以下项目:


日期和时间:毫秒精度,易于排序。


日志级别:ERROR、WARN、INFO、DEBUG或TRACE。


进程标识。


---用于区分实际日志消息开始的分隔符。


线程名称:括在方括号中(可能会被截断以用于控制台输出)。


记录器名称:这通常是源类名称(通常缩写)。


日志消息

2 SpringBoot日志的默认配置

2.1 日志默认级别

新建一个Controller,端口默认为8080

@RestControllerpublic class HelloController {    Logger logger = LoggerFactory.getLogger(HelloController.class);    @RequestMapping("/")    public String index(){        //由低到高 trace<debug<info<warn<error        //可以调整输出的日志级别;日志就只会在这个级别以以后的高级别生效        logger.trace("trace级别的日志");        logger.debug("debug级别的日志");        //SpringBoot默认给我们使用的是info级别的,没有指定级别的就用SpringBoot默认规定的级别;root级别        logger.info("info级别的日志");        logger.warn("warn级别的日志");        logger.error("error级别的日志");        return  "logger info ";    }}


访问http://localhost:8080/后发现控制台输入为:

访问http://localhost:8080/后发现控制台输入为:
INF


我们发现trace和debug级别的日志没有出现,这是因为SpringBoot日志默认级别为Info,日志只显示Info以及这个级别更高级别的日志,日志顺序为trace

logging:  level:    root: trace  #修改日志的级别,默认root是info


访问http://localhost:8080/后发现控制台输入为:

TRACE 21896 --- [nio-8080-exec-2] c.l.s.controller.HelloController        : trace级别的日志DEBUG 21896 --- [nio-8080-exec-2] c.l.s.controller.HelloController        : debug级别的日志INFO 21896 --- [nio-8080-exec-2] c.l.s.controller.HelloController         : info级别的日志WARN 21896 --- [nio-8080-exec-2] c.l.s.controller.HelloController         : warn级别的日志ERROR 21896 --- [nio-8080-exec-2] c.l.s.controller.HelloController        : error级别的日志


2.2 文件输出

默认情况下SpringBoot 日志只在控制台输出,如果想让日志输出到文件,需要设置属性logging.file.name或者logging.file.path


下表对logging.file.name和logging.file.path进行比较



logging.file.name logging.file.path Example Description
(none) (none)
只能在控制台输出
Specific file (none) my.log 写入指定的日志文件。名称可以是确切的位置,也可以是相对于当前目录的位置。
(none) Specific directory /var/log 将spring.log写到制定的文件夹,可以是确切的位置,也可以是相对于当前目录的位置


2.2.1 logging.file.path

logging:  level:    root: info  file:    path: F:\Java_File\myfirst\spring-boot-part3\logs


运行后会在F:\Java_File\myfirst\spring-boot-part3\logs生成spring.log日志文件

2.2.2  logging.file.name

logging:  level:    root: info  file:    #path: F:\Java_File\myfirst\spring-boot-part3\logs    name: my.log


运行后会在该项目下生成my.log日志文件



logging.file.name, logging.file.path 不能同时生效logging.file.name会覆盖logging.file.path

2.3 日志的格式设置

我们先查看一下,默认在控制台的输出:


00933119016b2ff0cd348a08cb5120da.png

%d-时间格式%thread-线程%-5level-从左5字符宽度%logger{50}-日志50个字符%msg-信息%n-换行

application.yml中配置日志格式使用%clr转换字配置颜色

logging:  level:    root: info  file:    #path: F:\Java_File\myfirst\spring-boot-part3\logs    name: my.log  pattern:    console: "%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){yellow} %clr([%thread]){red}  %highlight(%-5level) %logger{50} -%msg%n"    file: "%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){yellow} === %clr([%thread]){red} == %highlight(%-5level) == %logger{50} == %msg%n"


在console和my.log中的结果展示为:

  • 控制台结果

  • .log结果

f5c153747e61ffe151ffac531ce8a53c.png


3 SpringBoot 自定义配置日志文件

Logging System Customization
Logback logback-spring.xml, logback-spring.groovy, logback.xml, or logback.groovy


Log4j2 log4j2-spring.xml or log4j2.xml
JDK (Java Util Logging) logging.properties

配置路径

src/main/resources/
Logback -> logback.xml 或 logback-spring.xml
Log4j2 -> log4j2.xml 或 log4j2-spring.xml
JUL -> logging.properties

新建src/main/resources/logback-spring.xml

<?xml version="1.0" encoding="UTF-8"?><configuration scan="true" scanPeriod="60 seconds" debug="false">    <!-- 属性定义 -->    <!--日志保存路径-->    <property name="LOG_HOME" value="${user.dir}/logs/"/>    <property name="appName" value="OA-SEARCH"/>    <property name="maxHistory" value="90"/>    <!-- 彩色日志依赖的渲染类 -->    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />    <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />    <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />    <property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}" />    <!-- ConsoleAppender 控制台输出日志 -->    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">        <!-- 对日志进行格式化 -->        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">            <pattern>${CONSOLE_LOG_PATTERN}</pattern>            <charset>utf8</charset>        </encoder>    </appender>    <!-- DEBUG日志 -->    <!-- 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件 RollingFileAppender-->    <appender name="DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">         <!-- 对日志进行格式化 -->        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">            <pattern>${CONSOLE_LOG_PATTERN}</pattern>            <charset>utf8</charset>        </encoder>        <!-- 过滤器,记录「所有」级别的日志 -->        <filter class="ch.qos.logback.classic.filter.LevelFilter">            <level>DEBUG</level>            <onMatch>ACCEPT</onMatch>            <onMismatch>DENY</onMismatch>        </filter>        <!-- 滚动策略: 时间 和 大小 -->        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">            <fileNamePattern>${LOG_HOME}/debug/debugLog-%d{yyyy-MM-dd}.%i.txt</fileNamePattern>            <maxFileSize>256MB</maxFileSize>            <maxHistory>${maxHistory}</maxHistory>            <totalSizeCap>20GB</totalSizeCap>        </rollingPolicy>        <encoder>            <pattern>%d{yyyy-MM-dd HH:mm:ss:SSS} [%thread] %-5level %logger{50}\(%F %L\) -%msg%n</pattern>        </encoder>    </appender>    <!-- INFO级别日志 -->    <appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">        <!-- 过滤器,只记录「INFO」级别的日志 -->        <filter class="ch.qos.logback.classic.filter.LevelFilter">            <level>INFO</level>            <onMatch>ACCEPT</onMatch>            <onMismatch>DENY</onMismatch>        </filter>        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">            <fileNamePattern>${LOG_HOME}/info/infoLog-%d{yyyy-MM-dd}.%i.txt</fileNamePattern>            <maxFileSize>256MB</maxFileSize>            <maxHistory>${maxHistory}</maxHistory>            <totalSizeCap>20GB</totalSizeCap>        </rollingPolicy>        <encoder>            <pattern>%d{yyyy-MM-dd HH:mm:ss:SSS} [%thread] %-5level %logger{50}\(%F %L\) -%msg%n</pattern>        </encoder>    </appender>    <!-- WARN级别日志 -->    <appender name="WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">        <!-- 过滤器,只记录「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.SizeAndTimeBasedRollingPolicy">            <fileNamePattern>${LOG_HOME}/warn/warnLog-%d{yyyy-MM-dd}.%i.txt</fileNamePattern>            <maxFileSize>256MB</maxFileSize>            <maxHistory>${maxHistory}</maxHistory>            <totalSizeCap>20GB</totalSizeCap>        </rollingPolicy>        <encoder>            <pattern>%d{yyyy-MM-dd HH:mm:ss:SSS} [%thread] %-5level %logger{50}\(%F %L\) -%msg%n</pattern>        </encoder>    </appender>    <!-- ERROR级别日志 -->    <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">        <!-- 过滤器,只记录「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.SizeAndTimeBasedRollingPolicy">            <fileNamePattern>${LOG_HOME}/error/errorLog-%d{yyyy-MM-dd}.%i.txt</fileNamePattern>            <maxFileSize>256MB</maxFileSize>            <maxHistory>${maxHistory}</maxHistory>            <totalSizeCap>20GB</totalSizeCap>        </rollingPolicy>        <encoder>            <pattern>%d{yyyy-MM-dd HH:mm:ss:SSS} [%thread] %-5level %logger{50}\(%F %L\) -%msg%n</pattern>        </encoder>    </appender>    <!--  MyBatis log configure -->    <logger name="com.apache.ibatis" level="DEBUG"/>    <logger name="org.mybatis.spring" level="DEBUG"/>    <logger name="java.sql.Connection" level="DEBUG"/>    <logger name="java.sql.Statement" level="DEBUG"/>    <logger name="java.sql.PreparedStatement" level="DEBUG"/>    <logger name="druid.sql" level="INFO"/>    <logger name="org.mybatis.spring" level="INFO"/>    <logger name="org.springframework" level="INFO"/>    <logger name="org.springframework.context" level="WARN"/>    <logger name="org.springframework.beans" level="WARN"/>    <logger name="com.baomidou.mybatisplus" level="INFO"/>    <logger name="org.apache.ibatis.io" level="INFO"/>    <!--  自己项目的mapper 路径 -->    <logger name="com.aoke.oa.search" level="INFO"/>    <!-- 根日志,所有日志appender都必须包含在root/logger中,否则不会起作用 -->    <root level="INFO">        <appender-ref ref="STDOUT"/>        <appender-ref ref="DEBUG"/>        <appender-ref ref="INFO"/>        <appender-ref ref="WARN"/>        <appender-ref ref="ERROR"/>    </root></configuration>

启动应用后访问 http://localhost:8080/。控制台结果为:

2022-02-16 19:38:51.776  INFO 11448 --- [nio-8080-exec-1] c.l.s.controller.HelloController         : info级别的日志2022-02-16 19:38:51.776  WARN 11448 --- [nio-8080-exec-1] c.l.s.controller.HelloController         : warn级别的日志2022-02-16 19:38:51.776 ERROR 11448 --- [nio-8080-exec-1] c.l.s.controller.HelloController         : error级别的日志


日志文件结果:



a457d8dd03c5b9dcedd36e72cd4e53ec.png


3.1 使用**使用**查看不同条件日志

修改/logback-spring.xml

    <!-- 根日志,所有日志appender都必须包含在root/logger中,否则不会起作用 -->    <root level="INFO">        <appender-ref ref="STDOUT"/>        <springProfile name="dev">            <appender-ref ref="DEBUG"/>        </springProfile >        <appender-ref ref="INFO"/>        <appender-ref ref="WARN"/>        <springProfile name="production">            <appender-ref ref="ERROR"/>        </springProfile >    </root>

添加VM参数 -Dspring.profiles.active=dev 启动应用后访问 http://localhost:8080/

2022-02-16 19:48:50.000  INFO 14824 --- [nio-8080-exec-4] c.l.s.controller.HelloController         : info级别的日志2022-02-16 19:48:50.000  WARN 14824 --- [nio-8080-exec-4] c.l.s.controller.HelloController         : warn级别的日志2022-02-16 19:48:50.001 ERROR 14824 --- [nio-8080-exec-4] c.l.s.controller.HelloController         : error级别的日志




10807870710ead62d4c28fbbc648dbda.png


发现没有出现debug文件夹控制台也没有出现debug信息


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
5月前
|
消息中间件 存储 Java
手动实现 Spring Boot 日志链路追踪:提升调试效率的利器
【8月更文挑战第8天】在复杂的分布式系统中,日志是诊断问题、追踪系统行为的重要工具。然而,随着微服务架构的普及,服务间的调用链路错综复杂,传统的日志记录方式往往难以快速定位问题源头。今天,我们将探讨如何在不依赖外部组件(如Zipkin、Sleuth等)的情况下,手动实现Spring Boot应用的日志链路追踪,让日志定位更加便捷高效。
213 1
|
6月前
|
存储 SQL Java
Spring Boot使用slf4j进行日志记录
本节课主要对 slf4j 做了一个简单的介绍,并且对 Spring Boot 中如何使用 slf4j 输出日志做了详细的说明,着重分析了 logback.xml 文件中对日志相关信息的配置,包括日志的不同级别...
|
5月前
|
XML Java Maven
Spring5入门到实战------16、Spring5新功能 --整合日志框架(Log4j2)
这篇文章是Spring5框架的入门到实战教程,介绍了Spring5的新功能——整合日志框架Log4j2,包括Spring5对日志框架的通用封装、如何在项目中引入Log4j2、编写Log4j2的XML配置文件,并通过测试类展示了如何使用Log4j2进行日志记录。
Spring5入门到实战------16、Spring5新功能 --整合日志框架(Log4j2)
|
5月前
|
XML Java 数据库
"揭秘!Spring Boot日志链路追踪大法,让你的调试之路畅通无阻,效率飙升,问题无所遁形!"
【8月更文挑战第11天】在微服务架构中,请求可能跨越多个服务与组件,传统日志记录难以全局追踪问题。本文以电商系统为例,介绍如何手动实现Spring Boot应用的日志链路追踪。通过为每个请求生成唯一追踪ID并贯穿全链路,在服务间传递该ID,并在日志中记录,即使日志分散也能通过ID串联。提供了实现这一机制所需的关键代码片段,包括使用过滤器设置追踪ID、业务代码中的日志记录及Logback配置。此方案显著提升了问题定位的效率,适用于基于Spring Boot构建的微服务环境。
123 4
|
5月前
|
人工智能 Java Spring
Spring框架下,如何让你的日志管理像‘AI’一样智能,提升开发效率的秘密武器!
【8月更文挑战第31天】日志管理在软件开发中至关重要,不仅能帮助开发者追踪问题和调试程序,还是系统监控和运维的重要工具。在Spring框架下,通过合理配置Logback等日志框架,可大幅提升日志管理效率。本文将介绍如何引入日志框架、配置日志级别、在代码中使用Logger,以及利用ELK等工具进行日志聚合和分析,帮助你构建高效、可靠的日志管理系统,为开发和运维提供支持。
80 0
|
5月前
|
监控 Java Serverless
美团 Flink 大作业部署问题之想在Serverless平台上实时查看Spring Boot应用的日志要怎么操作
美团 Flink 大作业部署问题之想在Serverless平台上实时查看Spring Boot应用的日志要怎么操作
|
5月前
|
存储 Java Spring
【Azure Spring Cloud】Azure Spring Cloud服务,如何获取应用程序日志文件呢?
【Azure Spring Cloud】Azure Spring Cloud服务,如何获取应用程序日志文件呢?
|
5月前
|
Java Linux C++
【Azure 应用服务】App Service For Linux 部署Java Spring Boot应用后,查看日志文件时的疑惑
【Azure 应用服务】App Service For Linux 部署Java Spring Boot应用后,查看日志文件时的疑惑
|
5月前
|
Java Windows Spring
Spring Boot CMD 运行日志输出中文乱码
Spring Boot CMD 运行日志输出中文乱码
121 0
|
5月前
|
Java Spring
Spring Boot Admin 查看 Client 日志
Spring Boot Admin 查看 Client 日志
85 0