2012-03-23 4 views
5

Javaアプリケーションにカスタムログハンドラを追加しようとしています。私は、java.util.Logging.Handlerクラスを拡張するInnerLoggerクラスを実装しました。そして、私のlogging.propertiesにハンドラとして宣言:Google App Engineにカスタムログハンドラを追加するには?

handlers:com.mycompany.util.InnerLogger 

しかし、私は、開発サーバを起動したとき、私は次のエラーました:

Can't load log handler "com.mycompany.util.InnerLogger" 
java.lang.ClassNotFoundException: com.mycompany.util.InnerLogger 

を私は1つでロガー1に私のカスタムハンドラを追加することができますしかし、私はちょうどすべてのロガーにそれを追加する方法があるのだろうかと思う。

おかげ

+0

関連:[問題11499:JavaのAppEngineのためのカスタムロガーを許可する](https://code.google.com/p/googleappengine/issues/detail?id=11499) – jmehrens

答えて

3

Handlerを、アプリケーションを初期化するときにLoggerというルートに追加することができました。このコードをウォームアップ・タスクまたはサーブレット・フィルターに入れることができます。

private static Logger LOG; 

... 

LOG = Logger.getLogger(""); 
LOG.addHandler(myCustomHandler); 

そのlogging.propertiesを使用してのように優雅ではないが、GAE上で動作しているときには、適切な回避策です。

+0

これは私にとってはうまくいったが、LOG.addHandler(myCustomHandler)を呼び出すだけで、重複したロギングステートメントが作成されてしまった。 これを修正するには、LOG.getHandlers()から返された既存のハンドラを削除し、カスタムハンドラを追加します。 – sappenin

+0

+1 GAE 1.9.1以降の回避策はまだ必要ですか?また、logging.propertiesの設定が無視される技術的理由を知っていますか? – Drux

2

それはあなたが探していたが、アプリケーションではなく、直接、7月を使用してSimple Logging Facade for Java (SLF4J)を使用して検討している?解決策ではないかもしれませんか

+0

は、これは私がやって終わるものですLog4JとカスタムアペンダーでSLF4Jを使用します。 – aimless

1
public static void addStreamHandler(){ 

    // TODO check if appCode has X length 
    CustomHandler handler = new CustomHandler(); 
    LogManager manager = LogManager.getLogManager(); 
    Enumeration<String> e = manager.getLoggerNames(); 
    while (e.hasMoreElements()){ 

     Logger logger = manager.getLogger(e.nextElement()); 
     if (logger.getName().startsWith("com.google"))continue; 
     logger.addHandler(handler); 
     System.out.println(logger.getName()); 
    } 
    System.out.println("***finished*****"); 
} 

public static void removeStreamHandlers(){ 

    LogManager manager = LogManager.getLogManager(); 
    Enumeration<String> e = manager.getLoggerNames(); 
    while (e.hasMoreElements()){ 

     Logger logger = manager.getLogger(e.nextElement()); 
     Handler[] handlers = logger.getHandlers(); 
     for (int i = 0; i < handlers.length; i++){ 
      Handler h = handlers[i]; 
      if (h instanceof CustomHandler){ 
       logger.removeHandler(h); 
       break; 
      } 
     } 
    } 
}