Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Log4j-让多个appender写入同一个文件,其中一个总是记录日志_Java_Logging_Log4j - Fatal编程技术网

Java Log4j-让多个appender写入同一个文件,其中一个总是记录日志

Java Log4j-让多个appender写入同一个文件,其中一个总是记录日志,java,logging,log4j,Java,Logging,Log4j,我有一个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.fi

我有一个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的记录器实例?这些消息不会都在同一个包中,因此我无法将某个包配置为始终记录。我是否必须让这些附加器写入不同的文件,或者我是否可以在代码中检索它们,并使用类似于:

Log alwaysLogger = LogFactory.getLog(ALWAYS);
alwaysLogger.debug("This message will always be written regardless of the level set on the filelog appender");
更新
如果需要,我可以写入两个不同的日志文件,但是如何在类中获取记录器实例呢?我不想将一个包/类配置为始终使用一个appender而不是另一个appender,因为在正常运行期间,类必须记录信息/错误消息和事务性“始终”消息。有没有一种方法可以实现我所需要的,即使它写入两个不同的日志文件?

由于同步问题,我不认为log4j真的支持两个appender写入同一个文件。如果可能的话,您最好切换到使用作为后端日志系统,因为Logback是log4j的继承者,并且还支持多个appender写入一个文件。退房,这是一种谨慎的模式


更新:根据您的描述,您似乎也应该退房。您只需要一个logger实例,并且可以使用标记获得更细粒度的控制,因为使用标记基本上可以说“此日志语句有特殊用途,必须使用适当的appender进行记录”。您还可以检查log appender,当您对一条日志语句使用两个或多个appender时,通常会使用它。

据我所知,使用包和类标识符实例化记录器只是一种惯例。您可以在任何类中自由创建多个记录器实例,并为它们提供任何标识符

Log alwaysLogger = LogFactory.getLog("a.b.c.ALWAYS");
Log sometimesLogger = LogFactory.getLog("a.b.c.SOMETIMES");
至于写入同一个文件,我还没有尝试过,但应该是可能的,至少从一个线程开始。您可能需要编写自己的appender,而不是依赖其中一个默认appender。

是。您可以“变通”让两个附加器写入同一个文件

签出此:


欢迎提出任何问题。

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

e、 g



您可以向其他附加器添加其他筛选器或其他任何内容。据我自己的应用程序所知,日志似乎在滚动,appender过滤器按预期工作。

好的,即使我需要写入一个单独的文件,如何在代码中同时获取两个记录器实例?我必须指定哪些包将使用一个appender而不是另一个appender吗?我不希望发生这种情况,因为这些类必须记录信息/错误消息以及“始终”行。这是正确的。可以为同一文件配置多个appender,这些appender将在一段时间内工作,但日志旋转将导致其中一个appender写入旧文件,并最终导致日志消息丢失。
<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>