有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在Java中以摘要方式记录事件,而不是每次事件

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

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

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


共 (1) 个答案

  1. # 1 楼答案

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

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


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

    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);
        }
    }