logback java动态配置【动态修改日志级别,动态修改appender】(转)
logback 动态配置
写在前面
在做java日志之前,强烈建议大家读一下这篇java日志的前世今生,对理清java日志框架很有帮助!
1
奉上地址: 一个著名的日志系统是怎么设计出来的
然后说一下,为啥要使用动态日志配置。对于业务系统来讲,有些日志并非必须日志,但是对于调试是很重要的,当我们需要监控一个时段的日志,而过去这个时段,我们便不需要这些日志了,我们就可以通过命令,或者请求,动态开启日志输出,不想要日志时,动态关闭日志即可。
对于试运行阶段的项目,我们需要收集比较详细的日志,当我们认为系统稳定了,没有问题了,就可以动态关闭日志。
再者,有需求,我们的日志输出源发生改变,比如ELK变为了kafka ,我们在不停止服务的情况下,就可以动态操作,修改掉输出对象。
简述java日志框架

spring boot 默认的日志框架为 slf4j+logback 。这里也强烈建议写日志时面向 slf4j(面向接口),几乎目前主流的日志框架(指java日志框架)都实现了slf4j,因此面向slf4j写日志,日志框架非常容易迁移。
例如将log4j2 迁移为 logback ,只需要修改部分配置文件即可。
logback的执行步骤 :

logback的主要对象
| 对象 | 简述 |
| LoggerContext | logback的核心对象,加载配置文件,存储loggerList……是log back的核心容器 |
| Logger | 这个Logger为logback的logger 它实现了slf4j的Logger对象,除了实现了所有的logger方法外,我们动态配置日志输出源,也需要里面的 addAppender(),detachAppender()方法 |
| Appender | 日志输出的最终实现, doAppend(E e)方法,最终实现了日志的输出,如果自定义appender 需要最终实现该接口 |
注:以上对象并非logback全部核心对象,对于今天的日志动态输出,仅仅涉及到以上核心对象。
实现logback 动态改变日志级别
实现流程如下 :

下面附上测试源代码:
1 package com.kgo.logger.logback;
2
3 import ch.qos.logback.classic.Level;
4 import ch.qos.logback.classic.LoggerContext;
5 import com.kgo.logger.appender.DemoAppender;
6 import org.slf4j.Logger;
7 import org.slf4j.LoggerFactory;
8
9 public class ContextTest {
10 public static final String demoApName = "demo";
11 public static void main(String[] args) {
12 // 定义日志输出
13 Logger logger = LoggerFactory.getLogger(ContextTest.class);
14 logger.debug("=== 我输出了 === ");
15 // 第一步:获取日志上下文
16 LoggerContext lc = (LoggerContext)LoggerFactory.getILoggerFactory();
17 // 第二步:获取日志对象 (日志是有继承关系的,关闭上层,下层如果没有特殊说明也会关闭)
18 ch.qos.logback.classic.Logger logbackLogger = lc.getLogger("com.kgo.logger.logback");
19 ch.qos.logback.classic.Logger rootLogger = lc.getLogger("root");
20 // 第三步:修改日志级别
21 logbackLogger.setLevel(Level.INFO);
22 logger.debug("===== 我是 debug =====");
23 logger.info("===== 我是 info =====");
24 logger.error("===== 我是 ERROR =====");
25 }
26 }
输出结果如下:

可以看到 日志级别修改为INFO之后,日志 “===== 我是 debug =====” 没有输出
logback 基本选择规则如下 :

动态添加删除 appender
实现步骤和 修改日志级别基本一致,流程如下:

