故事
首页
指南
  • Java
  • Python
  • Linux
  • 前端
  • Docker
  • 实践
  • 折腾
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
首页
指南
  • Java
  • Python
  • Linux
  • 前端
  • Docker
  • 实践
  • 折腾
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • Java基础

    • String类的深入学习
    • HashMap源码学习
    • Java8新特性回顾
  • Java框架

    • POI事件模式解析并读取Excel文件数据
    • SpringMVC的执行流程源码分析
    • netty+websocket实现即时通讯功能
    • 分布式定时任务解决方案xxl-job
    • spring-session实现集群session共享
    • springcloud优雅下线服务
    • Java日志发展历史
    • Mybatis Generator配置
    • JavaSPI机制和Springboot自动装配原理
    • Spring Cloud Config接入
    • 使用spring validation进行参数校验
    • dubbo接口超时配置
    • ConfigurationProperties注解
    • EasyExcel导出excel
    • swagger+knife4j
    • logback自定义
      • 自定义日志动态输出内容
        • logback-spring.xml
      • 自定义converter
        • logback-spring.xml
      • 自定义filter
        • logback-spring.xml
    • 自定义MybatisPlusGenerator
    • 后端允许跨域配置
  • 中间件

    • 分布式锁解决方案
    • 关于消息中间件MQ
    • kafka学习记录
    • kakfa实践
    • kakfa重复消费问题处理
  • 数据库

    • MySql索引
    • SQL优化学习
    • Otter实现数据全量增量同步
  • 开发工具

    • Maven的生命周期
    • nexus无法下载依赖的问题记录
  • 其他

    • linux服务器安装OpenOffice踩坑
    • POI踩坑-zip file is closed
    • OpenJDK没有jstack等命令的解决办法
    • 微信小程序加密数据对称解密工具类
    • mybatis的classpath配置导致的jar包读取问题
    • feign请求导致的用户ip获取问题记录
    • ribbon刷新服务列表间隔和canal的坑
    • cpu占用率高排查思路
  • 简介
  • java
  • Java框架
storyxc
2023-05-17

logback自定义

# logback自定义

# 自定义日志动态输出内容

可以通过自定义全局拦截器通过MDC存储数据,在logback配置文件中直接通过%X{变量名}读取变量。

/**
 * @author xc
 * @description 全局拦截器
 * @date 2023/5/11 16:13
 */
@Component
@Slf4j
public class GlobalInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 获取当前登录用户信息
        LoginSession loginSession = LoginContext.getLoginSession();
        if (loginSession != null) {
            MDC.put("operator", loginSession.getUserName());
        }else {
            MDC.put("operator", "anonymous");
        }
        return true;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

# logback-spring.xml

<appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <!--日志文件输出格式-->
    <!--%X{operator}可以直接获取当前线程MDC中的operator参数输出到日志中-->
    <encoder>
        <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} %X{operator}  %msg%n</pattern> 
        <charset>UTF-8</charset>
    </encoder>
    ...
</appender>
1
2
3
4
5
6
7
8
9

# 自定义converter

通过自定义转换器来对日志输出的内容进行自定义处理

/**
 * @author xc
 * @description
 * @date 2023/5/23 15:39
 */
public class OperatorConverter extends ClassicConverter {
    @Override
    public String convert(ILoggingEvent event) {
        String operator = event.getMDCPropertyMap().get("operator");
        return StrUtil.isNotBlank(operator) ? "- " + operator + " - " : "";
    }
}

1
2
3
4
5
6
7
8
9
10
11
12
13

# logback-spring.xml

<configuration scan="true" scanPeriod="10 seconds">

    <!--先声明一个转换器-->
    <conversionRule conversionWord="operator" converterClass="com.storyxc.config.logback.converter.OperatorConverter" />
    <!--在输出的pattern中直接使用,此时就不需要用%X{变量}了,直接%conversionWord即可-->
    <!--此时如果MDC中没有operator变量时%operator会输出空串,否则会输出 "- 操作人姓名 - "-->
    <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <!--日志文件输出格式-->
    <encoder>
        <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} %operator%msg%n</pattern> 
        <charset>UTF-8</charset>
    </encoder>
    ...
</appender>
</configuration>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# 自定义filter

/**
 * @author xc
 * @description logback日志过滤器:开发环境下只打印本项目路径下的debug & debug以上级别的日志
 * @date 2023/5/16 20:15
 */
public class LogBackDebugPackageFilter extends AbstractMatcherFilter<ILoggingEvent> {
    private static final String PROJECT_BASE_PACKAGE = "com.storyxc";

    @Override
    public FilterReply decide(ILoggingEvent event) {
        if (!isStarted()) {
            return FilterReply.NEUTRAL;
        }
        Level level = event.getLevel();
        if (level.isGreaterOrEqual(Level.DEBUG)) {
            String loggerName = event.getLoggerName();
            if (level.equals(Level.DEBUG)) {
                if (loggerName != null && loggerName.startsWith(PROJECT_BASE_PACKAGE)) {
                    return FilterReply.ACCEPT;
                } else {
                    return FilterReply.DENY;
                }
            }else {
                return FilterReply.ACCEPT;
            }
        } else {
            return FilterReply.NEUTRAL;
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

# logback-spring.xml

<!--输出到控制台-->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <filter class="com.storyxc.config.logback.LogBackDebugPackageFilter">
    </filter>
    <encoder>
        <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
        <!-- 设置字符集 -->
        <charset>UTF-8</charset>
    </encoder>
</appender>
1
2
3
4
5
6
7
8
9
10
编辑 (opens new window)
#logback
上次更新: 2023/05/23, 18:06:30
swagger+knife4j
自定义MybatisPlusGenerator

← swagger+knife4j 自定义MybatisPlusGenerator→

Theme by Vdoing | Copyright © 2019-2023 story | 豫ICP备19046036号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式