0
点赞
收藏
分享

微信扫一扫

Logback 学习

一枚路过的程序猿 2022-01-07 阅读 29

目录

1. 简介

2. 项目结构

3. 配置文件

3.1 Maven

<properties>
	<slf4j.version>1.7.32</slf4j.version>
    <logback.version>1.2.5</logback.version>
</properties>
<dependencies>
	<!-- slf4j -->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>${slf4j.version}</version>
    </dependency>

    <!-- logback -->
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-core</artifactId>
        <version>${logback.version}</version>
    </dependency>
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>${logback.version}</version>
    </dependency>
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-access</artifactId>
        <version>${logback.version}</version>
    </dependency>
</dependencies>

3.2 logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <contextName>${APP_NAME}</contextName>
    <springProperty name="APP_NAME" scope="context" source="spring.application.name"/>
    <springProperty name="LOG_FILE" scope="context" source="logging.file" defaultValue="../logs"/>
    <springProperty name="LOG_POINT_FILE" scope="context" source="logging.file" defaultValue="../logs/point"/>
    <springProperty name="LOG_MAXFILESIZE" scope="context" source="logback.filesize" defaultValue="50MB"/>
    <springProperty name="LOG_FILEMAXDAY" scope="context" source="logback.filemaxday" defaultValue="7"/>
    <springProperty name="ServerIP" scope="context" source="spring.cloud.client.ip-address" defaultValue="0.0.0.0"/>
    <springProperty name="ServerPort" scope="context" source="server.port" defaultValue="0000"/>

    <!-- 彩色日志 -->
    <!-- 彩色日志依赖的渲染类 -->
    <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="[${APP_NAME}:${ServerIP}:${ServerPort}] [%clr(%X{traceId}){yellow},%clr(%X{X-B3-TraceId}){yellow}] %clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(%level){blue} %clr(${PID}){magenta} %clr([%thread]){orange} %clr(%logger){cyan} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/>
    <property name="CONSOLE_LOG_PATTERN_NO_COLOR"
              value="[${APP_NAME}:${ServerIP}:${ServerPort}] [%X{traceId},%X{X-B3-TraceId}] %d{yyyy-MM-dd HH:mm:ss.SSS} %level ${PID} [%thread] %logger %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/>

    <!-- 控制台日志 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <withJansi>true</withJansi>
        <encoder>
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <filter class="com.demo.example.config.MyLogBackFilter"/>
    </appender>

    <!-- 按照每天生成常规日志文件 -->
    <!-- 不用的时候注释掉,防止生成无用的空白文件 -->
<!--    <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">-->
<!--        <file>${LOG_FILE}/${APP_NAME}-error.log</file>-->
<!--        &lt;!&ndash; 基于时间的分包策略 &ndash;&gt;-->
<!--        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">-->
<!--            <fileNamePattern>${LOG_FILE}/${APP_NAME}-error.%d{yyyy-MM-dd}.%i.log</fileNamePattern>-->
<!--            <maxFileSize>100MB</maxFileSize>-->
<!--            &lt;!&ndash;保留时间,单位:天&ndash;&gt;-->
<!--            <maxHistory>60</maxHistory>-->
<!--        </rollingPolicy>-->
<!--        <encoder>-->
<!--            <pattern>${CONSOLE_LOG_PATTERN_NO_COLOR}</pattern>-->
<!--            <charset>UTF-8</charset>-->
<!--        </encoder>-->
<!--        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">-->
<!--            <MaxFileSize>100MB</MaxFileSize>-->
<!--        </triggeringPolicy>-->
<!--        <filter class="ch.qos.logback.classic.filter.LevelFilter">&lt;!&ndash; 只打印错误日志 &ndash;&gt;-->
<!--            <level>ERROR</level>-->
<!--            <onMatch>ACCEPT</onMatch>-->
<!--            <onMismatch>DENY</onMismatch>-->
<!--        </filter>-->
<!--    </appender>-->

    <!-- 按照每天生成常规日志文件 -->
    <!-- 不用的时候注释掉,防止生成无用的空白文件 -->
