ゲーム開発では、多くのメソッドが非常に頻繁に呼び出されます(たとえば、毎秒60回)。時には、そのようなメソッドでもキャッチされた例外をログに記録したいのですが、それはしばしばログに記録しません。頻繁に呼び出されるメソッドのログ練習
私の考えは、特定のメソッドで発生した例外の最初の出現を記録することでしたが、(Javaでは少なくとも)それを行う便利なまたは組み込みの解決策は見つかりませんでした。
ゲーム開発では、多くのメソッドが非常に頻繁に呼び出されます(たとえば、毎秒60回)。時には、そのようなメソッドでもキャッチされた例外をログに記録したいのですが、それはしばしばログに記録しません。頻繁に呼び出されるメソッドのログ練習
私の考えは、特定のメソッドで発生した例外の最初の出現を記録することでしたが、(Javaでは少なくとも)それを行う便利なまたは組み込みの解決策は見つかりませんでした。
この機能をサポートする特定のロガーを使用していない限り、取得しようとしている動作はフラグシステムによって把握できます。
たとえば、あなたがこのようなあなたのロギングクラスにマップを追加することができます。
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#get
、if
の比較とMyTimer#setToNow
です。
私の自宅のゲームプロジェクトでこの問題を解決するために、私は "新しい"メッセージだけを記録することに決めました。私は次のアプローチを使用しました:
私はそれがJavaおよび使用されるマクロではなかったとして、あなたに私の実際のコードを示すが、log4j
Filter
と、それは次のように達成することができますよできません。
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;
}
}
なぜあなただけではないんフラグを作成する?本当の場合は、ログに記録してfalseに設定します。 – Nathan
ありがとう、これはトリックを行うだろうが、私はこのロジックがアプリケーションではなくロガーにカプセル化されているソリューションを期待していました。 – Sebastian
一般的に、その種のロジックはロガーでは処理されず、ロギングアダプターで処理されます。たとえば、イベントをログに記録している場合は、ログ・メッセージをクリティカルなコード・パスにないものに永続化する責任を負うことになります。これを済ませたら、絞り込みや集約の考え方がずっと簡単になります。 –