附上测试代码:
1 package com.kgo.logger.logback;
2
3 import ch.qos.logback.classic.LoggerContext;
4 import org.slf4j.Logger;
5 import org.slf4j.LoggerFactory;
6
7 public class ChangeAppender {
8 public static final String demoApName = "demo";
9 public static void main(String[] args) {
10 // 定义日志输出
11 Logger logger = LoggerFactory.getLogger(ContextTest.class);
12 logger.debug("=== 我输出了 === \n ");
13 // 第一步:获取日志上下文
14 LoggerContext lc = (LoggerContext)LoggerFactory.getILoggerFactory();
15 // 第二步:获取日志对象 (日志是有继承关系的,关闭上层,下层如果没有特殊说明也会关闭)
16 ch.qos.logback.classic.Logger logbackLogger = lc.getLogger("com.kgo.logger.logback");
17 ch.qos.logback.classic.Logger rootLogger = lc.getLogger("root");
18 // 第三步:移除 appender
19 logbackLogger.detachAppender("STDOUT");
20 logger.debug("仅仅移除 com.kgo.logger.logback 的 appender");
21 logger.debug("===== 我是 debug =====");
22 logger.info("===== 我是 info =====");
23 logger.error("===== 我是 ERROR =====");
24 rootLogger.detachAppender("STDOUT");
25 logger.debug("\n 仅仅移除root 的 appender");
26 logger.debug("===== 我是 debug =====");
27 logger.info("===== 我是 info =====");
28 logger.error("===== 我是 ERROR =====");
29
30 }
31 }
在执行这段代码的时候我在本地已经配置的 logback-test.xml ,其中 “STDOUT” 便是在该文件中做的配置,配置如下:
1 <configuration>
2 <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
3 <encoder>
4 <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
5 </encoder>
6 </appender>
7
8 <root level="debug">
9 <appender-ref ref="STDOUT" />
10 </root>
11 <logger name="com.kgo.logger.logback" level="DEBUG" >
12 <appender-ref ref="STDOUT" />
13 </logger>
14 </configuration>
输出结果如下:

