Log4j – 让多个appender写入同一个文件,并始终记录

我有一个log4j appender定义如下:

log4j.logger.com.example = DEBUG, filelog log4j.appender.filelog=org.apache.log4j.DailyRollingFileAppender log4j.appender.filelog.File=c:/app.log log4j.appender.filelog.layout=org.apache.log4j.PatternLayout log4j.appender.filelog.layout.ConversionPattern=%d | %m%n log4j.appender.filelog.DatePattern=.dd-MM-yyyy 

在我的class上,我得到了记录器:

 Log logger = LogFactory.getLog(getClass()); 

这工作正常。 我希望有一个记录器,它总是记录某些消息(不是错误,而是事务所花费的时间)。 如果我在DEBUG或INFO中写这些,如果更改了日志级别,我将看不到它们。 我想我可以使用写入同一文件的另一个appender来完成此操作。

这可能有两个appender写入同一个文件? 我如何获得我想在同一个类中使用普通调试appender和事务性appender的logger实例? 这些消息不会都在同一个包中,因此我无法将某个包配置为始终记录。 我是否必须让这些appender写入不同的文件,或者我可以在代码中检索它们并具有以下内容:

 Log alwaysLogger = LogFactory.getLog(ALWAYS); alwaysLogger.debug("This message will always be written regardless of the level set on the filelog appender"); 

更新我可以根据需要写入两个不同的日志文件,但是如何在我的类中获取记录器实例? 我不希望将一个包/类配置为始终使用一个appender而不是另一个包,因为类必须在正常运行期间记录信息/错误消息和事务性“始终”消息。 有没有办法完成我需要的东西,即使它写入两个不同的日志文件?

我不认为log4j真的支持两个写入同一文件的appender,因为同步问题。 如果可能的话,最好的办法是使用Logback作为后端日志系统切换到slf4j,因为Logback是log4j的后续版本,并且还支持多个appender写入一个文件。 查看FileAppender ,它是谨慎的模式。

更新:从你的描述,似乎你也应该检查标记 。 您只需要一个记录器实例,并且您可以使用标记获得更精细的控制,因为使用它们,您基本上会说“此日志语句具有特殊用途,并且必须使用适当的appender进行记录”。 您还可以检查log appender additivity ,这通常在您为一个日志语句使用两个或更多appender时使用。

据我所知,带有包和类标识符的记录器的实例化只是一种约定。 您可以在任何类中自由创建多个记录器实例,并为其提供任何标识符。

 Log alwaysLogger = LogFactory.getLog("abcALWAYS"); Log sometimesLogger = LogFactory.getLog("abcSOMETIMES"); 

至于写入同一个文件,我没有尝试过,但它应该是可能的,至少从单个线程。 您可能需要编写自己的appender而不是依赖于其中一个默认的appender。

我通过使用AsyncAppenderAsyncAppender这一点。 我有我的主appender指定了一个要登录的文件,并让我的其他appender引用它。

例如

          

您可以向其他appender添加其他filter或其他任何filter。 据我所知,我自己的应用程序,日志似乎滚动,并且appenderfilter按预期工作。

是。 你可以“解决”让2个appender写入同一个文件。

查看此代码+示例 :

欢迎任何问题。