実行可能なクラスがいくつかありますが、実行するJavaクラスの名前にログファイル名を自動的に設定したいと思います。ログバック:ログファイル名としてJavaメインクラス名を使用
おそらくReflectionとMDC
を使用してプログラムでこれを行うことができますが、これを設定することでこれを実現する簡単な方法はありませんlogback.xml
?
これは私にはかなり基本的な必要なので、私はそれについてのドキュメントを見つけることができなかったのに驚いています。あなたが言及したように
実行可能なクラスがいくつかありますが、実行するJavaクラスの名前にログファイル名を自動的に設定したいと思います。ログバック:ログファイル名としてJavaメインクラス名を使用
おそらくReflectionとMDC
を使用してプログラムでこれを行うことができますが、これを設定することでこれを実現する簡単な方法はありませんlogback.xml
?
これは私にはかなり基本的な必要なので、私はそれについてのドキュメントを見つけることができなかったのに驚いています。あなたが言及したように
それはそれはあなたがそうでなければあなたはlogbackを使用することができ、すべてのmain
方法で同様のシステムプロパティを設定する必要が
<file>${sun.java.command}.log</file>
このプロパティを使用することができますサポートしています。
、あなたは簡単に行うことでこれを実現することができます
Logger loggerA = LoggerFactory.getLogger(this.getClass().getSimpleName());
私はLogbackは、そのための明示的なXML設定を可能と気にしませんでしたので、それは、かなり快適な設定だと思います。
だから、あなたは、パッケージ名com.company
(クラス1とクラス2は、この名前空間を共有する)と1つのロガーにクラス1とクラス2に表示されるthis.getClass()
から、すべてのログを収集することができます:あなたがJVMにしている場合は
<appender name="MY_STUFF" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} - %msg%n</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_DIR}/my_log.server_%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>7</maxHistory>
</rollingPolicy>
</appender>
<logger name="com.company" level="INFO" additivity="false">
<appender-ref ref="MY_STUFF" />
</logger>
'LoggerFactory.getLogger 'は単に渡された文字列として指定されたロガーを返しますが、' FileAppender'のログファイル名には影響しません。そして、たとえ私がログファイル名をロガー名と同じに設定しても、それは私が望むものではありません。すべてのクラスが別のファイルにログを記録します。 – Alphaaa
修正しても、FileAppenderのログファイル名には影響しません。 'logger.xml'の' LoggerFactory.getLogger'(例えばcom.company.yourclass)で作成したすべてのロガーに含まれる名前空間を使用してください: '
例を挙げて私が必要としていることを説明しよう。 'Class1.java'を実行すると、実行中に呼び出された_all_ classedが* class1.log *にログを記録する必要があります。明日、私は 'Class2.java'という名前の新しい実行可能クラスを作成して実行すると、設定を変更することなく、その実行内のすべてが* class2.log *に入るはずです。今は意味がある? – Alphaaa
コマンドラインでアプリケーション名を2回指定しても構わない場合は、選択したアプリケーション名にjavaシステム変数を指定し、そのシステム変数をログバック設定ファイルで参照できます。
例:あなたのコマンド...
java -DAPPNAME="Class1" Class1
は... logbackをピックアップJavaシステム変数として値 "Class1の" を渡し、あなたは次のように再利用することができます...
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>${APPNAME}.log</file>
<encoder>
<pattern>%msg%n</pattern>
</encoder>
</appender>
ありがとうございます。このプロパティは、Windows上でEclipseを使用して起動するときはサポートされていないようですが、Maven経由でUbuntuを起動するときに機能します。私は 'org.codehaus.plexus.classworlds.launcher.Launcher exec:java -Dexec.mainClass = mypackage.MyMainClass'のような文字列を取得し、クラス名を分離することができるはずです。 – Alphaaa