2016-04-28 6 views
0

Javaロギングフレームワークのいずれかで、セキュリティ機能が無効になっていない限りログ記録の記録を制限する方法はありますか?セキュリティ機能が無効になっていない限り、Javaログフレームワークでログレコードの記録を制限する方法はありますか?

ユースケース:

  • X社は、パッケージ内のSuperThingcom.x.superthing
  • Javaクラスcom.x.superthing.SuperSecretThingyと呼ばれるJavaソフトウェアは、X社は、いずれかを使用しSuperSecretThingyからロギングを有効できるようにしたいと考えて重要なIPたくさんの
  • が含まれています標準Javaロギングフレームワーク(java.util.logging、log4j、logbackなど)この仕事をするために何か特別なことをしなければならないなら、それは大丈夫です。
  • X社外のユーザーがSuperThingを実行したい場合、SuperSecretThingyからログを有効にすることはできません。 -Dlog4j.configurationFile=...とログメッセージの一部は機密情報が含まれているため

制約:質問(SuperSecretThingy)内のクラスでコード、何か特別にコンパイル時の依存関係を持っていなければならないので、ロギングコードちょうど普通のものです。

class SuperSecretThingy 
{ 
    final static private Logger logger = 
     LoggerFactory.getLogger(SuperSecretThingy.class); 
    // this example uses SLF4J 

    ... 

    public void foo() 
    { 
     logger.info("Entering foo"); 
     do_stuff(); 
     logger.info("Exiting foo"); 
    } 
} 

a Filter feature in log4jあります:制御の前に適用することができ、前のセクションで説明したように行われる自動ログレベルのフィルタリング、Log4jのフィルタを提供することに加え

は、いずれかに渡され

LoggerConfigは、LoggerConfigに渡された後、コントロールがLoggerConfigに渡された後、特定のAppenderを呼び出す前、および各Appender上でAppenderを呼び出す前に渡されます。

プログラムでこれを行う方法はありますか?もしそうなら、特定のクラスからのログイベントをフィルタリングすることができます。

答えて

0

おそらく、ログメソッドをラップする独自のロガークラスを作成して、条件が何であれテストし、必要な条件があればロガーを呼び出すことができます。以下のような

何か:

class SuperSecretThingy { 
    final static private SecretLogger logger = 
     SecretLogger.getLogger(SuperSecretThingy.class); 

    public void foo(){ 
     logger.debug("Entering foo"); 
     do_stuff(); 
     logger.debug("Exiting foo"); 
    } 
... 
} 
class SecretLogger { 
    private Log log; 
    public SecretLogger(Class c) { 
    log = LogFactory.getLog(c); 
    } 
    public void debug(String message) { 
    if (mySecretConditions()) { 
     log.debug(message); 
    } 
    } 
} 
+0

https://logging.apache.org/log4j/2.0/manual/(私はあなたの質問にコメントする担当者を持っていないが、それは、[この]のように聞こえますcustomconfig.html)はあなたが望むものです。 – ghenghy

関連する問題