簡體   English   中英

Log4j登錄調用類

[英]Log4j log in calling class

我在一個項目中使用Log4j,該項目根據調用類所在的包將其日志重定向到多個不同的文件。但是,我的項目中有一些util類在整個項目中使用,我希望將其日志附加到適當的日志取決於調用的類。 如果出現錯誤,我可以拋出異常,但是如果出現警告,則不是一個好主意。 有沒有一種方法可以根據調用類來“重定向” util類的日志?

您可以使用stacktrace來獲取調用方(請參閱如何使用stacktrace或反射來找到方法的調用方? ),但這可能會損害應用程序的性能。

另一個選擇是使用線程本地存儲來設置當前使用的記錄器-但我認為這又有些過頭了。

我不知道這樣做的任何“標准”方式...

我想建議您幾個解決方案:

  1. 首先是將所有消息登錄到同一文件中,但根據上下文對其前綴不同,這樣可以輕松對其進行過濾。一種過濾方法是使用org.apache.log4j.NDC

  2. 二是嘗試一些像這樣 它是將特定類的輸出記錄到特定附加程序的最簡單解決方案:-)

如果您的項目不大,並且重構不會成為大問題,那么我將擺脫靜態方法。 這樣,您可以在任何需要的地方使用注入將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.

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