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