2017-08-08 11 views
2

ゲーム開発では、多くのメソッドが非常に頻繁に呼び出されます(たとえば、毎秒60回)。時には、そのようなメソッドでもキャッチされた例外をログに記録したいのですが、それはしばしばログに記録しません。頻繁に呼び出されるメソッドのログ練習

私の考えは、特定のメソッドで発生した例外の最初の出現を記録することでしたが、(Javaでは少なくとも)それを行う便利なまたは組み込みの解決策は見つかりませんでした。

+0

なぜあなただ​​けではないんフラグを作成する?本当の場合は、ログに記録してfalseに設定します。 – Nathan

+0

ありがとう、これはトリックを行うだろうが、私はこのロジックがアプリケーションではなくロガーにカプセル化されているソリューションを期待していました。 – Sebastian

+0

一般的に、その種のロジックはロガーでは処理されず、ロギングアダプターで処理されます。たとえば、イベントをログに記録している場合は、ログ・メッセージをクリティカルなコード・パスにないものに永続化する責任を負うことになります。これを済ませたら、絞り込みや集約の考え方がずっと簡単になります。 –

答えて

1

この機能をサポートする特定のロガーを使用していない限り、取得しようとしている動作はフラグシステムによって把握できます。

たとえば、あなたがこのようなあなたのロギングクラスにマップを追加することができます。

Map<Class, MyTimer> logged = new HashMap<>(); 

をそして、あなたのロギング機能で(のはlog(Object objectToLog)を言わせて):

if (objectToLog instanceof Exception) { 
    MyTimer t = logged.get(objectToLog.class); 
    if (t == null || t.getDifferenceTimeWithNow() > MYLOG.DELAY) { 
     log(objectToLog); 
     logged.put(objectToLog.class, t.setToNow()); 
    } 
    else { 
     t.setToNow(); 
    } 
} 

この方法では、唯一の呼び出しをあなたは秒を60回やらなければならず、単純なMap#getifの比較とMyTimer#setToNowです。

1

私の自宅のゲームプロジェクトでこの問題を解決するために、私は "新しい"メッセージだけを記録することに決めました。私は次のアプローチを使用しました:

  1. ログメソッド呼び出し "場所"を検出しました。
  2. この場所からのメッセージが最後の時刻から変更された場合はログに記録し、それ以外の場合は無視してください。

私はそれがJavaおよび使用されるマクロではなかったとして、あなたに私の実際のコードを示すが、log4jFilterと、それは次のように達成することができますよできません。

import java.util.*; 
import org.apache.log4j.Level; 
import org.apache.log4j.spi.Filter; 
import org.apache.log4j.spi.LoggingEvent; 
import org.apache.log4j.spi.LocationInfo; 

public class DuplicateMessagesFilter extends Filter { 
    Map<String,String> previousMessages = new HashMap<String,String>(); 

    @Override 
    public int decide(LoggingEvent event) { 
     LocationInfo locationInfo = event.getLocationInformation(); 
     String location = locationInfo.getFileName() + ":" + locationInfo.getLineNumber(); 
     String previousMessage = previousMessages.get(location); 
     if(previousMessage != null && previousMessage.equals(event.getMessage())){ 
     return DENY; 
     } 

     previousMessages.put(location, event.getMessage()); 
     return ACCEPT; 
    } 
} 
関連する問題