gpt4 book ai didi

java - 动态跳过日志消息

转载 作者:行者123 更新时间:2023-12-01 14:45:34 26 4
gpt4 key购买 nike

我有两个想要跟踪的公共(public)方法。其中一个方法重复调用另一个方法。我想做的是仅跟踪从外部调用的方法。

这是一个简单的类来演示我的意思:

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 中测试它,但是如果有多个线程,这会变得很难看(因为这些是静态方法),并且看起来它开始用大量的日志基础设施污染类(class)。我可以使用 MDC 来存储信息,但这似乎是对 MDC 的滥用。

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

最佳答案

我假设您能够更改代码。那么我认为最简单的方法是通过引入另一个 internalFileExists(String filename) 或使用日志记录工具重载 fileExists(String filename) 来避免问题:

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 = false 的重载版本,而单参数版本重定向到 fileExists(filename, true)。

这并没有真正解决问题,而是减轻了问题。

关于java - 动态跳过日志消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15463837/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com