我有一個場景,我想通過會話Id登錄到自定義Log4j Appender。換句話說,我想爲一個包設置一個記錄器(例如com.foo.bar),然後追加自定義Appender。只有當請求帶有相同的會話ID時,我想記錄消息以寫入與會話Id匹配的Appender。當我打開日誌記錄時,我們必須動態地添加一個Appender並將其名稱設置爲會話Id。我想要做的是有一個預先配置的Appender,我從log4j.xml文件中獲取並複製它,並將名稱設置爲與會話ID相同,然後將其添加到我的新記錄器中。爲了拉從配置文件中的附加器,我發現的唯一辦法是能夠做到這一點是(在這種情況下,即support_logger)一個appender連接到一個虛擬的記錄如何最好地複製配置的Log4j Appender
<appender name="console" class="org.apache.log4j.ConsoleAppender">
<param name="Target" value="System.out" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p: %c - %m%n" />
</layout>
</appender>
<logger name="support_logger">
<level value="debug" />
<appender-ref ref="console" />
</logger>
通過這樣做,然後我就可以通過編碼得到的附加器:
Appender appender = Logger.getLogger("support_logger").getAppender("console"));
問題是我現在有是,我需要創建一個新的記錄器,基於一些包,我很感興趣,然後取appender及其所有配置,並將其添加到新記錄器,但將Appender的名稱設置爲Session Id。
Logger newLogger = Logger.getLogger("com.foo.bar");
appender.setName(req.getSession().getId());
newLogger.addAppender(appender)
出現這種情況完全在第一時間,但如果我有相同包裝的另一個會話ID,然後在「控制檯」 appender就不再出現。當我在Appender上設置名稱時,我覆蓋了控制檯配置,因爲記錄器已經初始化,似乎無法恢復。
所以我的問題是這樣的。我正在尋找一種簡單的方法來將「控制檯」appender克隆到另一個appender,並使用會話ID設置名稱,並保留原來的「控制檯」記錄器配置,以便我可以在隨後的請求中訪問它。
我已經寫了一個Appender的克隆方法,但我不確定是否有更好的方法來處理Log4j API。