- 在配置文件里配置了两个 Logger ,都输出给 STDOUT appender ,因此 “ === 我输出了 === ” 被打印了两次,
- 当我移除掉了名字为 “ com.kgo.logger.logback” Logger的Appender , 下面的 日志仅输出了一次 (Root 的输出),
- 当将root的appender 也移除掉后,日志不在输出(没有了输出对象)。
就先分享到这里,接下里会写一篇 自定义appender ,并且动态添加append的 博客 ,本系列的博客目标 为 实现 日志的 全自动化
包括:收集,上传,分类 ,自定义字段,实时更新,elk 等。
如果感觉有用,点个赞再走吧,大佬
------------------------------------------------------- 这就是我的底线了 --------------------------------------------------------------
————————————————
版权声明:本文为CSDN博主「keep-go-on」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_26462567/article/details/103065029
logback java动态配置【动态修改日志级别,动态修改appender】(转)的更多相关文章
- log4j2和logback动态修改日志级别工具类
工作中,在排查线上问题时,有以下场景在不重新部署或重启服务的情况下,需要动态调整线上日志级别 1.线上有些日志打印过多干扰有用的日志,需要动态修改线上日志记录器的打印日志级别,调高一些日志级别,打印出 ...
- logback日志级别动态切换的终极方案(asm使用)
背景 一切皆有因果,所有事情,都有事件驱动.本方案的日志级别切换是由这样的背景下产生的: 单个生产环境上,有几百近千个微服务 日志级别切换不重启服务,要求即时生效果 由业务开发人员去修改代码或增加相关 ...
- SpringBoot系列十一:SpringBoot整合Restful架构(使用 RestTemplate 模版实现 Rest 服务调用、Swagger 集成、动态修改日志级别)
声明:本文来源于MLDN培训视频的课堂笔记,写在这里只是为了方便查阅. 1.概念:SpringBoot整合Restful架构 2.背景 Spring 与 Restful 整合才是微架构的核心,虽然在整 ...
- log4j2动态修改日志级别及拓展性使用
一.供参考的完整日志配置 <?xml version="1.0" encoding="UTF-8"?> <!-- 配置LoggerConfig ...
- springboot动态修改日志级别+权限认证
1. springboot动态修改日志级别+权限认证 1.1. 需求 网上找到的动态修改日志级别的方式,基本都是没有权限验证的,或者特地关闭权限验证,但也没给出加上验证的解决方式 修改日志等级也是一个 ...
- [C#] 将NLog输出到RichTextBox,并在运行时动态修改日志级别过滤
作者: zyl910 一.缘由 NLog是一个很好用的日志类库.利用它,可以很方便的将日志输出到 调试器.文件 等目标,还支持输出到窗体界面中的RichTextBox等目标. 而且它还支持在运行时修改 ...
- Spring Boot动态修改日志级别
1. pom中引入 org.springframework.boot spring-boot-starter-actuator 2. 发送POST请求: 地址: http://[服务地址] ...
- 操作实践:Java桌面程序实现日志级别热修改
声明:迁移自本人CSDN博客https://blog.csdn.net/u013365635 定位问题的时候往往需要动态修改日志级别并且不能影响业务的正常运行,也就是不能重启应用,此时就要使用到动态日 ...
- JBoss6.1.0修改启动jvm内存以及修改日志级别【转】
转自 JBoss6.1.0修改启动jvm内存以及修改日志级别 - liangbinny的专栏 - 博客频道 - CSDN.NEThttp://blog.csdn.net/liangbinny/arti ...
- jenkins修改日志级别方法
1.jenkins日志有时候也会消耗掉很大内存,在传输时也会消耗掉大量带宽,如图,300+M的日志大小,太夸张了吧 2.修改日志级别的方法: 在配置文件里修改,重启后永久生效,配置路径:/etc/sy ...
随机推荐
- Linux设置字符编码
一.Linux设置字符编码 1.什么是字符编码 字符编码可以实现对非英文字符的支持,防止非英文字符的乱码. 2.国内常用的字符编码 UTF-8 GBK 3.设置字符编码 我们可以对Linux系统的字符 ...
- golang channel 未关闭导致的内存泄漏
现象 某一个周末我们的服务 oom了,一个比较重要的job 没有跑完,需要重跑,以为是偶然,重跑成功,因为是周末没有去定位原因 又一个工作日,它又oom了,重跑成功,持续观察,job 在oom之前竟然 ...
- 2021-3-29 Enter按下事件
先在构造器中添加keydown事件 tBoxPsw.KeyDown += TBoxPsw_KeyDown; 在事件中添加按下enter按钮所触发的方法 private void TBoxPsw_Key ...
- 【go语言】1.1.2 Go 语言的特性
1. 简洁的语法 Go 语言的语法设计上非常简洁明了,没有复杂的继承和泛型,也没有异常处理,但这并不影响它的功能性和表达力.这使得 Go 语言容易学习和使用. 例如,以下是一个简单的 Go 函数,用于 ...
- 新一代开源流数据湖平台Apache Paimon入门实操-上
@ 目录 概述 定义 核心功能 适用场景 架构原理 总体架构 统一存储 基本概念 文件布局 部署 环境准备 环境部署 实战 Catalog 文件系统 Hive Catalog 创建表 创建Catalo ...
- centos7安装weblogic
前言 简介:weblogic是java应用服务器软件的一种,类似于tomcat,但功能更多,适用于大型应用场景. 版本: 系统:centos 7(最小化安装,无图形化界面) jdk: oraclejd ...
- 解决Avalonia 11.X版本的中文字体问题
网上搜索的方法使用接口"IFontManagerImpl"这个方法目前只能用于Avalonia 10.X版本,因为11版本后官方把这个接口的成员都设置成了非plubic,所以之前的 ...
- Effective C++ 笔记(二)
16.保证异常安全 1 void PrettyMenu::changBackground(std::istream &imgSrc) 2 { 3 lock(&mutex); 4 del ...
- Python怎么通过url下载网络文件到本地
以下代码演示Python怎么从网络下载一个文件至本地并保存在当前文件夹download import os import requests from urllib.parse import urlpa ...
- 【译】.NET 8 拦截器(interceptor)
通常情况下,出于多种原因,我不会说我喜欢写关于预览功能的文章.我的大多数帖子旨在帮助人们解决他们可能遇到的问题,而不是找个肥皂盒或打广告.但是我认为我应该介绍这个 .NET 预览特性,因为它是我在 . ...