我希望你能帮助我。
我有一个需要记录事务的Web服务。由于存在许多命中,因此日志语句在日志文件中显示为不相交/碎片。
我已经考虑过将StringBuilder实例传递到整个层并将语句附加到此实例,然后在将响应返回给客户端之前,将其内容记录在最后一端(主控制器中的finally子句)。 这似乎是不必要的,我确信使用Log4J可以更清晰地完成它。
有人可以解释这个问题吗?
由于
答案 0 :(得分:8)
好处是你正在使用Log4j。库本身实现了嵌套诊断上下文(org.apache.log4j.NDC
)和映射诊断上下文(org.apache.log4j.MDC
)的概念。我想你一定要看看两者,因为那些允许你构建一些你可以在日志输出布局中使用的上下文。
答案 1 :(得分:1)
您可以考虑解决问题:在运行时登录时不是整合条目的所有部分,而是在分析数据的过程中合并它们。
例如,我们有一个记录大量数据的应用程序,其中快速响应非常重要。我们最近实现了一个(定制的)系统,该系统可以有效地记录关系数据库。但是,它的记录部分是用于记录的;我们只是按照应用程序生成它的顺序将元组数据附加到日志文件中。我们有可以对这种格式进行查询的工具,并且当我们开始厌倦每个针对日志格式的查询有效地需要对数据库中的每个表进行表扫描时,我们还计划生成以不同格式存储的数据库的新版本。
即使你不能直接使用这种技术,只要考虑它可能会给你在Log4J中做更好的事情的想法。
答案 2 :(得分:1)
你真的需要拥有所有日志语句,我的意思是它们在发生时被记录。如果您更改顺序,可能会错过一些可能需要跟踪棘手错误的事件序列。
您是否可以在消息中添加标识符,例如使用从中发出请求的线程ID或用户ID启动它们,这样您就可以使用类似grep的操作对日志运行查询。
grep userId *.log
该语句将以正确的顺序及其快速返回该用户的所有日志语句。
我们在高吞吐量交易平台上使用此技术,这是在日志文件中通过系统跟踪交易或用户请求的最简单方法。 它也不需要扩展或编写自己的记录器。
答案 3 :(得分:0)
我们需要解决过去类似的问题。我们创建了一个封装的消息对象,其中还包含有关消息(例如用户事务ID)和自定义appender类的元数据。在这个appender类中,我们使用instanceof语句从信封中获取元数据,而不是简单地调用toString(它应该返回一般appender的漂亮日志)。
或者您可以考虑使用SLF4J及其标准功能来传递带有日志消息的Marker对象。例如。请参阅Javadoc的debug(Marker marker, String msg)方法重载。
答案 4 :(得分:0)
还有一个想法,你可以考虑使用java.lang.ThreadLocal
来保存当前的1>},而不是在整个图层中传递一个StringBuilder实例,这可能导致相当笨拙的API(其他方法参数)。 em>可以在最后转储到日志的上下文。