springboot中配置logback实现打印控制台、写出文件,控制日志级别的方式

介绍

官方简介

Logback是由log4j创始人设计的又一个开源日志组件。
logback当前分成三个模块:logback-core,logback- classiclogback-access
logback-core是其它两个模块的基础模块。logback-classic是log4j的一个 改良版本。此外logback-classic完整实现SLF4J API使你可以很方便地更换成其它日志系统如log4j或JDK14 Logging。logback-access访问模块与Servlet容器集成提供通过Http来访问日志的功能。

它主要是占用空间小执行效率高,还提供了在其他日志框架中没有的独特而有用的特性。

使用方式

StringBoot 项目默认使用 logback 组件作为日志管理。在SpringBoot项目中我们不需要额外的添加logback的依赖,因为在spring-boot-starter或者spring-boot-starter-web中已经包含了logback的依赖。

默认配置

前面说到SpringBoot项目默认使用logback,那么对于logback的配置情况,SpringBoot又是如何定义的呢?

首先,SpringBoot会从resource包下查找logback-spring.xml或logback.xml ,如果这两个都不存在,则会调用BasicConfigurator,创建一个最小化的基本配置。

最小化配置由一个关联到根logger的ConsoleAppender组成,默认输出模式为%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n,root logger级别为DEBUG,所以并不会生成日志文件,只会输出到控制台。

springboot中实现

第一种方式(简单配置)

只需要在 application.yml 文件中配置以下内容即可。

logging:
  level:
    com.boc.ljh.mapper: debug #日志级别
  file:
    name: check.log #文件名 默认位置在当前项目根目录下
  logback:
    rollingpolicy:
      max-file-size: 5MB  #文件大小 超过会创建新文件
      file-name-pattern: check.%d{yyyy-MM-dd}.%i.log #文件名格式
第二种方式(推荐)

1、创建 logback.xml 文件(文件名随意起),我是放在了项目根目录下面。
在这里插入图片描述

logback.xml 文件内容可以直接复制粘贴使用

<?xml version="1.0" encoding="UTF-8"?>
<!--
    scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。
    scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒;当scan为true时,此属性生效。默认的时间间隔为1分钟。
    debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false-->
<configuration scan="true" scanPeriod="10 seconds" debug="false">
    <contextName>logback</contextName>

    <!-- 定义日志的根目录 -->
    <property name="log.path" value="D://checkLogs"/>
    <!-- 定义日志文件名称 -->
    <property name="appName" value="check"/>

    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
    <!-- 定义日志格式 -->
    <property name="CONSOLE_LOG_PATTERN"
              value="%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr([%8.8t]){faint} %clr(%-30.30logger{0}){cyan} %clr(%X{requestId}){faint} %clr(%X{userId}){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/>
    <include resource="org/springframework/boot/logging/logback/console-appender.xml"/>

    <!--1. 输出到控制台-->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>debug</level>
        </filter>
        <encoder>
            <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
            <!-- 设置字符集 -->
            <charset>GBK</charset>
        </encoder>
    </appender>

    <!--2. 输出到文档-->
    <!-- 2.1 level为 DEBUG 日志,时间滚动输出  -->
    <appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在记录的日志文档的路径及文档名 -->
        <file>${log.path}/debug.log</file>
        <!--日志文档输出格式-->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset> <!-- 设置字符集 -->
        </encoder>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 日志归档 -->
            <fileNamePattern>${log.path}/debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文档保留天数-->
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <!-- 此日志文档只记录debug级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>debug</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- 2.2 level为 INFO 日志,时间滚动输出  -->
    <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在记录的日志文档的路径及文档名 -->
        <file>${log.path}/info.log</file>
        <!--日志文档输出格式-->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 每天日志归档路径以及格式 -->
            <fileNamePattern>${log.path}/info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文档保留天数-->
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <!-- 此日志文档只记录info级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>info</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- 2.3 level为 WARN 日志,时间滚动输出  -->
    <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在记录的日志文档的路径及文档名 -->
        <file>${log.path}/warn.log</file>
        <!--日志文档输出格式-->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset> <!-- 此处设置字符集 -->
        </encoder>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文档保留天数-->
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <!-- 此日志文档只记录warn级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>warn</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- 2.4 level为 ERROR 日志,时间滚动输出  -->
    <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在记录的日志文档的路径及文档名 -->
        <file>${log.path}/error.log</file>
        <!--日志文档输出格式-->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset> <!-- 此处设置字符集 -->
        </encoder>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文档保留天数-->
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <!-- 此日志文档只记录ERROR级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>


    <!-- 4. 最终的策略 -->
    <!-- 4.1 开发环境:打印控制台-->
    <springProfile name="dev">
    	<!-- 4.2 com.boc.ljh是包路径-->
        <logger name="com.boc.ljh" level="debug"/>
    </springProfile>

    <root level="info">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="DEBUG_FILE"/>
        <appender-ref ref="INFO_FILE"/>
        <appender-ref ref="WARN_FILE"/>
        <appender-ref ref="ERROR_FILE"/>
    </root>

