当前位置: 首页 > article >正文

【日常记录-Java】代码配置Logback

1. 简介

        在Logback中,推荐使用配置文件(如logback.xml或logback-spring.xml)来设置日志记录的行为。但在实际应用中,会有动态配置logback的需求。此时可通过编程的方式直接操作LoggerContext以及相关的Logger、Appender、Encoder等组件来实现。

2. 代码示例

// step1: 获取LoggerContext的实例,要求其具体实现为logback(通过SPI指定)
LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();

// step2: 进行设置
try {
    // step2.1: 创建RollingFileAppender并进行配置
    RollingFileAppender<ILoggingEvent> fileAppender = new RollingFileAppender<>();
    fileAppender.setContext(context);
    fileAppender.setFile("/logs/service.log");

    // step2.2: 创建滚动策略
    TimeBasedRollingPolicy<ILoggingEvent> rollingPolicy = new TimeBasedRollingPolicy<>();
    rollingPolicy.setContext(context);
    rollingPolicy.setFileNamePattern("/logs/service.%d{yyyy-MM-dd}.log");
    rollingPolicy.setMaxHistory(30);
    fileAppender.setRollingPolicy(rollingPolicy);
    rollingPolicy.setParent(fileAppender);  // 该条语句非常关键
    rollingPolicy.start();

    // step2.3: 创建Encoder
    PatternLayoutEncoder encoder = new PatternLayoutEncoder();
    encoder.setContext(context);
    encoder.setPattern("%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n");
    encoder.start();
    fileAppender.setEncoder(encoder);

    // step2.4: 创建Filter,设定只输出INFO和ERROR级别
    LevelFilter infoFilter = new LevelFilter();
    infoFilter.setContext(context);
    infoFilter.setLevel(Level.INFO);
    infoFilter.setOnMatch(FilterReply.ACCEPT);
    infoFilter.setOnMismatch(FilterReply.NEUTRAL);
    infoFilter.start();
    LevelFilter errorFilter = new LevelFilter();
    errorFilter.setContext(context);
    errorFilter.setLevel(Level.ERROR);
    errorFilter.setOnMatch(FilterReply.ACCEPT);
    errorFilter.setOnMismatch(FilterReply.DENY);
    errorFilter.start();
    fileAppender.addFilter(infoFilter);
    fileAppender.addFilter(errorFilter);

    // step2.5: 启动FileAppender
    fileAppender.start();

    // step2.6: 配置ROOT的日志级别以及Appender
    context.getLogger(Logger.ROOT_LOGGER_NAME).addAppender(fileAppender);
    context.getLogger(Logger.ROOT_LOGGER_NAME).setLevel(Level.INFO);
} catch (Exception e) {
    throw new RuntimeException(e);
}


http://www.kler.cn/a/392210.html

相关文章:

  • 【数据结构】交换排序——冒泡排序 和 快速排序
  • 大语言模型:解锁自然语言处理的无限可能
  • Axure网络短剧APP端原型图,竖屏微剧视频模版40页
  • 使用 start-local 脚本在本地运行 Elasticsearch
  • 【C++】类与对象的基础概念
  • ElasticSearch学习笔记一:简单使用
  • GitHub每日最火火火项目(11.13)
  • 重学 Android 自定义 View 系列:动手实现专属 TextView
  • Vue3 : Tailwindcss之margin样式类
  • PCL 点云拟合 基于角度约束的Ransac拟合直线
  • C++ 中的异常处理机制是怎样的?
  • 【AI大模型】大型语言模型LLM基础概览:技术原理、发展历程与未来展望
  • C#语言详解:从基础到进阶
  • 国标GB28181视频平台EasyCVR私有化部署视频平台对接监控录像机NVR时,录像机“资源不足”是什么原因?
  • 灰狼优化算法
  • 【WebRTC】视频发送链路中类的简单分析(下)
  • 【STM32】基于SPI协议读写SD,详解!
  • HarmonyOS NEXT应用元服务开发Intents Kit(意图框架服务)技能调用接入方案
  • OpenCV相机标定与3D重建(1)概述
  • AI驱动的个性化购物推荐系统
  • 如何将Photoshop切换为中文界面
  • 46.第二阶段x86游戏实战2-拆解自动打怪流程
  • 一文总结java语法规则
  • 代码修改材质参数
  • 美团代付微信小程序 read.php 任意文件读取漏洞复现
  • 【计算机网络】UDP网络程序