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
Logging Log4j日志记录阈值_Logging_Log4j - Fatal编程技术网

Logging Log4j日志记录阈值

Logging Log4j日志记录阈值,logging,log4j,Logging,Log4j,当前日志记录阈值与日志级别有关(跟踪、调试、信息、警告、错误和致命) 这对我来说还不够。在紧急情况下,我有一个千兆字节的日志从第三方库写入错误类别。我不想打开此日志记录,因为我想查看此问题日志。大多数日志不断重复堆栈跟踪。 所以我想要一种能够 1) 如果阈值(kb/秒)被重新设置,则跳过日志(我的意思是当我们 写很多日志-我们可能会跳过一些)或 2) 跳过堆栈跟踪 如果在一段时间内打印了多(n)个stacktrace,则打印 请建议Log4j不要有现成的附件。但您可以执行以下操作: 为使用千

当前日志记录阈值与日志级别有关(跟踪、调试、信息、警告、错误和致命) 这对我来说还不够。在紧急情况下,我有一个千兆字节的日志从第三方库写入错误类别。我不想打开此日志记录,因为我想查看此问题日志。大多数日志不断重复堆栈跟踪。 所以我想要一种能够

  • 1) 如果阈值(kb/秒)被重新设置,则跳过日志(我的意思是当我们 写很多日志-我们可能会跳过一些)或
  • 2) 跳过堆栈跟踪 如果在一段时间内打印了多(n)个stacktrace,则打印

请建议Log4j不要有现成的附件。但您可以执行以下操作:

为使用千兆字节数据的第三方库添加附加器(“我有一个千兆字节的日志从第三方库写入错误类别”)。并配置附加器,使其不会使用如此大的存储容量

  • 滚动文件追加器 将此第三方库附加器配置为滚动文件。一段时间后,他们将使用最旧的文件,您只能保留最新的日志

  • 此附加程序接受存储过程的使用。编写一个存储过程,以便它可以执行您想要的操作

  • 对于第一个需求,请添加一个计算列,或者在存储过程中计算此值,然后添加到表列中。然后控制此值以决定是否需要将此日志行插入数据库

    对于第二个需求,您可以获取异常消息的散列值(MD5、SHA等)。若数据库表中存在此散列值,则可以忽略以插入它。或者,您可以计算它存在的数量,并决定如何相应地插入到数据库中


    出于这些目的,您不需要使用企业数据库,例如,您可以使用ApacheDerby,然后所有日志都保留在ApplicationServer中。我认为这个jdbcapender更能满足您的需求

    我以前也写过类似的东西(每次最多发送X封邮件)。它会给你一个方向。设置器不是强制性的,但它们允许您通过
    log4j.properties
    更改默认值

    public class LimitedSMTPAppender extends SMTPAppender {
    
        private int limit = 10;           // max at 10 mails ...
        private int cycleSeconds = 3600;  // ... per hour
    
        public void setLimit(int limit) {
            this.limit = limit;
        }
    
        public void setCycleSeconds(int cycleSeconds) {
            this.cycleSeconds = cycleSeconds;
        }
    
        private int lastVisited;
        private long lastCycle;
    
        protected boolean checkEntryConditions() {
            final long now = System.currentTimeMillis();
            final long thisCycle =  now - (now % (1000L*cycleSeconds));
            if (lastCycle!=thisCycle) {
                lastCycle = thisCycle;
                lastVisited = 0;
            }
            lastVisited++;
            return super.checkEntryConditions() && lastVisited<=limit;
        }
    
    }
    
    public class LimitedSMTPAppender扩展了SMTPAppender{
    private int limit=10;//最多10封邮件。。。
    私有整数周期秒=3600;/…每小时
    公共无效设置限制(整数限制){
    这个极限=极限;
    }
    公共无效设置周期秒(整数周期秒){
    this.cycleseseconds=cycleseseconds;
    }
    私人诊所;
    私人长周期;
    受保护的布尔checkEntryConditions(){
    final long now=System.currentTimeMillis();
    最终长周期=现在-(现在%(1000升*周期秒));
    如果(最后一个周期!=这个周期){
    lastCycle=此周期;
    lastVisited=0;
    }
    最后访问++;
    返回super.checkEntryConditions()&&lastVisited