在游戏开发中,经常调用许多方法(例如每秒60次)。有时我甚至会在这种方法中记录捕获的异常,但不是经常这样。
我的想法是仅记录在特定方法中出现的第一次出现的异常,但我没有找到任何方便或内置的解决方案(至少在java中)。
答案 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();
}
}
这样,您每秒必须做六十次的唯一电话就是一个简单的Map#get
,一个if
比较和一个MyTimer#setToNow
。
答案 1 :(得分:1)
为了在我的自制游戏项目中解决这个问题,我决定只记录&#34; new&#34;消息。我使用了以下方法:
我无法向您展示我的实际代码,因为它不是在Java和使用的宏上,而是使用log4j
Filter
s可以像这样实现:
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;
}
}