经常调用的方法的记录实践

时间:2017-08-08 15:11:34

标签: java logging exception-handling

在游戏开发中,经常调用许多方法(例如每秒60次)。有时我甚至会在这种方法中记录捕获的异常,但不是经常这样。

我的想法是仅记录在特定方法中出现的第一次出现的异常,但我没有找到任何方便或内置的解决方案(至少在java中)。

2 个答案:

答案 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;消息。我使用了以下方法:

  1. 检测日志方法呼叫&#34;位置&#34;。
  2. 如果来自此位置的消息从上次更改后再进行记录,则忽略其他情况。
  3. 我无法向您展示我的实际代码,因为它不是在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;
      }
    }