- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Logback 使用TurboFilter实现日志级别等内容的动态修改操作由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
可能看到这个标题,读者会问:要修改日志的级别,不是直接修改log.xxx就好了吗?为何要搞那么复杂呢?所以,先说一下场景 。
我们在使用Java开发各种项目的时候必然的会引入很多框架,这些框架通过堆叠的方式完成所要提供的业务服务(一个服务请求在进入后会在这些框架中兜一圈,然后返回结果),当一个比较底层的框架在处理过程中抛出了异常之后,这个异常会不断的向上传递.
这个时候,有的框架直接throw,继续向上抛,而有的在throw之前还会自己打印一下error日志,这就导致了当出现异常的时候,往往会出现一连串类似的错误日志记录。如果对接了错误日志告警,就会出现重复告警的现象。为了解决类似这样的问题,修改源码重新编译最直接,但是不可取.
所以希望可以有更好的手段去控制这些已经被编码固化的日志打印信息。当我们使用Logback的时候,TurboFilter就是解决该问题的工具之一.
TurboFIlter不同于之前在[《Logback中如何自定义灵活的日志过滤规则》]一文中介绍的那些通过ch.qos.logback.core.filter.Filter接口实现的过滤器。ch.qos.logback.core.filter.Filter实现的过滤器是与Appender绑定的,而TurboFIlter是与日志上下文绑定的,它会过滤所有的日志请求,并且TurboFIlter的方法中提供了丰富的可访问信息用来进行控制和改写.
比如下面的实现,通过继承ch.qos.logback.classic.turbo.TurboFilter类,并重写decide方法,将org.springframework.cloud.sleuth.instrument.web.ExceptionLoggingFilter类中原本要打印的ERROR日志DENY掉(过滤掉),同时以WARN级别打印一封相同的内容,这样就实现了对已定义日志的动态修改.
1
2
3
4
5
6
7
8
9
10
|
public
class
ForceWarnFilter
extends
TurboFilter {
@Override
public
FilterReply decide(Marker marker, Logger logger, Level level, String format, Object[] params, Throwable throwable) {
if
(level == Level.ERROR && logger.getName().equals(
"org.springframework.cloud.sleuth.instrument.web.ExceptionLoggingFilter"
)) {
logger.warn(marker, format, params);
return
FilterReply.DENY;
}
return
FilterReply.NEUTRAL;
}
}
|
为了让上面定义的过滤器生效,需要在logback的配置xml中增加如下配置:
1
2
3
4
|
<
configuration
>
<
turboFilter
class
=
"com.didispace.log.filter.ForceWarnFilter"
/>
......
</
configuration
>
|
或者也可以在应用主类中增加:
1
2
|
LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
lc.addTurboFilter(
new
MyTurboFilter());
|
更多关于Logback过滤器的内容可参考官方文档 。
你调别人的接口出问题了,但是怎么排查都定位不了原因。只能借助更详细的日志信息,这个时候,又不想把全局的日志级别调低,毕竟调低对并发量大的应用来说,瞬间会涌出很多很多日志信息.
最好的情况就是,只调整出问题的那个类的日志级别。那怎么办呢?
定向修改某个class的logger日志级别.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
public
void
testLog(String key, String level, String level2){
LoggerContext loggerContext= (LoggerContext) LoggerFactory.getILoggerFactory();
//设置全局日志级别
ch.qos.logback.classic.Logger logger=loggerContext.getLogger(
"root"
);
logger.setLevel(Level.toLevel(level));
if
(!StringUtils.isBlank(level2)) {
//设置某个类日志级别-可以实现定向日志级别调整
ch.qos.logback.classic.Logger vLogger = loggerContext.getLogger(key);
if
(vLogger!=
null
)
vLogger.setLevel(Level.toLevel(level2));
}
List<ch.qos.logback.classic.Logger> loggerList = loggerContext.getLoggerList();
for
(ch.qos.logback.classic.Logger logger1 : loggerList){
log.info(logger1.getName());
}
}
|
比如:
1
2
3
|
level = ERROR
level2 = INFO
key =
"com.duy.soo.web.controller.TestController"
|
表示把全局日志级别设置为ERROR级别,单独把com.duy.soo.web.controller.TestController类的日志设置为INFO级别.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
/**
* @Author changle
* @Time 17/6/30.
* @Desc to do
*/
@Slf4j
@Controller
@RequestMapping
(value =
"/api/test"
)
public
class
TestController {
@RequestMapping
(
"/testDebug"
)
@ResponseBody
public
Response<String> testLog(String key){
//打印日志级别
String rtn =
"this is a INFO"
;
log.info(rtn);
rtn =
"this is a ERROR"
;
log.error(rtn);
rtn =
"this is a DEBUG"
;
log.debug(rtn);
Response<String> response = Response.ok(rtn);
return
response;
}
}
|
如此一来,除了com.duy.soo.web.controller.TestController类以外的其他类,都只输出ERROR日志,而TestController类能输出INFO日志信息.
以上为个人经验,希望能给大家一个参考,也希望大家多多支持我.
原文链接:https://www.cnblogs.com/didispace/p/10004088.html 。
最后此篇关于Logback 使用TurboFilter实现日志级别等内容的动态修改操作的文章就讲到这里了,如果你想了解更多关于Logback 使用TurboFilter实现日志级别等内容的动态修改操作的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在尝试使用 janino 的条件处理来删除冗余的 logback 配置文件。 下面是我添加的条件逻辑
我有三个独立的项目,每个项目都有自己的嵌入式 logback.xml 文件。这些文件中的每一个都在用户的主目录中包含一个通用的日志配置文件: 在包含之后,我有这个规范: 这允许用户配置
我使用这个logback配置文件: %d{HH:mm:ss.SSS} [%-10.-10thread] %-5level %-30logger{1} - %msg%n
我的公司有一个环境管理工具,使您能够以 Java 编程方式从环境中查找属性。我想利用这个工具来配置 logback。例如,假设我有一个如下的 logback.xml(特别是文件 appender 部分
这似乎是一个粗心的错误,但我似乎找不到原因。使用 logback/slf4j(最新版本 slf4j-api-1.6.1,logback core/classic 0.9.24)进行记录。最简单的测试日
这是经典的logback的错误还是我遗漏了一些东西? The documentation非常明确地表明scanPeriod是可选属性: By default, the configuration fi
我正在尝试设置一个 logback 配置,该配置创建一个解压缩的日志文件作为第一卷,然后将压缩文件写入不同的目录。我相信最好的方法是在单个 appender 中创建多个 rollingPolicy 元
我用各种框架(jsf、Spring、Hibernate)编写了一个网络应用程序,我的记录器库是 Logback 和 slf4j。 目前我无法在日志文件中显示未捕获的异常(例如 NullPointers
这似乎是一个粗心错误,但我似乎找不到原因。使用 logback/slf4j 进行日志记录(最新版本 slf4j-api-1.6.1、logback core/classic 0.9.24)。用于测试的
我需要能够在事件中搜索多种模式中的任何一种,并用屏蔽值替换模式中的文本。这是我们应用程序中的一项功能,旨在防止敏感信息落入日志中。由于信息可能来自多种来源,因此对所有输入应用过滤器是不切实际的。此外,
我怎样才能创建一个 RollingFileAppender在接受谨慎标志的 Logback 中,还允许我指定日志文件的位置? 我尝试了以下操作,但正如我从文档中了解到的,logback 不支持 fil
我在文档中看不到任何相关内容,但收到以下异常 Failed to instantiate [ch.qos.logback.classic.LoggerContext] Reported excepti
我是 Logback 的新手,我正在尝试为 Windows 和 Linux 动态添加带有属性文件的文件路径。 这是我拥有的代码 sinppet,我怎样才能获得 ${MY_HOME} 的值 $
由于我必须登录到自定义(单个)数据库表,我编写了一个自定义 logback appender,扩展了 logback DBAppender . 我有一些单元测试来验证 appender 是否正常工作,
我正在尝试在 micronaut 中设置访问日志,但是,由于 logback-access 库使用 servlet 过滤器,我没有看到直接的方法。有不同的解决方案吗?一些隐藏的 Micronaut 配
我想使用 slf4j+logback 来登录 JBossAS7。 此外,我必须解决以下要求: 我需要在多个已部署的应用程序/EAR 中共享一个 logback 配置/上下文 我需要在运行时更改 log
我已经使用 LogbackValve 为 Tomcat 7.0 启用了 logback-access 日志。我的 logback-access 配置如下所示。 access.lo
我正在开发一个应用程序,使用我的另一个项目作为 Maven 依赖项。 期望 我希望我的依赖项使用自己的 logback.xml 来登录自己的文件。我希望应用程序使用自己的 logback.xml 文件
我在给定的 tomcat 中运行了许多相同的应用程序,它们都在不同的 URL 和 web.xml 文件下。 我想为每个文件创建一个相同的logback.xml。但我希望模式中包含服务器名称或显示名称。
它正在输出到控制台。logger.info("你好,世界信息。");//工作得很好... 但是以下代码返回“无法找到资源”错误: Logger logger = LoggerFactory.getLo
我是一名优秀的程序员,十分优秀!