我一直想知道是否可以在 pr 线程级别上以编程方式设置 java.util.logging 的日志级别。
用例是在 Web 服务器中。如果我的代码检测到某个用户有异常级别的错误,我想为该客户启用跟踪日志记录。
我正在考虑使用 servletfilter 来完成此操作,并将其与他的 session ID 联系起来。但据我所知,我可以在附加程序上设置的日志级别不是线程仿射的。 IE。如果我将根级别设置为 FINE,它将影响系统中的所有线程,并且日志会填满其他 200 个同时用户的流量。当然,我可以事后过滤日志,但无论如何都会影响性能。
有人有这方面的经验吗?
最佳答案
I always wondered if it would be possible to programatically set the log level of java.util.logging on a pr thread level.
创建 log filter捕获用户上下文并将过滤对象的级别设置为 ALL:
public class UserFilter implements Filter {
private final Level lvl;
private final Object userContext;
public UserFilter(Level originalLevel, Object userContext) {
this.lvl = originalLevel;
this.userContext = userContext;
}
@Override
public boolean isLoggable(LogRecord record) {
if (!belongsTo(record, userContext)) {
int levelValue = this.lvl.intValue();
if (record.getLevel().intValue() < levelValue
|| levelValue == Level.OFF.intValue()) {
return false;
}
}
return true;
}
private boolean belongsTo(LogRecord record) {
/**
* Insert logic here.
*/
//return ((Integer) this.userContext) == record.getThreadId();
return true;
}
}
对于您的用例,您应该能够创建一个 servlet 过滤器,它将:
- 创建一个日志过滤器,用于识别用户并捕获当前日志级别。
- 安装日志过滤器,然后将级别更改为 FINE。
关于java - 在Java中-我可以设置线程的日志级别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26797281/