簡體   English   中英

每次對logger.info/debug/warn()調用進行多次調用時,僅使用log4j記錄一次

[英]Logging with log4j only once every so many calls to logger.info/debug/warn() calls

我有一種情況,一條特定的日志消息可能會打印很多次(可能以百萬計)。 例如,如果我們記錄(使用logger.warn()方法)以查找每個缺少字段的記錄,則最終可能會記錄很多情況,其中輸入文件包含很多記錄而缺少字段(例如, HDFS上的大文件)。 這樣可以快速填滿磁盤空間。

為了避免這種情況,我嘗試為每個(例如)缺少字段的1000條記錄記錄一次。 我可以在log4j包之外實現所有這些邏輯,但是我想知道是否有更干凈的方法可以做到這一點。 理想情況下,所有這些邏輯都應納入log4j代碼中。

這似乎是一個經常遇到的問題,但是幾乎沒有任何信息。 有什么想法嗎?

Log4J不能開箱即用。 但是,您可以嘗試編寫自己的偵聽器。 如果要切換為Logback作為日志記錄框架,則有一個名為DuplicateMessageFilter的過濾器,該過濾器在重復一定次數后會丟棄消息。 您應該真正考慮這一點,因為太多的日志記錄肯定會影響您的性能。 Logback的配置方式與Log4J相同,並且開箱即用地支持SLF4J。

您可以使用計數器並以編程方式設置日志級別。 不是最好的軟件設計,但是如果您只想一次進行這種記錄就足夠了。

import org.apache.log4j.Level;
import org.apache.log4j.Logger;

public class LogExample {

    private static final Logger LOG = Logger.getLogger(LogExample.class);

    private static final Level DEFAULT_LOG_LEVEL = Level.ERROR;

    public static void main(final String[] args) {
        int count = 0;
        LOG.setLevel(DEFAULT_LOG_LEVEL);
        for (int i = 1; i < 1000000; i++) {
            count++;
            final boolean logInfo = (count % 1000) == 0;
            if (logInfo) {
                LOG.setLevel(Level.INFO);
            }
            LOG.info("test: " + i);
            if (logInfo) {
                LOG.setLevel(DEFAULT_LOG_LEVEL);
            }
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM