問題は、log4j.properties/log4j.xmlを変更するたびに、Tomcat [または他のサーバー]を再起動する必要があることです。 log4j構成をリロードする回避策はありますか?
から http://logging.Apache.org/log4j/1.2/faq.html#3.6
構成ファイルが変更された場合、log4jに構成ファイルを自動的にリロードさせる方法はありますか?
はい。 DOMConfiguratorとPropertyConfiguratorは両方とも、configureAndWatchメソッドによる自動リロードをサポートしています。詳細については、 APIドキュメント を参照してください。
ConfigureAndWatchは別のwathdogスレッドを起動し、log4j 1.2ではこのスレッドを停止する方法がないため、configureAndWatchメソッドは、アプリケーションがリサイクルされるJ2EE環境で使用するには安全ではありません。
つまり、PropertyConfigurator#configureAndWatchメソッドをJava EE環境(TomcatではなくSun One Web Server)で使用できました。
Log4j 2.xの時点で、この例では30秒ごとに構成を定期的にリロードできます。
<configuration monitorInterval="30">
Log4j 2.x設定の詳細については、 こちら をご覧ください。
次の短い手順で、小さなイニシャライザコードを作成できます。
詳細については、このブログ投稿を参照してください- Tomcatでlog4j設定を再読み込み
また、 github に移動しました。
更新:lg4j2.xmlを使用している場合、log4jを実行時に管理するために必要なのは構成だけです
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO" monitorInterval="30">
<Loggers>
-------
</Loggers>
</Configuration>
監視間隔30は、log4jの変更を30秒ごとにロードします。
以下の解決策は、log4jの古いバージョンを使用している場合です。
はい。springを使用している場合は、サーバーを再起動することなく、実行時にlog4jレベルを変更できます。
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>
完全なコードと説明はこちらにあります
プロパティファイルを再ロードするストラットアクションまたはサーブレットを作成できます。そのため、log4j.propertiesファイルを編集した後、サーブレットを呼び出して再ロードする必要があります。
例えば:
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");
*/
}
}
別の方法は、Spring Frameworkの Log4jConfigListener in web.xml
Guido Garciaの回答はかなり目標を達成しています。
Log4j 1は、JEE以外のスレッドセーフな方法でlog4j設定をリロードする方法を提供します。
したがって、JEE大陸にいる場合は、次の方法で問題を簡単に解決できます。
(A)@Singleton ejbタイマーを作成して、log4j.propertiesファイルを定期的にスキャンします
(b)log4jで指定されたlog4jログウォッチの実装を見てください。ファイルを再作成するときの処理は、非常に簡単で便利です。次のとおりです。
新しいPropertyConfigurator().doConfigure(filename,LogManager.getLoggerRepository());
構成ファイルのタイムスタンプが変更された場合も、同じことを行います。それだ。
別の方法は、以下で説明するようにJava File WatcherServiceを使用してFile Watcherを構成し、ファイルの変更時に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