我想將系統日誌與用戶日誌分開。系統日誌是開發人員和維護人員所關注的內容。用戶日誌爲用戶提供系統信息,而無需所有技術細節。我想將不同的日誌消息存儲在不同的文件中,一個用於技術人員,另一個用於用戶。配置多個log4j2記錄器
我看了很多選項,包括自定義級別和過濾器。我可以在過濾器可以用來識別用戶消息的消息開頭添加一個關鍵字。我正在試驗爲使用標準錯誤級別的用戶消息添加一個單獨的記錄器。
我寫了一個簡單的演示程序進行測試。它創建2個記錄器,然後生成一些錯誤消息。
package demo;
import java.io.IOException;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class Logdemo {
private final static Logger logger = LogManager.getLogger();
private final static Logger userLog = LogManager.getLogger("demo.userMsg");
public static void main(String[] args) throws IOException {
try {
((Object) null).toString();
} catch (Exception e) {
logger.error("error message", e);
}
try {
((Object) null).toString();
} catch (Exception e) {
logger.fatal("User level Red message" ,e);
}
try {
((Object) null).toString();
} catch (Exception e) {
userLog.error("User level Amber message" ,e);
}
logger.info("Errors Logged");
userLog.info("Lunch is served.");
}
}
在config文件中我有:
<Loggers>
<Root level="all">
<AppenderRef ref="RollingFile" level="ALL"/>
<AppenderRef ref="Console" level="ALL"/>
</Root>
<userMsg name="demo.userMsg" level = "all">
<AppenderRef ref="UserMsgFile" level="ALL"/>
</userMsg>
</Loggers>
</Configuration>
由此我得到的NetBeans以下錯誤消息:
run:
2017-09-18 22:20:13,933 main ERROR Error processing element UserMsgFile [Appenders: null]): CLASS_NOT_FOUND
2017-09-18 22:20:13,936 main ERROR Error processing element userMsg ([Loggers: null]): CLASS_NOT_FOUND
22:20:14.038 [main] INFO demo.Logdemo - logger starting...
22:20:14.040 [main] ERROR demo.Logdemo - error message
所有的異常信息都寫入到控制檯,包括用於userLog的消息。所以我知道兩個記錄器都在工作。記錄器appender寫入文件確定。 userLog記錄器沒有創建任何文件,它使用幾乎相同的appender。
看來我還沒有正確地命名一些東西來讓log4j2找到記錄器。我嘗試過不同的命名組合,以便正確使用它,但我無法弄清楚問題所在。
我還沒有做的另一件事是在不同的類中使用userLog記錄器。我不需要知道用戶日誌消息是由哪個類生成的,所以我想在所有類中使用相同的記錄器名稱,而不使用類標識符。我懷疑我不能那樣做。
所以我的問題是: 我在配置文件中犯了什麼錯誤?
編輯: 以下配置條目起作用。這給了兩個記錄器。有兩個問題。一個是記錄器的名稱是包名。另一個是我沒有正確使用Logger這個詞。
<Loggers>
<Logger name="demo" level="all"> <!-- name = package name -->
<AppenderRef ref="UserLogFile" level="ALL" />
</Logger>
<Root level="all">
<AppenderRef ref="Console" level="ALL"/>
<AppenderRef ref="SystemLogFile" level="ALL"/>
</Root>
</Loggers>
我需要在每個類的記錄器啓動中包含類名嗎?
編輯:我需要包括包名稱。這花了我一段時間才弄清楚。
我遇到的另一個問題是打開log4j2的調試消息。這是通過以下方式實現的:
<Configuration status="WARN"> <!-- to debug, set status="TRACE" -->
嗨,你的方法應該工作。我注意到你說過「給日誌消息添加一個標記允許我使用不同的appender來處理用戶消息」,但是可以在沒有標記的情況下執行此操作。我認爲你的標記是正確的,因爲如果你沒有使用標記,你將不得不創建多個記錄器,我發現它的可讀性較差。 –
另一件事 - 如果你有你的「演示」記錄器的唯一原因是分配「UserLogFile」appender,那麼你真的不需要這個記錄器。由於你的appender有一個MarkerFilter,你可以將它分配給根記錄器,它應該以同樣的方式工作。 –
Hi#D.B在爬上記錄器學習曲線(還有很長的一段路要走)之後,我寫的代碼完成了這項工作。我可以看到演示記錄器不是必需的,但我認爲在那裏忘記我所做的事情會讓我在幾年後更容易閱讀代碼。 – dazz