ログを報告するように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");
そして、何も書き込まれず、ファイルは作成されません。コードをデバッグすると、ロガーがデフォルトのロガー(コンソール)であることがわかります。
はい、問題を解決しました。 XMLでpackage = "myPackage"を指定する必要がありました
実際、これは簡単なプロセスです。 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
_引数を読み取ります。
ロギングを楽しんでください。 :-)
場所 log4j2.xml
ファイルsrc/main/resources
。できます
それはプロジェクトのクラスパスに存在し、他の多くのディレクトリに置いてみました。
正確にはどこで? 「クラスパス内」が何を意味するかについてはしばしば混乱があります。どこにでもあることはできません。 「トップ」または「デフォルトパッケージ」でなければなりません。
src
├── main
│ └── Java
│ ├── com
│ │ └── example
│ └── log4j2.xml
log4j2.xmlをクラスパスに配置する必要があります。
または、「log4j.configurationFile」システムプロパティを設定して、log4j2.xmlを強制的に使用する
参照してください: http://logging.Apache.org/log4j/2.x/manual/configuration.html#AutomaticConfiguration
Eclipseユーザー向けのヒント:
プロジェクトを右クリックして[更新]をクリックします。Eclipseでlog4j2.xmlファイルが表示されることを確認してください。(これで問題が解決しました。)
冗長になる:
ファイルをビルドパスに追加しないでください(追加すると、Eclipseによって警告が表示されます)。
このファイルの名前は「.classpath」ファイルに表示されません。
私は問題があり、いくつかの解決策を試しましたが、これだけがうまくいきました:
Web.xmlに移動し、次のパラメーターを追加します。
<context-param>
<param-name>log4jConfiguration</param-name>
<param-value>log4j2.xml</param-value>
</context-param>
ログに記録したいメッセージのクラスの完全修飾名を書き留める必要があると確信しています-com.application.log4jtest.YourClass
のようなもの。それがうまくいかない場合は、ログレベルをいじってみてください。
また-ちょうど通知として-あなたも書くことができます
Logger logger = LogManager.getLogger(MyClass.class); // omit .getClass()
同様の問題がありました。ファイルをsrcフォルダーの下に置くと、うまくいきました。 log4j2.xmlファイルでは、パッケージ名については触れていません。
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
私も同じ問題に直面しました.log4j2.xmlファイルをシステム環境変数に保持しました。
変数名:sys_logroot変数値:D:\ user\gouse
ログは作成されません。
システム変数を使用する-Dlog4j.configurationFile=path/to/log4j2.xml
こちらをご覧ください
これは私の問題を解決します