簡體   English   中英

在記錄日志時,為該類動態創建日志文件,並僅在log4j中登錄該文件

[英]While logging log create log file dynamically for that class and log into that file only in log4j

我在項目中使用log4j進行日志記錄。 我有一個包,它包含50多個Java類。 在記錄來自這些日志的日志時,如果log語句來自類A,則對於其他類,它應該放入A.log文件等。 我想在運行時這樣做。 不想為所有類在log4j.xml中編寫附加程序。 在運行時,它應該能夠標識該日志來自類A,因此將其記錄到A.log文件中。 我想通過在Java文件中進行最少的更改或不更改來實現此效果,因為它已經實現了。 我可以僅通過對該軟件包的log4j.xml文件進行更改來實現嗎? System.setProperty(“ logfilename”,“ className”)對我沒有用。 任何幫助表示贊賞。

首先,我覺得我應該指出, 這似乎是一種非常不尋常的采伐策略 通常,您將希望查看特定用戶與程序交互期間發生的情況的整體視圖,而不必引用數十個試圖跟蹤邏輯流程的日志文件。 例如,如果用戶通過調用A類來運行您的程序,然后A類使用B類,則您已經必須查看2條日志才能遵循用戶體驗。 試想一下,如果要為流入更多類的復雜的用戶交互操作執行此操作,還可以想象執行從A到B到A到B到C到B到A時執行跟蹤的難度。您將不得不查看A的日志,並以某種方式認識到執行將轉到類B,然后查看B的日志,依此類推。

綜上所述,如果您仍然想走這條路線,那么我不相信通過配置更改就可以實現所需的功能,但是除了配置更改外,還可以使用最少的代碼來實現。

如果您在有關擴展Log4j2查找的部分中閱讀log4j2手冊則會在其中看到有關如何實現查找的示例。 您可以按以下方式為記錄器名稱創建自己的查找:

package example;

import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.plugins.Plugin;
import org.apache.logging.log4j.core.lookup.StrLookup;

@Plugin(name = "logger", category = "Lookup")
public class LoggerLookup implements StrLookup{
    /**
     * Lookup the value for the key.
     * @param key  the key to be looked up, may be null
     * @return The value for the key.
     */
    public String lookup(String key) {
        return null;
    }


    /**
     * Lookup the value for the key using the data in the LogEvent.
     * @param event The current LogEvent.
     * @param key  the key to be looked up, may be null
     * @return The value associated with the key.
     */
    public String lookup(LogEvent event, String key) {
        if("name".equals(key)){
            return event.getLoggerName();
        }
        return null;
    }
}

現在,使用路由附加器通過在運行時根據記錄器名稱動態配置附加器,方法類似於下面的示例:

    <Routing name="MyRoutingAppender">
        <Routes pattern="$${logger:name}">
            <Route>
                <File
                    fileName="logs/${logger:name}.txt"
                    name="appender-${logger:name}">
                    <PatternLayout>
                        <Pattern>%d{HH:mm:ss.SSS} [%t] %-5level ${logger:name} - %msg%n</Pattern>
                    </PatternLayout>
                </File>
            </Route>
        </Routes>
    </Routing>

下面是生成一些日志記錄的兩個示例類。

首先是主班:

package example;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class SomeClass {

    private static final Logger log = LogManager.getLogger();   

    public static void main(String[] args){
        log.info("Here's some info!");
        log.error("Some erorr happened!");

        AnotherClass ac = new AnotherClass();
        ac.logSomething();
    }
}

第二類:

package example;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class AnotherClass {
    private static final Logger log = LogManager.getLogger();   

    public void logSomething(){
        log.info("This is yet another info message");
    }
}

以下是我用來測試的配置文件(log4j2.xml)。 請注意,我首先使用控制台附加程序來驗證新查詢是否正常運行,並決定保留它,因為它可能對閱讀此答案的人有所幫助。

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level ${logger:name} - %msg%n" />
        </Console>

        <Routing name="MyRoutingAppender">
            <Routes pattern="$${logger:name}">
                <Route>
                    <File
                        fileName="logs/${logger:name}.txt"
                        name="appender-${logger:name}">
                        <PatternLayout>
                            <Pattern>%d{HH:mm:ss.SSS} [%t] %-5level ${logger:name} - %msg%n</Pattern>
                        </PatternLayout>
                    </File>
                </Route>
            </Routes>
        </Routing>
    </Appenders>

    <Loggers>
        <Root level="debug">
            <AppenderRef ref="Console" level="info" />          
            <AppenderRef ref="MyRoutingAppender" level="info" />
        </Root>
    </Loggers>
</Configuration>

運行SomeClass在名為“ logs”的目錄中生成兩個日志文件,分別稱為“ example.AnotherClass.txt”和“ example.SomeClass.txt”。 第一個文件中的日志由AnotherClass生成,第二個文件中的日志由SomeClass生成

示例代碼生成的日志文件

所有這些只是概念的證明,因此您需要對其進行修改以適合您的需求。 希望它能說明您實現所需目標的一般方法。

暫無
暫無

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

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