我有一个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
在我的班上,我得到了记录器:
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而不是另一个包,因为类必须在正常运行期间记录信息/错误消息和事务性“始终”消息。有没有办法完成我需要的东西,即使它写入两个不同的日志文件?
答案 0 :(得分:8)
由于同步问题,我认为log4j确实不支持两个写入同一文件的appender。如果可能的话,最好的办法是使用slf4j作为后端日志记录系统切换到Logback,因为Logback是log4j的后续版本,并且还支持多个appender写入一个文件。查看FileAppender,这是审慎的模式。
您的描述中的更新:,您似乎也应该查看markers。您只需要一个记录器实例,并且您可以使用标记获得更精细的控制,因为有了它们,您基本上会说“此日志语句具有特殊用途,并且必须使用适当的appender进行记录”。您还可以检查log appender additivity,这通常在您为一个日志语句使用两个或更多appender时使用。
答案 1 :(得分:2)
据我所知,带有包装和记录器的记录器的实例化。类标识符只是一种约定。您可以在任何类中自由创建多个记录器实例,并为其提供任何标识符。
Log alwaysLogger = LogFactory.getLog("a.b.c.ALWAYS");
Log sometimesLogger = LogFactory.getLog("a.b.c.SOMETIMES");
至于写入同一个文件,我没有尝试过,但它应该是可能的,至少从单个线程开始。您可能需要编写自己的appender而不是依赖于其中一个默认的appender。
答案 2 :(得分:2)
我使用AsyncAppender
来解决这个问题。我有我的主要appender指定了一个要登录的文件,并让我的其他appender引用它。
e.g。
<appender name="top" class="org.apache.log4j.rolling.RollingFileAppender">
<param name="file" value="myLog.log" />
</appender>
<appender name="other" class="org.apache.log4j.AsyncAppender">
<appender-ref ref="top" />
</appender>
<logger name="com.example.MyCLass">
<appender-ref ref="other" />
</logger>
您可以向其他appender添加其他过滤器或其他任何过滤器。据我自己的应用程序说,日志似乎滚动,并且appender过滤器按预期工作。
答案 3 :(得分:-1)