我在记录应用程序事件时遇到了这个问题。下面是要求。
记录正在发生的基本应用程序事件、方法调用、它们的参数、返回、处理时间等。
但只有日志文件必须包含每个请求的 3 行日志。
第一行:记录请求详细信息,当请求进来时。
第二行:记录所有应用程序事件(这是问题所在)
第三行:记录请求销毁事件,当请求完成它的生命周期时。
这三个请求由命中请求时创建的事务 ID 标识,该 ID 放在MDC
of中slf4j
。
现在我被告知使用 aStringBuilder
来附加日志记录详细信息,它应该在控制器方法中初始化,将它的引用传递给每个被调用的方法,StringBuilder
在finally
控制器方法块中记录内容。
此实现使整个代码库变得丑陋。所以我尝试使用ThreadLocal
带有 a 的 varStringBuilder
来存储日志记录详细信息,并在请求被销毁时清理它以避免内存泄漏。相反,我尝试使用如下所示的实现(伪)。
ThreadLocal
用初始值初始化。
public static ThreadLocal<StringBuilder> log = new ThreadLocal<StringBuilder>() {
@Override protected StringBuilder initialValue() {
return new StringBuilder("|Internal");
}
};
将详细信息附加到ThreadLocal本版StringBuilder
SomeClass.log.get().append("|").append(whatever);
所有处理完成后,在 finally 块的控制器方法中将此内容写入日志文件作为日志的第二行,然后将其清理。但是我的队友对此非常怀疑。
你能告诉我在这种情况下的实施有什么问题吗(这是一个好方法)?
是否存在内存泄漏等问题?
对此的任何评论都非常感谢。
德玛西亚99
相关分类