动态更改日志记录级别

时间:2017-03-29 08:53:38

标签: java spring log4j slf4j

我想动态更改所有(大约)我的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多个文件中的所有内容并修改每个控制器方法的情况下如何优雅地解决这个问题?另请注意,记录器代码是静态的,而我的数据库访问不是静态的。

2 个答案:

答案 0 :(得分:1)

  

如果不复制并粘贴40多个文件中的所有内容并修改每个控制器方法,我如何能够优雅地解决这个问题?

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

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

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

答案 1 :(得分:0)

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

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

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