[英]Log4j log in calling class
我在一個項目中使用Log4j,該項目根據調用類所在的包將其日志重定向到多個不同的文件。但是,我的項目中有一些util類在整個項目中使用,我希望將其日志附加到適當的日志取決於調用的類。 如果出現錯誤,我可以拋出異常,但是如果出現警告,則不是一個好主意。 有沒有一種方法可以根據調用類來“重定向” util類的日志?
您可以使用stacktrace來獲取調用方(請參閱如何使用stacktrace或反射來找到方法的調用方? ),但這可能會損害應用程序的性能。
另一個選擇是使用線程本地存儲來設置當前使用的記錄器-但我認為這又有些過頭了。
我不知道這樣做的任何“標准”方式...
我想建議您幾個解決方案:
首先是將所有消息登錄到同一文件中,但根據上下文對其前綴不同,這樣可以輕松對其進行過濾。一種過濾方法是使用org.apache.log4j.NDC 。
二是嘗試一些像這樣 。 它是將特定類的輸出記錄到特定附加程序的最簡單解決方案:-)
如果您的項目不大,並且重構不會成為大問題,那么我將擺脫靜態方法。 這樣,您可以在任何需要的地方使用注入將Logger
傳遞到實用程序類:
public class MyUtils {
private final Logger logger;
public MyUtils (Logger logger) {
this.logger = logger;
}
public void doSomething(...) {
// use the logger
}
}
然后,您將在最頂層的父類中實例化該實用工具類,並在子類中使用相同的實用工具類; 就像是
public abstract class BaseClass {
// You can use log4j to log in different files;
// e.g. you would probably want all child classes of BaseClass to use the same log
private static final Logger LOGGER = Logger.getLogger("some_log");
// Doesn't have to be static, but one instance would be enough in this case
private static final MyUtils UTILS = new MyUtils(LOGGER);
}
然后在子類中,您將使用如下所示的實用程序類:
getUtils().doSomething();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.