java - 在Java中-我可以设置线程的日志级别吗?

标签 java logging java.util.logging

我一直想知道是否可以在 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 过滤器,它将:

  1. 创建一个日志过滤器,用于识别用户并捕获当前日志级别。
  2. 安装日志过滤器,然后将级别更改为 FINE。

关于java - 在Java中-我可以设置线程的日志级别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26797281/

相关文章:

python - Django 登录到控制台

java - 在 aosp 中记录 libcore 内部

Java Swing : Dialog with expanding/progressive disclosure?

java - 如何用纯Java创建或打开libsodium兼容的密封盒

MySQL 命令历史

debugging - Azure:应用程序日志已关闭。您可以使用 'Diagnostic logs' 设置来打开它们

java.util.logging - 为什么 java.util.logging.Formatter 中的 formatMessage() 方法是同步的?

java - 无法捕获 servlet 中的主键异常

java - 读取 ini 时出现 VerifyError

java - 如何使用位操作在java中获取数字的绝对值