Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何仅更改具有Logback的当前线程的日志级别_Java_Logging_Logback - Fatal编程技术网

Java 如何仅更改具有Logback的当前线程的日志级别

Java 如何仅更改具有Logback的当前线程的日志级别,java,logging,logback,Java,Logging,Logback,在Logback中,可以使用setLevel()方法更改记录器的日志级别。 但是在Logback中,由于记录器是单例的,因此setLevel()方法的调用将影响使用同一记录器的所有其他线程 现在,我在web应用程序中使用了一个类,如下所示: class服务{ 私有void insertRecord(Foo-Foo){ //将一条记录插入数据库 } 公共空间插入器(Foo-Foo){ 插入记录(foo); } 公共void insertMany(列出foos){ //我想停止在这里登录 for(F

在Logback中,可以使用setLevel()方法更改记录器的日志级别。 但是在Logback中,由于记录器是单例的,因此setLevel()方法的调用将影响使用同一记录器的所有其他线程

现在,我在web应用程序中使用了一个类,如下所示:

class服务{
私有void insertRecord(Foo-Foo){
//将一条记录插入数据库
}
公共空间插入器(Foo-Foo){
插入记录(foo);
}
公共void insertMany(列出foos){
//我想停止在这里登录
for(Foo-Foo:foos){
插入记录(foo);
}
//我想在这里恢复登录
}
}
在Spring ApplicationConfig.xml中:


我想记录insertOne方法对insertRecord的调用。另一方面,在insertMany方法中,我希望在循环之前停止日志记录(因为它可能会输出大量日志),并在循环之后恢复日志记录。 但是,如果在循环之前调用setLevel(),则日志级别的更改将影响其他线程中使用的其他记录器。在这种情况下,我认为您将在其他线程上获得决定性的日志


我的问题是:如何仅为当前线程中使用的记录器更改日志级别?

我找到了一个解决方案。为此,您可以使用MDC和TurboFilter。MDC是线程本地的,对MDC的更改不会影响对其他线程的更改

例如,如果要停止所有日志记录活动,则必须将MDCFilter的定义添加到
logback.xml
(请注意,
标记不能是
标记的子级,而应该是
标记的子级):


追踪
关
否认
......
您可以通过将键和值放进MDC来进行O/OFF日志记录(注意在实际使用中应考虑异常):

class服务{
私有void insertRecord(Foo-Foo){
//将一条记录插入数据库
}
公共空间插入器(Foo-Foo){
插入记录(foo);
}
公共void insertMany(列出foos){
//我想停止在这里登录
MDC.put(“跟踪”、“关闭”);
for(Foo-Foo:foos){
插入记录(foo);
}
//我想在这里恢复登录
MDC.删除(“跟踪”);
}
}
或者,如果要停止跟踪/调试/信息/警告日志,但保留错误日志处于活动状态,则可以使用DynamicThresholdFilter:


追踪
痕迹
关
错误
......

您可以为您的包或您的cource类定义一个特定的appender,您可以为FooService类定义其他appender,但如果有两个或更多线程同时执行FooService,则所有线程都会受到setLevel()的影响。这对我来说是不理想的结果。你可以为它们设置两个不同的记录器。DynamicThresholdFilter正是我所需要的,谢谢!