2012-03-22 24 views
4

私はモバイルアプリケーションのバックエンドとしてGAEを使用するプロジェクトに取り組んでいます。私たちは、プロジェクトで本当に良いログを実装したいと思っています。私はlog4j、logback-classic、logback-access、java.util.logging(JUL)およびslf4jについて多くの時間を費やしました。Google App Engine(GAE)でのログバックアクセスの使用

私の結論は、HTTP関連のものをロギングする場合(エラーなどでフル・リクエスト・データをロギングする場合など)、いくつかの優れた機能を備えているので、logback-accessを使用することです。

GAEはJULのログレベルのみをサポートしているため、logback-accessはslf4jをサポートしていないため、私はlogback-accessをインストールして、JULからGAEを通してすべてのログを書き込むようにしてください。

これは可能ですか?ログバックアクセスとJULの設定ファイルについては、誰でもこれを行い、私を導くことができますか?カスタムアペンダーを追加する必要はありませんが、ログバックアクセスはJUL経由で直接通信できますか(ドキュメントに従って設定に追加できるch.qos.logback.access.jetty.RequestLogImplへの接続について考えています)。または、Jettyのログバックアクセス設定がGAEに適用されないのですか?私は間違ったことをしたことがありますか?

ヒントをお待ちしています!

+0

誰もがGAEでjava.util.loggingを使用していますか?または、log4jを使用して独自のAppenderを作成してログレベルを修正しますか? –

答えて

3

私たちはそれを行い、2年間ログバックしていました。簡単な話は、アプリケーションがログバックを使用し、GoogleクラスがJULを直接使用しているため(そして、JULをGAEのログバックにリダイレクトできないため)、JULとログバックの設定が混在することになります。

私たちは2年後、slf4j + JUL構成に切り替えると、構成がより簡単で単一の構成ポイントになりました。 (:コードのフォローのトン警告):けれどもそれは、簡単ではありません

logging.properties:

.level = INFO 
handlers = com.acme.log.InfoHandler,com.acme.log.ErrorHandler 

# these should work, but they don't. See 
# http://code.google.com/p/googleappengine/issues/detail?id=7467 
com.acme.log.InfoHandler.level=ALL 
com.acme.log.ErrorHandler.level=WARNING 

# Example of log level setup for a single class 
# workaround http://code.google.com/p/google-guice/issues/detail?id=488 
com.google.inject.internal.util.level = WARNING 

InfoHandler.java:

/** 
* Logs {@link Level#INFO} to {@link System#out}. 
* This class is inspired by {@link ConsoleHandler} 
*/ 
public class InfoHandler extends StreamHandler { 

    public InfoHandler() { 
     setOutputStream(System.out); 
     setFilter(new MaxLevelFilter(Level.WARNING)); 
    } 

    @Override 
    public void publish(LogRecord record) { 
     super.publish(record); 
     flush(); 
    } 

    @Override 
    public void close() { 
     flush(); 
    } 

} 

ErrorHandler.java:

public class ErrorHandler extends StreamHandler { 

    public ErrorHandler() { 
     setOutputStream(System.err); 
    } 

    @Override 
    public void publish(LogRecord record) { 
     super.publish(record); 
     flush(); 
    } 

    @Override 
    public void close() { 
     flush(); 
    } 

} 

MaxLevel.java:

public class MaxLevelFilter implements Filter { 

    private final Level maxLevel; 

    public MaxLevelFilter(Level level) { 
     this.maxLevel = level; 
    } 

    @Override 
    public boolean isLoggable(LogRecord record) { 
     return maxLevel.intValue() > record.getLevel().intValue(); 
    } 

} 

また、サーバーの起動時に、アプリケーションリスナーでhereの回避策を適用する必要があります。

関連する問題