Log4j XMLLayout – 以 XML 格式创建日志

Log4j XMLLayout – 以 XML 格式创建日志

原文: https://howtodoinjava.com/log4j/how-to-create-logs-in-xml-format-using-log4j/

Log4j 是一个简单而灵活的日志记录框架。 日志记录为开发人员提供了有关应用故障的详细上下文。 使用 log4j 可以在运行时启用日志记录,而无需修改应用二进制文件。 log4j 包的设计目的是使这些语句可以保留在出厂代码中,而不会造成高昂的性能成本。

Log4j 带有多个选项来格式化框架创建的日志文件。 它也可以创建简单的日志文件,html 日志文件或 xml 日志文件。

在这篇文章中,我将展示用于配置 log4j 以生成 xml 格式的日志的示例代码。

步骤 1)创建一个 Maven Java 项目并更新 log4j 依赖项

请遵循与使用 maven 配置 log4j 有关的步骤。

步骤 2)在log4j.properties文件中配置XMLLayout

XMLLayout类扩展了抽象的org.apache.log4j.Layout类,并从其基类覆盖format()方法以提供 XML 样式的格式。

这在 xml 标记中提供了以下信息:

  1. log4j:event:该标签包含有关记录器设置的信息,例如记录器名称,时间戳,级别和线程。
  2. log4j:message:它包含 CDATA 格式的实际日志消息。
  3. log4j:locationInfo:它包含类文件中 log 语句的位置。
# Define the root logger with file appender
log4j.rootLogger = DEBUG, XML

# Define the file appender
log4j.appender.XML=org.apache.log4j.FileAppender
log4j.appender.XML.File=application.xml

# Define the xml layout for file appender
log4j.appender.XML.layout=org.apache.log4j.xml.XMLLayout
log4j.appender.XML.layout.LocationInfo=true
log4j.appender.XML.Threshold=DEBUG

步骤 3)配置log4j.properties并测试应用

package com.howtodoinjava;

import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

public class Log4jXMLLayoutExample
{
	static Logger log = Logger.getLogger(Log4jXMLLayoutExample.class);

	public static void main(String[] args)
	{
		PropertyConfigurator.configure("log4j.properties");

		log.debug("Sample debug message");
		log.info("Sample info message");
		log.error("Sample error message");
		log.fatal("Sample fatal message");
	}
}

输出将记录在项目根文件夹中的application.xml文件中。 示例内容将如下所示:

<log4j:event logger="com.howtodoinjava.Log4jXMLLayoutExample" timestamp="1368417841874" level="DEBUG" thread="main">
	<log4j:message><!&#91;CDATA&#91;Sample debug message&#93;&#93;></log4j:message>
	<log4j:locationInfo class="com.howtodoinjava.Log4jXMLLayoutExample" method="main" file="Log4jXMLLayoutExample.java" line="14"/>
</log4j:event>

<log4j:event logger="com.howtodoinjava.Log4jXMLLayoutExample" timestamp="1368417841893" level="INFO" thread="main">
	<log4j:message><!&#91;CDATA&#91;Sample info message&#93;&#93;></log4j:message>
	<log4j:locationInfo class="com.howtodoinjava.Log4jXMLLayoutExample" method="main" file="Log4jXMLLayoutExample.java" line="15"/>
</log4j:event>

<log4j:event logger="com.howtodoinjava.Log4jXMLLayoutExample" timestamp="1368417841893" level="ERROR" thread="main">
	<log4j:message><!&#91;CDATA&#91;Sample error message&#93;&#93;></log4j:message>
	<log4j:locationInfo class="com.howtodoinjava.Log4jXMLLayoutExample" method="main" file="Log4jXMLLayoutExample.java" line="16"/>
</log4j:event>

<log4j:event logger="com.howtodoinjava.Log4jXMLLayoutExample" timestamp="1368417841893" level="FATAL" thread="main">
	<log4j:message><!&#91;CDATA&#91;Sample fatal message&#93;&#93;></log4j:message>
	<log4j:locationInfo class="com.howtodoinjava.Log4jXMLLayoutExample" method="main" file="Log4jXMLLayoutExample.java" line="17"/>
</log4j:event>

要点

如果您尝试在浏览器中查看以上文件,它将显示解析错误:“XML 解析错误:前缀未绑定到名称空间”。 这是预期的,因为日志文件不包含任何根元素。

同样根据XMLLayout的 Java 文档,“XMLLayout的输出由一系列log4j.event元素组成,如log4j.dtd中所定义。 它不会输出完整的格式正确的 XML 文件。 该输出被设计为作为外部实体包含在单独的文件中,以形成正确的 XML 文件。”

例如,如果abcXMLLayout输出所在的文件的名称,那么格式正确的 XML 文件将是:

<!DOCTYPE log4j:eventSet PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd" &#91;<!ENTITY data SYSTEM "abc">]>
<log4j:eventSet version="1.2" xmlns:log4j="http://jakarta.apache.org/log4j/">

	<log4j:event logger="com.howtodoinjava.Log4jXMLLayoutExample" timestamp="1368417841874" level="DEBUG" thread="main">
		<log4j:message><!&#91;CDATA&#91;Sample debug message&#93;&#93;></log4j:message>
		<log4j:locationInfo class="com.howtodoinjava.Log4jXMLLayoutExample" method="main" file="Log4jXMLLayoutExample.java" line="14"/>
	</log4j:event>

	<log4j:event logger="com.howtodoinjava.Log4jXMLLayoutExample" timestamp="1368417841893" level="INFO" thread="main">
		<log4j:message><!&#91;CDATA&#91;Sample info message&#93;&#93;></log4j:message>
		<log4j:locationInfo class="com.howtodoinjava.Log4jXMLLayoutExample" method="main" file="Log4jXMLLayoutExample.java" line="15"/>
	</log4j:event>

	<log4j:event logger="com.howtodoinjava.Log4jXMLLayoutExample" timestamp="1368417841893" level="ERROR" thread="main">
		<log4j:message><!&#91;CDATA&#91;Sample error message&#93;&#93;></log4j:message>
		<log4j:locationInfo class="com.howtodoinjava.Log4jXMLLayoutExample" method="main" file="Log4jXMLLayoutExample.java" line="16"/>
	</log4j:event>

	<log4j:event logger="com.howtodoinjava.Log4jXMLLayoutExample" timestamp="1368417841893" level="FATAL" thread="main">
		<log4j:message><!&#91;CDATA&#91;Sample fatal message&#93;&#93;></log4j:message>
		<log4j:locationInfo class="com.howtodoinjava.Log4jXMLLayoutExample" method="main" file="Log4jXMLLayoutExample.java" line="17"/>
	</log4j:event>

</log4j:eventSet>

这种方法增强了XMLLayout和嵌入它的附加器的独立性。

祝您学习愉快!