【问题标题】:Can we change the logging level of a single log-statement during run-time?我们可以在运行时更改单个日志语句的日志记录级别吗?
【发布时间】:2011-09-10 18:00:59
【问题描述】:

我有以下代码:

private static final Log LOGGER = LogFactory.getLog(MyClass.class);
if (LOGGER.isErrorEnabled()) {
    LOGGER.error("ID_1: Log Message: " + parameter));
}

我希望将严重性设置为WARN 或FATAL。

如果我能够在运行时更新 log4j.properties,那么我将如何更改此消息的严重性?使用log4j.logger.com.foo=WARN 只会改变整个包的严重性。

有没有更具体的方法? 我们可以在运行时更改单个日志语句的日志级别吗?

【问题讨论】:

    标签: java log4j apache-commons-logging


    【解决方案1】:

    简短的回答是不,你不能。

    要做你想做的事,你需要更改代码来调用以 Level 作为参数的 Logger 方法,并替换守卫;例如

    if (logger.isEnabledFor(level)) {
        logger.log(level, "ID_1: Log Message: " + parameter, null);
    }
    

    而且我认为这不会有帮助,因为你会遇到将正确的值放入 level 变量的问题。

    更好的选择是创建一个具有唯一名称的记录器,并且只在该特定语句中使用。然后,您可以独立于任何其他语句控制该语句的日志记录(通过日志记录配置)。

    或者,更实际地,使用类名或包名来命名您的记录器。与单个全局记录器相比,这为您提供了更多的粒度......而无需创建数量惊人的 Logger 实例。

    【讨论】:

    • 更改代码以使用日志级别是一个问题的原因是因为我们有数百个组件需要更改。但是感谢您的简短回答。
    • @mahler - 像这样进行大规模更改并不像您想象的那样不切实际。事实上,这些改变是非常机械地完成的……如果不是完全/大部分自动化的方式。
    【解决方案2】:

    您可以在使用 Log4j 时指定 LogLevel 和 log-methods,它以 LogLevel 作为参数:

    Logger l = Logger.getLogger(this.getClass());
    l.log(Level.WARN, message);
    l.log(Level.ERROR, message);
    l.log(Level.ERROR, message, throwable);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-17
      • 1970-01-01
      • 1970-01-01
      • 2016-02-20
      • 2014-09-01
      • 2023-04-11
      • 1970-01-01
      相关资源
      最近更新 更多