0

私は小さなコンソールユーティリティを書きました。アプリケーション全体で、slf4j / log4jを使用して、デバッグ、トレース、情報ステートメントを開発中にコンソールに記録しました。開発が完了し、リリースしたいので、いくつかの特定のロガーを除いて、コンソールへのすべての出力を無効にし、残りのすべてのロガーをテキストファイルに送信します。

理論的には、これはかなり簡単なはずです。2つのアペンダー(1つはConsoleAppender、もう1つはFileAppender)を作成しました。ConsoleAppenderを、コンソールで必要な特定のロガーとルートレベルのFileAppenderに関連付けました。これは正常に機能します。

今の私の問題は、FileAppenderを完全に無効にしたい場合、その方法がわからないことです。DenyAllFilterをFileAppenderに追加すると、ファイルへの書き込みが妨げられますが、ファイルは作成されたままです。FileAppenderをROOTロガーから削除すると、Log4JがStdErrに書き込みます。

log4j:WARN No appenders could be found for logger (org.springframework.context.support.ClassPathXmlApplicationContext).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

ROOTレベルをOFFに設定した場合、カスタムデバッグレベルを設定した個々のロガーは引き続き出力されます。

LoggerRepository LevelをOFFに設定すると、すべてのロガー(STDOUTとファイルに移動したいもの)がすべてオフになります。

これを簡単に行う方法はありますか?理想的には、ファイルアペンダーを完全に無効にできるようにしたいのですが、必要に応じてコマンドラインスイッチを提供して有効にします。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>

    <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d{ISO8601} %-5p %c{5} - %X{messageId} - %m%n" />
<!--            <param name="ConversionPattern" value="%m%n" /> -->
        </layout>
    </appender>

    <appender name="LOGTXT" class="org.apache.log4j.FileAppender">
        <param name="file" value="lss-client.log" />
        <param name="append" value="false" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d{ISO8601} %-5p %c{5} - %X{messageId} - %m%n" />
        </layout>
<!--        <filter class="org.apache.log4j.varia.DenyAllFilter"/> -->
    </appender>

    <!-- Spring Loggers -->
    <logger name="org.springframework">
        <level value="INFO" />
    </logger>

    <logger name="org.springframework.ws.client.MessageTracing.sent">
        <level value="TRACE" />
    </logger>   

    <logger name="org.springframework.ws.client.MessageTracing.received">
        <level value="TRACE" />
    </logger>   

    <logger name="com.cws.cs.Client" >
        <level value="INFO" />
        <appender-ref ref="STDOUT" />
    </logger>

    <root>
        <level value="INFO" />
        <appender-ref ref="LOGTXT" /> 
    </root>
</log4j:configuration>

ありがとう!

エリック

4

1 に答える 1

2

を設定すると、Slf4J/Log4Jがすぐにログファイルを作成することを確認してくださいFileAppender

ここでの最善の策は、2つの異なる完全なLog4J構成を用意し、コマンドラインパラメーターに基づいて起動時にロードする構成を選択することだと思います。

擬似コードの場合:

public static void main(String[] args){
    //if log to file arg = true
        DOMConfigurator.configure("logToFile.log4j.xml");
    //else
        DOMConfigurator.configure("logToConsoleOnly.log4j.xml");
}

編集

さらに、2つの構成ファイルを維持するというアイデアが気に入らない場合。共通のコンポーネント(おそらくスプリングスタッフとその他のコンポーネント)を使用して1つの構成を作成し、パラメーターに基づいてプログラムで構成することができますFileAppender

public static void main(String[] args){

    DOMConfigurator.configure("log4j.xml");
    //if log to file arg = true{
        // Define layout
        PatternLayout layout = new PatternLayout();
        layout.setConversionPattern("%d{ISO8601} %-5p %c{5} - %X{messageId} - %m%n");

        // Create appender
        FileAppender appender = new FileAppender();
        appender.setFile("lss-client.log");
        appender.setLayout(layout);
        appender.activateOptions();

        // Get root logger and add appender.
        log = Logger.getRootLogger();
        log.setLevel(Level.INFO);
        log.addAppender(appender);
    }
} 
于 2012-06-21T20:19:26.697 に答える