java - 动态更改日志记录级别

标签 java spring log4j slf4j

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

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");
}

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

最佳答案

How I can solve this elegantly without copy and pasting everything in 40+ files and modifying every controller method?

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

当然,保存到数据库并在重新启动时重新加载也是您需要完成的额外工作。

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

关于java - 动态更改日志记录级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43088774/

相关文章:

java - Hibernate 创建两行而不是一行

java - Spring 事务隔离级别

java - 无法运行 quartz 调度程序

java - 不能使用另一个类的方法吗?

java - 在 Java 中按日期键对 map 进行排序

java - 调用entityManager.flush - 调用两次、一次或根本不调用的效果

java - 如何跳过其他库日志到我的 log4j 记录器

java - 什么相当于 log4j 2 中的 log4j 1 `log4j.appender.SYSLOG.Header=true`?

java - IllegalAccessError 运行 android 仪器测试

java - Joda-Time 库无法在启用 Proguard 的 Android 5 上运行