您是否在Log4j中看到过根据NDC分离文件的appender?

我们只有极少数的客户(少于50个),我们希望每个客户都有自己独立的日志文件,其所有服务器端日志信息都会记录在其中。 我知道您可以使用NDC和filter使用Log4j中的标准appender将日志语句定向到不同的文件,但这需要更多的设置(为所有现有客户创建记录器),并且它不会自动适应添加的新客户进入系统。

你有没有见过一个appender会根据Log4j NDC值将日志语句拆分成单独的文件? 我想我可以建立一个新的appender来做它但我不能说如果我能得到已经构建好的东西我想要。

带有logback(log4j的后继者)的SiftingAppender正是为处理这种情况而设计的。

顾名思义, SiftingAppender可用于根据给定的运行时属性分离(或筛选)日志记录。 例如, SiftingAppender可以根据用户会话分离日志记录事件,以便每个用户生成的日志进入不同的日志文件,每个用户一个日志文件。 例如, SiftingAppender可以将日志记录事件分成不同的日志文件,每个用户一个文件。

SiftingAppender的文档包含一个基于用户ID分隔日志的示例。

我不知道任何标准甚至第三方的appender可以做到这一点,虽然你是正确的,你可以编写自己的我会倾向于使用标准文件appender之一(滚动或其他)并使用一个工具,可以过滤文本行(即从视图中排除任何与模式不匹配的行)来读取日志。 大多数可以过滤的编辑器也可以设置filter集,以便您可以重用现有模式。 我不会讨论使用哪个编辑器,因为我甚至不知道你正在使用什么操作系统,每个人都有自己的偏好。

听起来你想要一个多文件追加器的东西,你给出文件名的一部分,其余的用NDC填充。 我不知道这样的事情。 也许你必须自己动手。

如果你自己滚动,你可能想要创建一个内部使用动态创建的RollingFileAppender MapAppender 。 但是,我不知道Appender是否可以访问NDC。 这可能是一件非常重要的事情。

我也从未见过这样的追随者,但我认为编写自己的东西并不重要。 如果你想自己做 – 看看AppenderSkeleton ,你必须做的最少是覆盖append(..)方法。 当您的appender被调用时,您将获得完整形成的事件,其中包含所需的一切,包括NDC。 做任何你喜欢的事情然后..我认为MDC(映射诊断上下文)在你的情况下是可行的替代方案,它更灵活恕我直言。

如果您正在寻找商业解决方案 – 请查看logFaces ,它专为处理类似情况而设计。 披露 :我是该产品的作者。