web-dev-qa-db-ja.com

Tomcatでlog4j.xml / log4j.propertiesファイルを動的にリロードすることは可能ですか?

問題は、log4j.properties/log4j.xmlを変更するたびに、Tomcat [または他のサーバー]を再起動する必要があることです。 log4j構成をリロードする回避策はありますか?

34
Rakesh Juyal

から 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)で使用できました。

27
Guido

Log4j 2.xの時点で、この例では30秒ごとに構成を定期的にリロードできます。

<configuration monitorInterval="30">

Log4j 2.x設定の詳細については、 こちら をご覧ください。

次の短い手順で、小さなイニシャライザコードを作成できます。

  • 「BEFORE_START_EVENT」を聞いて、
  • イベントが発生したら(Tomcatの再起動ごとに1回)、configureAndWatchメソッドを使用してlog4jを開始します
  • また、ウォッチャースレッドをクリーンアップするためにシャットダウンフックをインストールすることを忘れないでください

詳細については、このブログ投稿を参照してください- Tomcatでlog4j設定を再読み込み

また、 github に移動しました。

5
Kieren Dixon

更新: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レベルを動的に変更する

5
vsingh

プロパティファイルを再ロードするストラットアクションまたはサーブレットを作成できます。そのため、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");
    */

    }
}
4
Remy Mellet

別の方法は、Spring Frameworkの Log4jConfigListener in web.xml

3
Prashant Bhate

Guido Garciaの回答はかなり目標を達成しています。

Log4j 1は、JEE以外のスレッドセーフな方法でlog4j設定をリロードする方法を提供します。

したがって、JEE大陸にいる場合は、次の方法で問題を簡単に解決できます。

(A)@Singleton ejbタイマーを作成して、log4j.propertiesファイルを定期的にスキャンします

(b)log4jで指定されたlog4jログウォッチの実装を見てください。ファイルを再作成するときの処理は、非常に簡単で便利です。次のとおりです。

新しいPropertyConfigurator().doConfigure(filename,LogManager.getLoggerRepository());

構成ファイルのタイムスタンプが変更された場合も、同じことを行います。それだ。

1
99Sono

別の方法は、以下で説明するように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

0
Ramesh Ponnada