问题是,无论何时更改log4j.properties/log4j.xml,都需要重新启动tomcat [或者说任何其他服务器]。有没有重新加载log4j配置的解决方法?
答案 0 :(得分:27)
来自http://logging.apache.org/log4j/1.2/faq.html#3.6
有没有办法让log4j到 自动重新加载配置 文件如果改变了吗?
是。 DOMConfigurator和 PropertyConfigurator支持自动 重装通过 configureAndWatch方法。有关详情,请参阅API documentation 的信息。
因为configureAndWatch启动了 一个单独的wathdog线程,因为 没有办法阻止这个线程 log4j 1.2,configureAndWatch 方法在J2EE中使用是不安全的 环境应用的地方 回收
说,我已经在Java EE环境(Sun One Web Server,而不是Tomcat)中成功使用了PropertyConfigurator#configureAndWatch方法。
答案 1 :(得分:22)
从log4j 2.x开始,您可以定期重新加载配置,在此示例中每30秒:
<configuration monitorInterval="30">
有关log4j 2.x配置的更多信息,请查看here:
答案 2 :(得分:5)
您可以使用以下简短步骤编写一些初始化代码:
有关详细信息,请参阅此博客文章 - reload log4j configuration in tomcat
他们还将其移至github。
答案 3 :(得分:4)
您可以创建一个strut操作或一个重新加载属性文件的servlet。因此,在编辑log4j.properties文件之后,您需要调用servlet来重新加载它。
例如:
public class Log4JServlet extends HttpServlet{
private static final long serialVersionUID = 1L;
protected static Logger log = Logger.getLogger(Log4JTestServlet.class);
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("Reload Log4J prop file");
String path = "C:\\GlassFishESBv22\\glassfish\\domains\\domain1\\config\\log4j.properties";
PropertyConfigurator.configure(path);
/*
log.debug("debug message");
log.info("info message");
log.warn("warn message");
log.error("error message");
log.fatal("fatal message");
*/
}
}
答案 4 :(得分:4)
更新:如果您使用的是lg4j2.xml,那么在运行时管理log4j是唯一需要的配置
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO" monitorInterval="30">
<Loggers>
-------
</Loggers>
</Configuration>
监视间隔30每30秒加载一次log4j更改。
如果您使用的是旧版本的log4j,则可以使用以下解决方案。
是的,您可以在运行时更改log4j级别,而无需在使用spring时重新启动服务器。
public class OptionalLog4jConfigurer extends Log4jConfigurer implements
InitializingBean {
public static final Long DEFAULT_REFRESH = 30000L;
private static final Log LOG = LogFactory
.getLog(OptionalLog4jConfigurer.class);
private String configLocation;
private Long refreshInterval;
public OptionalLog4jConfigurer(final String configLocation,
final Long refreshInterval) {
this.configLocation = configLocation;
if (refreshInterval == null) {
this.refreshInterval = DEFAULT_REFRESH;
}
else {
this.refreshInterval = refreshInterval;
}
}
public void afterPropertiesSet() throws Exception {
if (!StringUtils.isEmpty(this.configLocation)) {
LOG.info("Log4J configuration is being customized.");
this.initLoggingInternal();
}
else {
LOG
.info("Using default Log4J configuration. No customization requested");
}
}
public String getConfigLocation() {
return this.configLocation;
}
public Long getRefreshInterval() {
return this.refreshInterval;
}
}
然后对applicationContext进行这些更改。
<bean id="optionalLog4jInitialization" class="com.skg.jetm.OptionalLog4jConfigurer">
<constructor-arg index="0" type="java.lang.String" value="${log4j.configuration}" />
<constructor-arg index="1" type="java.lang.Long" value="100" />
</bean>
完整的代码和说明可以在这里找到
答案 5 :(得分:3)
另一种方法是在web.xml
答案 6 :(得分:1)
Guido Garcia的回答非常明确。
Log4j 1提供了一种在非JEE线程安全主管中重新加载log4j配置的方法。
因此,如果您在JEE continer中,您可以通过以下方式轻松解决您的问题:
(A)创建@Singleton ejb计时器以定期扫描log4j.properties文件
(b)查看log4j给出的log4j日志监视的实现。 当重新加载文件时,它的作用非常简单方便,如下:
新PropertyConfigurator().doConfigure(filename,LogManager.getLoggerRepository());
如果配置文件上的时间戳发生变化,请执行相同的操作。 就是这样。
答案 7 :(得分:0)
另一种方法是使用Java File WatcherService配置文件观察程序,如下所述链接并在任何文件修改上重新加载Log4J配置。
https://dzone.com/articles/how-watch-file-system-changes
可以使用DOMConfigurator的API
完成重新加载https://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/DOMConfigurator.html