2017-03-29 181 views
0

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

回答

1

我怎样才能解决这个优雅没有复制和粘贴在40 +文件和修改每个控制器方法的一切?

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

保存到数据库并在重新启动时重新加载当然还有额外的工作要做。

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

+0

我不确定关于Log4J的生命周期,所有tomcat请求是否存在单个实例,或者是否为每个需要它的请求重新创建了日志记录器? – Adder

+0

假设您在'WEB-INF/lib'文件夹中添加了'log4j.jar'(以及所有必需的'slf4j.jar'文件),您的webapp中只有一个Log4j实例。 – Andreas

+0

所以我可以这样做:'setLogLevel(“INFO”)'它会影响我所有未来的请求和工作? – Adder

0

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

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

我不知道为什么您需要将此日志级别存储在数据库中。

+0

您似乎错过了关于*动态更改运行时日志级别的部分。 – Andreas

相关问题