Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Java摘要记录事件,而不是每次事件_Java_Logging_Slf4j - Fatal编程技术网

用Java摘要记录事件,而不是每次事件

用Java摘要记录事件,而不是每次事件,java,logging,slf4j,Java,Logging,Slf4j,我的Java应用程序与数据库进行了大量的同步。每个这样的单一事件都会被记录,例如 logger.info("Starting synchronization..."); synchronizeWithDatabase(); logger.info("Synchronization has ended."); 这会把日志弄得乱七八糟。是否可以每小时记录一次摘要(例如,“从12:00:00到13:00:00有60个成功的同步事件”),并且每次只记录错误?

我的Java应用程序与数据库进行了大量的同步。每个这样的单一事件都会被记录,例如

logger.info("Starting synchronization...");
synchronizeWithDatabase();  
logger.info("Synchronization has ended.");

这会把日志弄得乱七八糟。是否可以每小时记录一次摘要(例如,“从12:00:00到13:00:00有60个成功的同步事件”),并且每次只记录错误?我使用的是slf4j记录器

最简单的方法是编写代码来执行您想要的操作。为每个“事件”编写一个包装类,跟踪您上次实际记录事件的时间以及事件发生的次数

然后,在记录的时间超过一小时的呼叫中,实际写入日志消息,并重置计数器


这是我头顶上的草图。没有靠近编译器。不打算用作完全烘焙的溶液

class QuenchData {
    private static final long delta = 1000 * 60 * 60; // 1 hr
    private long lastLogTime;
    private int count;
    void log(String message, Logger logger) {
       long now = System.getTimeInMillis();
       if (now < lastLogTime || now-lastLogTime >= delta) {
            String andAlso = String.format(" [occurred %d times]", count);
            logger.log(message + andAlso);
            lastLogTime = now;
            count = 0;
       } else
            count++;
       }
    }
} 

class QuenchedLogger {
    private Logger logger = new Logger(...whatever...);
    private Map<String, QuenchData> history = new HashMap<>();
      :
    synchronized void log(String message) {
       QuenchData qd = history.get(message);
       if (qd == null)
           history.put(message, (qd = new QuenchData()));
       qd.log(message, logger);
    }
}

      
类淬火数据{
专用静态最终长增量=1000*60*60;//1小时
私人长时间;
私人整数计数;
无效日志(字符串消息、记录器){
long now=System.getTimeInMillis();
if(now=delta){
String andAlso=String.format(“[发生了%d次]”,count);
logger.log(消息+andAlso);
lastLogTime=现在;
计数=0;
}否则
计数++;
}
}
} 
类猝灭记录器{
专用记录器=新记录器(…无论什么;
私有映射历史=新HashMap();
:
同步无效日志(字符串消息){
QuenchData qd=历史记录.get(消息);
如果(qd==null)
put(消息,(qd=new-QuenchData());
qd.log(消息、记录器);
}
}

“每次事件仅记录错误”您的意思是异常,对吗?不,错误,例如记录错误(“发生了错误”);编写这样一个类可能不像我想的那么简单。将出现并发问题,例如,当缓存重置并同时添加新条目时会发生什么情况?您正在替换写入日志消息。一点同步不会害死你的,不会的。关于如何以最佳方式实现它,有什么建议吗?答案中添加了粗略的想法。