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

【日常记录-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: 创建EncoderPatternLayoutEncoder 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: 启动FileAppenderfileAppender.start();// step2.6: 配置ROOT的日志级别以及Appendercontext.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.lryc.cn/news/483492.html

相关文章:

  • HTTP常见的请求头有哪些?都有什么作用?在 Web 应用中使用这些请求头?
  • 电信数据清洗案例:利用MapReduce实现高效数据预处理
  • react 中 FC 模块作用
  • 多模态大模型(1)--CLIP
  • opencv入门学习总结
  • C/C++内存管理 | new的机制 | 重载自己的operator new
  • 知识库管理系统:企业数字化转型的加速器
  • uniapp 如何使用vuex store (亲测)
  • [编译报错]ImportError: No module named _sqlite3解决办法
  • 【旷视科技-注册/登录安全分析报告】
  • python学习记录16
  • AI 大模型在软件开发中的角色
  • React中类组件和函数组件的理解和区别
  • Day62||prim算法精讲 |kruskal算法精讲
  • upload-labs通关练习
  • wordpress搭建主题可配置json
  • RWKV-5/6 论文被 COLM 2024 收录
  • MinIO分片下载超大文件
  • Vue3 -- 新组件【谁学谁真香系列6】
  • Openstack3--本地仓库搭建(ftp源搭建失败)
  • 【初阶数据结构与算法】链表刷题之移除链表元素、反转链表、找中间节点、合并有序链表、链表的回文结构
  • 【PGCCC】Postgresql Toast 原理
  • vue3使用element-plus,树组件el-tree增加引导线
  • AlphaFold3中文使用说明
  • 使用@react-three/fiber,@mkkellogg/gaussian-splats-3d加载.splat,.ply,.ksplat文件
  • Koa进阶:掌握中间件和参数校验的艺术
  • 开源共建 | 长安链开发常见问题及规避
  • 【网络】深入理解 HTTPS:确保数据传输安全的核心协议
  • C/C++中使用MYSQL
  • 【GD32】(一) 开发方式简介及标准库开发入门