我有一个应用程序需要编写两种不同类型的日志:应用程序日志和审计日志。应用程序日志用于调试目的,而审计日志用于记录执行的操作。两个日志都将位于不同的文件中,并且每个文件应该只包含提到的那些日志(意味着审计日志文件不能有应用程序日志,反之亦然)。
如何使用 log4j 实现这一点?
我知道实现这一点的一种方法是在 log4j 中定义自定义日志级别。还有其他/更好的方法吗?
我有同样的用例。在您的 log4j.xml 中,您可以定义两个不同的记录器和每个记录器的附加程序。因此举个例子:
<logger name="LOGGER_1" additivity="false">
<appender-ref ref="LOGGER_FILE_1"/>
</logger>
<appender name="LOGGER_FILE_1" class="org.jboss.logging.appender.RollingFileAppender">
<errorHandler class="org.jboss.logging.util.OnlyOnceErrorHandler"/>
<param name="File" value="${jboss.server.log.dir}/loggerFile1.log"/>
<param name="Append" value="true"/>
<param name="MaxFileSize" value="20MB"/>
<param name="MaxBackupIndex" value="5"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %-5p [%c] %m%n"/>
</layout>
</appender>
在您的 Java 代码中,您可以使用“Logger.getLogger("LOGGER_1")”创建一个记录器,它将日志输出写入定义的文件。
我不认为你需要一个新的水平。相反,您需要一个特定的Logger(或一组Loggers
)。
通常你用类/包名来实例化它们。但是,出于审计目的,您可以简单地用名称“审计”(或类似名称)实例化一个新Logger
的,然后使用标准机制进行适当的配置。
Log4j 2.0 的创建支持审计日志记录作为其主要目的之一。推荐的使用模式是使用 Log4j(或 SLF4J)的 EventLogger,然后使用 FlumeAppender,它可以保证交付到您的目标日志存储库。有关详细信息,请参阅http://logging.apache.org/log4j/2.x/manual/eventlogging.html和http://logging.apache.org/log4j/2.x/manual/appenders.html#FlumeAppender。如果您有其他问题,请随时在 Apache Log4j 邮件列表中提问。
Log4J 中的 appender 支持过滤器。为了分离 2 个文件中的消息,您可以使用 LevelMatchFilter http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/varia/LevelMatchFilter.html
所以基本上你为 2 个不同的文件定义了 2 个附加程序,每个文件都有适当的过滤器。
自定义日志级别是一个选项,但我不确定您是否需要它。
您可以定义 2 个附加程序:一个用于日志记录,另一个用于写入审计文件的审计。然后,您可以创建一个与审计附加程序连接的记录器,并使用它来报告审计操作,同时使用您通常使用的常规记录器保留所有其他报告。