<!--    <appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">-->
<!--        <file>${LOG_FILE}/${APP_NAME}-info.log</file>-->
<!--        &lt;!&ndash; 基于时间的分包策略 &ndash;&gt;-->
<!--        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">-->
<!--            <fileNamePattern>${LOG_FILE}/${APP_NAME}-info.%d{yyyy-MM-dd}.%i.log</fileNamePattern>-->
<!--            <maxFileSize>100MB</maxFileSize>-->
<!--            &lt;!&ndash;保留时间,单位:天&ndash;&gt;-->
<!--            <maxHistory>60</maxHistory>-->
<!--        </rollingPolicy>-->
<!--        <encoder>-->
<!--            <pattern>${CONSOLE_LOG_PATTERN_NO_COLOR}</pattern>-->
<!--            <charset>UTF-8</charset>-->
<!--        </encoder>-->
<!--        <filter class="ch.qos.logback.classic.filter.LevelFilter">-->
<!--            <level>INFO</level>-->
<!--            <onMatch>ACCEPT</onMatch>-->
<!--            <onMismatch>DENY</onMismatch>-->
<!--        </filter>-->
<!--    </appender>-->

    <!-- 按照每天生成常规日志文件 -->
    <appender name="ALL" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_FILE}/${APP_NAME}/${APP_NAME}.jar.log</file>
        <!-- 基于时间的分包策略 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_FILE}/${APP_NAME}/${APP_NAME}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxFileSize>100MB</maxFileSize>
            <!--保留时间,单位:天-->
            <maxHistory>60</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${CONSOLE_LOG_PATTERN_NO_COLOR}</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!-- 增加无关日志的显示等级 -->
    <logger name="com.ulisesbocchio" level="INFO"/>
    <logger name="com.netflix" level="INFO"/>
    <logger name="com.zaxxer.hikari" level="INFO"/>
    <logger name="com.baomidou" level="INFO"/>
    <logger name="org" level="INFO"/>
    <logger name="_org" level="INFO"/>
    <logger name="io" level="INFO"/>

    <!-- 设置输出级别 -->
    <!-- 如果不需要根据环境区分配置,则不需要使用springPorfile -->
<!--    <root>-->
<!--        <appender-ref ref="STDOUT"/>-->
<!--        <appender-ref ref="ALL"/>-->
<!--    </root>-->

    <!-- 根据环境区分 -->
    <!-- 设置输出级别,开发环境(根据spring.profiles.active判断) -->
    <springProfile name="dev">
        <root level="DEBUG">
            <appender-ref ref="STDOUT"/>
            <appender-ref ref="ALL"/>
<!--            <appender-ref ref="ERROR"/>-->
<!--            <appender-ref ref="INFO"/>-->
        </root>
    </springProfile>

    <!-- 设置输出级别,生产环境(根据spring.profiles.active判断) -->
    <springProfile name="prod">
        <root level="DEBUG">
<!--            <appender-ref ref="STDOUT"/>-->
            <appender-ref ref="ALL"/>
<!--            <appender-ref ref="ERROR"/>-->
<!--            <appender-ref ref="INFO"/>-->
        </root>
    </springProfile>
</configuration>

3.3 application.yml

spring:
  application:
    name: spring-boot-logback # 用于生成日志文件名
  profiles:
    active: dev # 用于根据环境输出不同日志级别

4. 自定义输出级别

import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.filter.Filter;
import ch.qos.logback.core.spi.FilterReply;

/**
 * <p> @Title MyLogBackFilter
 * <p> @Description 定制控制台日志过滤器
 *
 * @author ACGkaka
 * @date 2022/1/6 11:15
 */
public class MyLogBackFilter extends Filter<ILoggingEvent> {
    @Override
    public FilterReply decide(ILoggingEvent event) {
        // 指定打印日志类(供控制台用)
        if (event.getLoggerName().contains("org.springframework.boot")
                && !event.getLoggerName().contains("org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration")
                && !event.getLoggerName().contains("org.springframework.boot.autoconfigure.security.reactive.ReactiveUserDetailsServiceAutoConfiguration")) {
            // 打印启动信息
            return FilterReply.ACCEPT;
        } else if (event.getLevel().equals(Level.ERROR)) {
            // 打印异常信息
            return FilterReply.ACCEPT;
        } else {
            return FilterReply.DENY;
        }
    }
}

5. 项目地址

Github:https://github.com/ACGkaka/SpringBootExamples/tree/main/springboot-logback

测试地址:http://localhost:8080/tUser/findAll

6. 部分内容没有输出到日志文件中问题处理

e.printStackTrace() 和 System.out.println() 不会输出到日志。

如果要输出到日志,需要增加如下依赖:

<!-- System.out System.err 转 info -->
<dependency>
    <groupId>uk.org.lidalia</groupId>
    <artifactId>sysout-over-slf4j</artifactId>
    <version>1.0.2</version>
</dependency>

启动类中进行如下设置:

public static void main(String[] args) {
    // 加入这行代码时system.out输出为info日志
    SysOutOverSLF4J.sendSystemOutAndErrToSLF4J();
    // 启动应用
    SpringApplication.run(SpringbootDemoApplication.class, args);
}

整理完毕,完结撒花~ 🌻

举报

相关推荐

0 条评论