簡體   English   中英

捕獲log4j輸出

[英]Capture log4j output

我們使用log4j2廣泛的在我們的系統,並與配置它log4j2.xml

現在,我需要一個運行jobs的新應用,並且我想分別捕獲時間X和Y之間生成的所有日志,並將其放入數據庫中。 從我們的框架進行的正常日志記錄應該照常發生(到文件或log4j2.xml指向的任何地方),但是從時間X到時間Y。

我還希望捕獲所有日志記錄,最好是捕獲到字符串列表或可以保存在數據庫表中的內容。

我的想法是創建一個新的Appender(捕獲所有日志輸出)並動態添加/刪除該附加程序以啟動和停止日志? 那行得通嗎? 我也可以在框架類中重新配置記錄器嗎?

有可能的。 您需要創建一個自定義附加程序。 例如:

public class CustomAppender extends AbstractAppender {

    private List<String> list = new ArrayList<>();

    public CustomAppender(String name, Filter filter, Layout<? extends Serializable> layout) {
        super(name, filter, layout);
    }

    public CustomAppender(String name, Filter filter, Layout<? extends Serializable> layout, boolean ignoreExceptions) {
        super(name, filter, layout, ignoreExceptions);
    }

    @Override
    public void append(LogEvent event) {
        byte[] data = getLayout().toByteArray(event);
        list.add(new String(data).trim()); // optional trim
    }

    @Override
    public void stop() {
        // Write to the database
        System.out.println(list);
    }

}

每個事件都將轉換為字符串,並添加到列表中。 刪除附加程序后,將自動執行stop方法。

以下代碼舉例說明了此附加器的用法。

public static void main(String[] args) {
    // Execute some jobs
    for (int n = 0; n < 10; n++) {
        dummyJob(n);
    }
}

private static void dummyJob(int n) {
    final LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
    final AbstractConfiguration config = (AbstractConfiguration) ctx.getConfiguration();

    // Create and add the appender
    CustomAppender appender = new CustomAppender("Custom", null, PatternLayout.createDefaultLayout());
    appender.start();
    config.addAppender(appender);

    // Create and add the logger
    AppenderRef[] refs = new AppenderRef[]{AppenderRef.createAppenderRef("Custom", null, null)};
    LoggerConfig loggerConfig = LoggerConfig.createLogger("false", Level.INFO, "com.company", "true", refs, null, config, null);
    loggerConfig.addAppender(appender, null, null);
    config.addLogger("com.company", loggerConfig);
    ctx.updateLoggers();

    // Run the job
    Logger logger = LogManager.getLogger("com.company");
    logger.info("Job {}", n);
    logger.info("Hello, World!");
    logger.info("This is awesome!");
    logger.info("Hope it works!");
    logger.info("Hope it helps!");

    // Remove the logger and appender
    config.removeLogger("com.company");
    config.removeAppender("Custom");
    ctx.updateLoggers();

}

后者的輸出:

[Job 0, Hello, World!, This is awesome!, Hope it works!, Hope it helps!]
[Job 1, Hello, World!, This is awesome!, Hope it works!, Hope it helps!]
[Job 2, Hello, World!, This is awesome!, Hope it works!, Hope it helps!]
[Job 3, Hello, World!, This is awesome!, Hope it works!, Hope it helps!]
[Job 4, Hello, World!, This is awesome!, Hope it works!, Hope it helps!]
[Job 5, Hello, World!, This is awesome!, Hope it works!, Hope it helps!]
[Job 6, Hello, World!, This is awesome!, Hope it works!, Hope it helps!]
[Job 7, Hello, World!, This is awesome!, Hope it works!, Hope it helps!]
[Job 8, Hello, World!, This is awesome!, Hope it works!, Hope it helps!]
[Job 9, Hello, World!, This is awesome!, Hope it works!, Hope it helps!]

您可以使用log4j2 JDBC附加程序來存儲

http://logging.apache.org/log4j/2.x/manual/appenders.html#JDBCAppender

以及選擇何時登錄的時間過濾器

http://logging.apache.org/log4j/2.x/manual/filters.html#TimeFilter

暫無
暫無

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

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