web-dev-qa-db-ja.com

log4j 2-構成の問題

ログを報告するようにlog4j 2.0を構成しようとしています。

私の設定はlog4j2.xmlとして保存され、これはその内容です:

  <?xml version="1.0" encoding="UTF-8"?>
  <configuration name="PRODUCTION" status="OFF">

    <appenders>
        <RollingFile name="MyFileAppender" 
            fileName="../Logs/app.log" 
            filePattern="../Logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
            <PatternLayout>
                <pattern>%d %p %C{1.} [%t] %m%n</pattern>
            </PatternLayout>
            <Policies>
                <OnStartupTriggeringPolicy />
                <TimeBasedTriggeringPolicy interval="6" modulate="true"/>
                <SizeBasedTriggeringPolicy size="250 MB"/>
            </Policies>
        </RollingFile>
    </appenders>

    <loggers>
        <root level="trace">
            <appender-ref ref="MyFileAppender"/>
        </root>
    </loggers>

 </configuration>

それはプロジェクトのクラスパスに存在し、他の多くのディレクトリに配置してみました。

私はそのようなコードでロガーを作成しました:

    Logger          logger = LogManager.getLogger(MyClass.class.getName());
    logger.info("test");

そして、何も書き込まれず、ファイルは作成されません。コードをデバッグすると、ロガーがデフォルトのロガー(コンソール)であることがわかります。

14
Lee

はい、問題を解決しました。 XMLでpackage = "myPackage"を指定する必要がありました

0
Lee

実際、これは簡単なプロセスです。 Log4j 2の2つの主要なクラスは次のとおりで、このようにインポートする必要があります。

_    import org.Apache.logging.log4j.LogManager
    import org.Apache.logging.log4j.Logger
_

このコードを使用してLoggerインスタンスを取得します。

_    private static final Logger logger = LogManager.getLogger();
_

注:getLogger()メソッドにクラス名をパラメーターとして指定していません。 Log4j 2は自動的に計算します。

これで、Loggerクラスのinfo(), trace(), debug(), warn(), error(), fatal()メソッドを使用できます。ただし、これらすべてのメソッドから出力を取得するには、XML構成ファイルが必要です。デフォルトでは、Log4j 2はerror() and fatal()メソッドからの出力のみを生成します。

構成ファイルは次のとおりです。

_    <?xml version="1.0" encoding="UTF-8"?>
    <Configuration status="WARN">
        <Appenders>
            <File name="MyCustomLogFile" fileName="/home/me/mylogfile.log">
                <PatternLayout>
                    <Pattern>%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n</Pattern>
                </PatternLayout>
            </File>
            <Console name="Console" target="SYSTEM_OUT">
                <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
            </Console>
        </Appenders>
        <Loggers>
            <Root level="all">
                <AppenderRef ref="MyCustomLogFile"/>
                <!--<AppenderRef ref="Console"/>-->
            </Root>
        </Loggers>
    </Configuration>
_

このファイルを任意の場所に任意の名前で保存します。名前としてLog4j2.xmlを使用します。次に、このファイルをクラスパスに配置する必要があります。これを行うには、次のようにプログラムを実行するときにシステムプロパティを渡します。

_    Java -Dlog4j.configurationFile=/path/to/xml/configuration/file/Log4j2.xml MyMainClass
_

そして、あなたはそれをやった。ログはすぐにコンソールに表示されます。

特記事項:

  • XMLファイルには、ファイルとコンソールの2つのアペンダーを用意しました。コンソールではなくファイルで出力を取得するには、コメント化されたAppenderRefタグのコメントを外すだけでよいことがわかります。

  • システムプロパティとして環境変数を指定することもできます。 Log4j 2は、最初に環境変数から構成ファイルを読み取り、次に環境変数が見つからない場合は_-D_引数を読み取ります。

ロギングを楽しんでください。 :-)

10
Manvendra SK

場所 log4j2.xmlファイルsrc/main/resources。できます

それはプロジェクトのクラスパスに存在し、他の多くのディレクトリに置いてみました。

正確にはどこで? 「クラスパス内」が何を意味するかについてはしばしば混乱があります。どこにでもあることはできません。 「トップ」または「デフォルトパッケージ」でなければなりません。

src
├── main
│   └── Java
│       ├── com
│       │   └── example
│       └── log4j2.xml
4
wolfcastle

log4j2.xmlをクラスパスに配置する必要があります。

または、「log4j.configurationFile」システムプロパティを設定して、log4j2.xmlを強制的に使用する

参照してください: http://logging.Apache.org/log4j/2.x/manual/configuration.html#AutomaticConfiguration

4
ldelucio

Eclipseユーザー向けのヒント:

プロジェクトを右クリックして[更新]をクリックします。Eclipseでlog4j2.xmlファイルが表示されることを確認してください。(これで問題が解決しました。)

冗長になる:

  • ファイルをビルドパスに追加しないでください(追加すると、Eclipseによって警告が表示されます)。

  • このファイルの名前は「.classpath」ファイルに表示されません。

  • Log4j2.xmlをsrc /ディレクトリの下に置きました。できます。
2
fstang

私は問題があり、いくつかの解決策を試しましたが、これだけがうまくいきました:

Web.xmlに移動し、次のパラメーターを追加します。

<context-param>
    <param-name>log4jConfiguration</param-name>
    <param-value>log4j2.xml</param-value>
</context-param>
1
Trinity

ログに記録したいメッセージのクラスの完全修飾名を書き留める必要があると確信しています-com.application.log4jtest.YourClassのようなもの。それがうまくいかない場合は、ログレベルをいじってみてください。

また-ちょうど通知として-あなたも書くことができます

Logger logger = LogManager.getLogger(MyClass.class); // omit .getClass()
1
Joshua

同様の問題がありました。ファイルをsrcフォルダーの下に置くと、うまくいきました。 log4j2.xmlファイルでは、パッケージ名については触れていません。

1
TechCrunch

Log4j 2のドキュメント: http://logging.Apache.org/log4j/2.x/manual/configuration.html#AutomaticConfiguration

「JSONファイルが見つからない場合、XML ConfigurationFactoryはクラスパスでlog4j2.xmlを見つけようとします。」

ただし、クラスパスでは機能しません。代わりに、それをsrcフォルダーに保存すると、機能します。

<context-param>
    <param-name>log4jConfiguration</param-name>
    <param-value>log4j2.xml</param-value>
</context-param>

同様の問題がここで言及されています: https://issues.Apache.org/jira/browse/LOG4J2-357

1
Zubin Shah

私も同じ問題に直面しました.log4j2.xmlファイルをシステム環境変数に保持しました。

変数名:sys_logroot変数値:D:\ user\gouse

ログは作成されません。

システム変数を使用する-Dlog4j.configurationFile=path/to/log4j2.xmlこちらをご覧ください

これは私の問題を解決します

0
Mohammad Gouse