How to dynamically change log level in SLF4j OR Log4J

妖精的绣舞 提交于 2019-12-29 06:43:26

问题


Recently I encountered a situtation where Application Loglevel changes dynamically. Application Admin can set it to INFO/DEBUG/ WARN from front end. Based on the log level choosen be him application logging must be changed.

I am sure loggers support this scenario, but not sure how can I achive this. If any of you have idea/thoughts on this please let me know.

Thanks in advance for your help.

-Narendra


回答1:


Consider Logback http://logback.qos.ch/ - "a successor to the popular log4j project, picking up where log4j leaves off". If instructed to do so, logback-classic will scan for changes in its configuration file and automatically reconfigure itself when the configuration file changes. Besides, you can control Logback's logging levels with JMX.




回答2:


It is not possible to change the log level dynamically in slf4j, but some backends for slf4j support it, including log4j.

This solution worked for me:

org.apache.log4j.Logger logger4j = org.apache.log4j.Logger.getRootLogger();
logger4j.setLevel(org.apache.log4j.Level.toLevel("ERROR"));

(Source: http://prateep.info/2015/12/12/Dynamically-change-log-level-in-SLF4j-Log4J-with-Standalone-Java-Class/)

The disadvantage of this solution is that it uses the backend directly, which you're not supposed to do when using slf4j because the point of slf4j is to provide an abstraction away from the specific backend you're using.




回答3:


I had to do this once with log4j. The only way I could figure out how to do it was to call getAllAppenders on the Logger object. Then, loop through the appenders. If they extend the AppenderSkeleton class (they should), they will have the setThreshold method. Call this method with your new Level as the parameter. Subsequent calls to the logger should use the new level. This will set the level in memory, but not in your log4j configuration file. You may want to do this, too, unless it gets changed automatically when the admin changes the level via the front end. If it's an option, you may want to consider following Evgeniy Dorofeev's advice and use logback. It sounds like it would be easier.




回答4:


As of slf4j version 1.7.26, I was able to change the logging level.

Here is the logback.xml in the source folder. In case of spring boot app, you might want to place it in the resources folder.

<configuration scan="true" scanPeriod="20000">
    <include file="C:/logback-ext.xml"/>
</configuration>

The logback-ext.xml file is kept at any external location. The scanPeriod is in milliseconds. In case this fails, try using include resource instead of include file in logback.xml.

<included>
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>
          %d{yyyy-MM-dd HH:mm:ss} %-5p [%t] --- %c{1}.%M:%L :: %m %n
      </pattern>
    </encoder>
  </appender>
  <root level="INFO">
    <appender-ref ref="STDOUT" />
  </root>
</included>

I was able to change the logging level, logging pattern, attach/ detach new appenders and add/ remove appenders.

These are the dependencies in pom.xml

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.3</version>
<scope>compile</scope>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.25</version>
</dependency>

Cheers!



来源:https://stackoverflow.com/questions/13442967/how-to-dynamically-change-log-level-in-slf4j-or-log4j

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!