2011-05-16 17 views
3

アプリケーションログメッセージと監査メッセージの2種類のメッセージをログに記録する必要があるアプリケーションがあります。アプリケーションログメッセージは標準lo4j Loggerと完全に一致しますが、監査ログにはいくつかの必須パラメータがあります。log4jをラップするかカスタムロガーを作成しますか?

私はdebug()info()などのメソッドに追加の必須パラメータを追加するためにlog4jをラップする必要があると思いますが、私はlog4jをラップするという考えが嫌いです。

  1. ラップlog4jの完全かつscenese背後のlog4jロガーを呼び出し、自分のLoggerクラスを提供します。私は必要がありますか?
  2. log4j Loggerクラスを拡張し、「監査ログ」メソッドに必要なパラメータを追加しますか?
  3. も、よりエレガントなので、私は、ロギングライブラリをラップしていないよ何かする... error

答えて

4

「メッセージ」、warn、log4jのLoggerの方法などは任意のオブジェクトです。それは文字列である必要はありません。独自の「メッセージ」クラスを作成して、さまざまなパラメータを含めることができます。ロガーは、監査ロガーのアペンダーのカスタムLayoutクラスを使用して、データを別々に追加できます。

+0

これは素晴らしい考えですが、開発者が監査ログエントリに必要なパラメータを提供するように強制する方法はありません。 – Brian

+0

いいえ、ログメッセージのオブジェクトの性質を強制する(簡単な)方法はありません。実行時に失敗すること以外は(おそらくあなたが望むものではありません)。しかし、ロギングの多くは、とにかくベストプラクティスに関するものなので、ここでは一般的な意味でのロギングに関しては大きな違いはありません。 –

+0

はい、私たちのロギングだけが「ベストプラクティス」であり、特定の状況ではお客様の要件によっては必要ではない場合。私は必要なパラメータを追加するためにlog4jをラップしていると思います。 – Brian

4

私はあなたのようなアプリケーションログがログを作成するためにlog4jを使用することができると思う:

private final static Logger log = new Logger(MyClass.class); 

そして、あなたの監査ログのために、特定のカテゴリの作成:

あなたはaccrossを共有することができます別のアペンダを持つ
private final static Logger log = new Logger("AuditTrail"); 

を複数のクラスを使用すると、設定ファイルで必要なときに出力先とフォーマットを設定できます。

これが役に立ちます。

0

log4jのapi NDC/MDCを読むことができますか。あなたを助けることができることを願っています。

1

これは動作します:はこれまでのところ、これは私が持っている最高のソリューションです ...

(クレジットLOG4J: Modify logged message using custom appenderでhellojavaに)

カスタムLog4jのレイアウトなどを作成します

import java.util.HashMap; 
import java.util.Map; 

import org.apache.log4j.Level; 
import org.apache.log4j.PatternLayout; 
import org.apache.log4j.spi.LoggingEvent; 

public class AuditLayout extends PatternLayout { 
    // Audit Summary Map: 
    // <Level, Counter> 

    private static Map<Level, Integer> auditMap = new HashMap<Level, Integer>(); 

    public static Map<Level, Integer> getAuditMap() { 
     return auditMap; 
    } 

    public static void setAuditMap(Map<Level, Integer> auditMap) { 
     AuditLayout.auditMap = auditMap; 
    } 

    @Override 
    public String format(LoggingEvent event) { 

     if (event.getMessage() != null && event.getMessage() instanceof String) { 
      // Check the message level and update the audit object accordingly: 
      if (!auditMap.containsKey(event.getLevel())) { 
       auditMap.put(event.getLevel(), 1); 
      } else { 
       int i = auditMap.get(event.getLevel());  
       i++; 
       auditMap.put(event.getLevel(), i); 
      } 
     } 
     return super.format(event); 
    } 
} 

これは、ログレベルをチェックする非常に単純なレイアウトですマップに要約を保持する。 すなわちDEBUG> 2、INFO> 10 など

設定し、あなたのlog4j.propertiesファイル(あなたのアペンダのいずれかを使用)の新しいレイアウト:

# CONSOLE: 
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender 
log4j.appender.CONSOLE.Threshold=DEBUG 
# BEFORE::: log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout 
# AFTER::: 
log4j.appender.CONSOLE.layout=com.ca.utils.AuditLayout 
log4j.appender.CONSOLE.layout.ConversionPattern=%d{MM/dd/yyyy HH:mm:ss} %-5p %c line: %L - %m%n 

今からレイアウトであなたのauditMapを使用して、あなたのLoggerオブジェクトに基づくメインクラス:

private static AuditLayout auditLayout = null; 
... 
if (log.getRootLogger().getAppender("CONSOLE").getLayout() instanceof AuditLayout) 
    auditLayout = (AuditLayout) log.getRootLogger().getAppender("CONSOLE").getLayout(); 
... 
System.out.println("auditLayout: " + auditLayout.getAuditMap().toString()); 

私はこれが役立つことを望みます!

関連する問題