</configuration>

2、application.yml 中指定 logback 文件

logging:
  config: logback-dev.xml

测试效果

第一种方式

在这里插入图片描述

第二种方式

在这里插入图片描述

### 如何在 Linux 环境下启动 Spring Boot 应用程序时设置日志文件 为了实现这一目标,可以按照以下方法操作: #### 1. 配置 Log4j2 替代默认的日志框架 Spring Boot 默认使用 `logback` 来处理日志记录功能。如果希望切换到 `Log4j2`,则需要先排除掉默认的 `logback` 日志依赖项,并引入 `Log4j2` 的相关依赖。 以下是 Maven 中的相关配置: ```xml <!-- 移除 logback --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> <!-- 添加 Log4j2 支持 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency> ``` 通过上述方式即可完成从 `logback` 到 `Log4j2` 的迁移[^1]。 --- #### 2. 创建 Log4j2 配置文件 为了让应用能够正确写入日志至指定文件,在项目的资源目录 (`src/main/resources`) 下创建名为 `log4j2.xml` 或者 `log4j2.properties` 的配置文件。 下面是一个典型的 XML 格式的 `log4j2.xml` 文件示例: ```xml <?xml version="1.0" encoding="UTF-8"?> <Configuration status="WARN"> <!-- 定义控制台输出 --> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n"/> </Console> <!-- 定义文件输出 --> <File name="LogFile" fileName="/var/log/myapp.log"> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n"/> </File> </Appenders> <!-- 设置根日志级别以及附加器 --> <Loggers> <Root level="info"> <AppenderRef ref="Console"/> <AppenderRef ref="LogFile"/> </Root> </Loggers> </Configuration> ``` 此配置会将日志同时打印控制台和 `/var/log/myapp.log` 文件中。 注意:确保运行该应用程序的用户具有对所选路径(如上例中的 `/var/log/`)的读写权限。 --- #### 3. 使用命令行参数覆盖默认配置 当部署于生产环境或者测试环境中时,可能希望通过外部化的方式调整某些属性而无需修改源码或重新打包项目。可以通过 JVM 参数来动态改变日志位置或其他行为。 例如,假设我们想让日志存储在一个特定的位置而不是固定编码好的地方,则可以在启动脚本里加入如下选项: ```bash java -Dlog.path=/custom/path/to/logs \ -jar my-springboot-app.jar ``` 接着更新之前的 `log4j2.xml` ,利用 `${sys:}` 查找系统变量作为实际值填充进去: ```xml <File name="CustomLogFile" fileName="${sys:log.path}/myapp.log"> ... </File> ``` 这样就实现了灵活设定不同场景下的日志保存地址。 --- #### 4. 自定义 SpringApplication 启动逻辑 除了以上提到的技术细节外,还可以进一步增强灵活性,比如禁用 Banner 显示、加载额外 Profile 等等。这里给出一个简单的例子展示如何定制化 `SpringApplication` 实例的行为: ```java package com.example.demo; import org.springframework.boot.Banner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication app = new SpringApplication(DemoApplication.class); app.setBannerMode(Banner.Mode.OFF); // 关闭 banner 输出 // 可以在此处添加更多个性化初始化代码... app.run(args); } } ``` 这段代码展示了如何手动构建 `SpringApplication` 对象以便更好地掌控其生命周期事件[^2]。 --- ### 总结 综上所述,要在 Linux 平台上成功配置并启用针对 Spring Boot 应用的日志记录机制,需经历三个主要阶段——替换内置日志引擎为 Log4j2;精心设计专属的日志策略文档(log configuration files),最后考虑借助环境变量等方式赋予更大的适应能力给整个解决方案架构体系结构之上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

想养一只!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值