2011-10-19 23 views
29

私はlogback使用している、と私は(Setting Logback Appender path programmaticallyに似ている)私のJavaプログラム内で、プログラムでログファイル名を設定しようとしていますし、次のように私は、そのソリューションを適応させることを試みた:Logback - セットのログファイル名、プログラム

私のJavaプログラムで再び

<appender name="FILE" class="ch.qos.logback.core.FileAppender"> 
    <file>log/${log_file_name}.log</file> 
    ... 

そして:logback-のtest.xmlで

結果は2つのログであるしかし
String logFileName = "" + System.currentTimeMillis(); // just for example 
System.setProperty("log_file_name", logFileName); 

LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory(); 
ContextInitializer ci = new ContextInitializer(lc); 
lc.reset(); 
try 
{ 
    // I prefer autoConfig() over JoranConfigurator.doConfigure() so I 
    // wouldn't need to find the file myself. 
    ci.autoConfig(); 
} 
catch (JoranException e) 
{ 
    // StatusPrinter will try to log this 
    e.printStackTrace(); 
} 
StatusPrinter.printInCaseOfErrorsOrWarnings(lc); 

、1つ、例えば、「131904フルと私が望んでいたとして命名1145343.log "であり、もう1つは空で、" log_file_name_IS_UNDEFINED.log "という名前です。この空のログファイルが作成されないようにするにはどうすればよいですか?

+0

あなたのコードの唯一の問題は、あなたが 'System.setProperty(" log_file_name "、logFileName);を設定しているようです。 Logback autoconfigが実行され、必要なものがある前に実行してください。 – Robert

+0

実際にコードスニペットよりもはるかに簡単に行うことができます:http://stackoverflow.com/a/21886071/709537 –

答えて

30

私は以下のことがあなたの望むものに近いと考えています。あなたが必要とするすべてのログファイル名のタイムスタンプを追加することである場合

import ch.qos.logback.classic.Logger; 
import ch.qos.logback.classic.encoder.PatternLayoutEncoder; 
import ch.qos.logback.core.FileAppender; 
import ch.qos.logback.core.util.StatusPrinter; 
import org.slf4j.LoggerFactory; 
import ch.qos.logback.classic.LoggerContext; 

public class Main { 
    public static void main(String[] args) { 
    LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory(); 

    FileAppender fileAppender = new FileAppender(); 
    fileAppender.setContext(loggerContext); 
    fileAppender.setName("timestamp"); 
    // set the file name 
    fileAppender.setFile("log/" + System.currentTimeMillis()+".log"); 

    PatternLayoutEncoder encoder = new PatternLayoutEncoder(); 
    encoder.setContext(loggerContext); 
    encoder.setPattern("%r %thread %level - %msg%n"); 
    encoder.start(); 

    fileAppender.setEncoder(encoder); 
    fileAppender.start(); 

    // attach the rolling file appender to the logger of your choice 
    Logger logbackLogger = loggerContext.getLogger("Main"); 
    logbackLogger.addAppender(fileAppender); 

    // OPTIONAL: print logback internal status messages 
    StatusPrinter.print(loggerContext); 

    // log something 
    logbackLogger.debug("hello"); 
    } 
} 

、すでにsupports the timestamp element logback。したがって、カスタムコードはまったく必要ありません。ここで

+0

あなたの助けてくれてありがとう、私はこれを行くでしょう。 (私は例としてタイムスタンプを使用していましたが、実際のファイル名は異なります) – conorsomahony

+0

これはlogback-test.xmlで機能します。私はもはやファイルアペンダーを指定していません。それを 'root'ロガーに渡します。 – conorsomahony

+3

ch.qos.logback.classic.Loggerのインポートを避けるためのslf4jのポイントではありません – Zombies

4

ロガーが2回初期化されているように見えます。初めてアプリが読み込まれ、${log_file_name}が解決されなかった可能性があります。 -Dlog_file_name=*something*でアプリを起動すると、名前が別のログファイルが作成された場合、この動作を確認できます*something*

+0

ファイル名をプログラムで設定するには、ファイルアペンダーを必要な設定(名前、カテゴリ、パッケージなど)を作成し、それをアペンダー階層に追加します。 – srkavin

+0

ありがとう、私はちょうど '-Dlog_file_name = verify'をVM引数に追加しました。そして、私は確かに" verify.log "という空のログを取得しました。 - ロガーを2回起動する方法はありますか? – conorsomahony

8

は、あなたがそれらの余分ファイルcreation.Belowを無視するために何ができるかである。ここの設定ファイル

<configuration> 
<appender name="FILE" class="ch.qos.logback.core.FileAppender"> 
<!-- "application-name" is a variable --> 
<File>c:/logs/${application-name}.log</File> 
<layout class="ch.qos.logback.classic.PatternLayout"> 
<Pattern>%d %p %t %c - %m%n</Pattern> 
</layout> 
</appender> 
<root level="debug"> 
<appender-ref ref="FILE"/> 
</root> 
</configuration> 

である私は、ここでhttp://logback.qos.ch/faq.html#sharedConfiguration

からこれを得たJavaの一部、

LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory(); 
JoranConfigurator jc = new JoranConfigurator(); 
jc.setContext(context); 
context.reset(); // override default configuration 
// inject the name of the current application as "application-name" 
// property of the LoggerContext 
context.putProperty("application-name", NAME_OF_CURRENT_APPLICATION); 
jc.doConfigure("/path/to/the/above/configuration/file.xml"); 

です

+0

Loggerを起動する前に、システム変数をすべて初期化することもできます。これも機能します。 –

+0

コンテキストをリセットする代わりにSystem.setProperty(..)を使用して終了しました。私にはきれいに見えます。ありがとうございました。 –

+0

残念なことに、システムプロパティを使用すると、設定を共有するときには機能しません – Brice

10

ランタイム属性に応じてログメッセージを別のファイルに分離/移動するには、ch.qos.logback.classic.sift.SiftingAppenderを使用します。一言で言えば

、これは${userId}MDC (Mapped Diagnostic Context)(例えば、MDC.put("userid", "Alice");)に基づいて、置換されて<file>${userid}.log</file>FileAppender(または任意の他のアペンダ)を設定することを可能にします。完全な例については、最初のリンクを参照してください。

関連する問題