【问题标题】:Changing level of logging dynamically动态更改日志记录级别
【发布时间】:2017-03-29 08:53:38
【问题描述】:

我想动态更改所有(关于)我的 Web 应用程序控制器类的日志记录级别。每个进行日志记录的类都包含以下代码:

private static final Logger logger = LoggerFactory
            .getLogger(HomeController.class);

我了解到 slf4j 不提供设置日志级别的功能,因此必须使用底层 log4j:

public static void setLogLevel(String level) {
    org.apache.log4j.Logger logger4j = org.apache.log4j.Logger.getRootLogger();
    logger4j.setLevel(org.apache.log4j.Level.toLevel(level.toUpperCase()));

    logger.info("Sample Info After setLevel");
    logger.debug("Sample Debug After setLevel");
    logger.error("Sample Error After setLevel");
    logger.trace("Sample Trace After setLevel");
    logger.warn("Sample Warn After setLevel");
}

我的想法是有一个控制器方法来更改 logLevel 并可能将其存储在数据库中。我的问题是:如何在不复制和粘贴 40 多个文件中的所有内容并修改每个控制器方法的情况下优雅地解决这个问题?另请注意,记录器代码是静态的,而我的数据库访问不是静态的。

【问题讨论】:

    标签: java spring log4j slf4j


    【解决方案1】:

    如何在不复制和粘贴 40 多个文件中的所有内容并修改每个控制器方法的情况下优雅地解决这个问题?

    您使用单个控制器方法,将记录器名称和所需的日志级别作为查询参数,并调用LogManager.getLogger(String name) 的字符串版本。

    当然,还需要保存到数据库并在重启时重新加载。

    或者,控制器可以更新启动时使用的 Log4j 配置文件,并在更改时强制 Log4j 重新加载它,例如致电PropertyConfigurator.configure(String configFilename)

    【讨论】:

    • 我不确定 Log4J 的生命周期,是否所有 tomcat 请求都有一个实例,或者是否为每个需要它的请求重新创建记录器?
    • 假设您将 log4j.jar(以及所有必要的 slf4j.jar 文件)添加到 WEB-INF/lib 文件夹中,您的 web 应用中只有一个 Log4j 实例。
    • 所以我可以这样做:setLogLevel("INFO") 这会影响我未来的所有请求和工作?
    • 如果您说的是根记录器,并且没有使用其他设置配置子记录器,那么可以。但它是内存中的变化,所以当服务器重启时它会被遗忘,除非你做数据库部分或使用其他一些外部存储机制。
    • 我会把它持久化到数据库中。谢谢。
    【解决方案2】:

    您可以使用 Slf4j 并外部化您的 application.properties 文件。您可以根据需要在此文件中配置日志记录级别。

    logging.level.com.test=DEBUG
    logging.level.org=INFO
    

    我不确定为什么需要将此日志记录级别存储在数据库中。

    【讨论】:

    • 您似乎错过了关于在运行时动态更改日志级别的部分。
    猜你喜欢
    • 2014-09-01
    • 2023-04-11
    • 2016-02-20
    • 2014-08-21
    • 2012-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-19
    相关资源
    最近更新 更多