2013-03-17 66 views
0

我有两个我想跟踪的公共方法。其中一种方法反复调用其他方法。我想要做的只是跟踪从外部调用的方法。动态跳过日志消息

这里有一个简单的类来证明我的意思:

public class LoggingExample { 
    private static final Logger logger = LoggerFactory.getLogger(LoggingExample.class); 
    public static final String USER_ROOT = "/home/waisbrot"; 

    /** could be called by fileExistsRobust *or* from outside */ 
    public static boolean fileExists(String filename) { 
     logger.trace("Checking for file {}", filename); 
     File f = new File(filename); 
     return f.exists(); 
    } 

    /** always gets called from outside */ 
    public static boolean fileExistsRobust(String filename) { 
     logger.trace("Checking for any varient of {}", filename); 
     if (fileExists(filename)) 
      return true; 
     for (String prefix : prefixes) { // this list is 100 items long 
      if (fileExists(prefix + filename)); 
       return true; 
     } 
     return false; 
    } 
} 

其他地方在我的代码,我可以称之为fileExists,在这种情况下,我想获得印刷其日志消息(假设我跟踪它) 。但是如果我打电话fileExistsRobost比我想日志消息,而不是fileExists

我想跟踪这两种方法,但是当我打电话给第二个时,我会被埋在输出中。我希望Logback可以被配置来理解我想要的,但是我没有看到任何有用的文档。当我输入fileExistsRobust然后在fileExists中测试它时,我可以翻转一个标志,但是在多个线程中这会变得很难看(因为这些是静态方法),并且它似乎开始用大量日志记录基础设施来污染该类。我可以使用MDC来存储信息,但这似乎是滥用MDC。

之前有人遇到过这种情况吗?你是怎么处理的?

回答

1

我认为你可以改变代码。然后,在我看来,最简单的方式是通过与一家伐木的toogle引入另一internalFileExists(String filename)或超载FILEEXISTS(字符串文件名),避免了问题:

public static boolean fileExists(String filename, boolean doLog) { 
    if (doLog) logger.trace("Checking for file {}", filename); 
    File f = new File(filename); 
    return f.exists(); 
} 

,让fileExistsRobust使用重载版本doLog =假,而唯一的参数版本重定向到fileExists(文件名,true)。

这并没有真正解决问题,但缓解了它。

+0

我喜欢你首先提到的私人内部解决方案。 – 2013-03-19 01:44:55