# Log4j `XMLLayout` – 以 XML 格式创建日志

> 原文： [https://howtodoinjava.com/log4j/how-to-create-logs-in-xml-format-using-log4j/](https://howtodoinjava.com/log4j/how-to-create-logs-in-xml-format-using-log4j/)

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

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

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

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

请遵循与[**使用 maven 配置 log4j**](//howtodoinjava.com/log4j/how-to-configure-log4j-using-maven/ "How to configure log4j using maven") 有关的步骤。

**步骤 2）在`log4j.properties`文件**中配置`XMLLayout`

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

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

1.  **`log4j:event`**：该标签包含有关记录器设置的信息，例如记录器名称，时间戳，级别和线程。
2.  **`log4j:message`**：它包含 CDATA 格式的实际日志消息。 
3.  **`log4j:locationInfo`**：它包含类文件中 log 语句的位置。

```java
# 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`并测试应用**

```java
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`文件中。 示例内容将如下所示：

```java
<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`](https://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/XMLLayout.html "XMLLayout java document")的 Java 文档，“`XMLLayout`的输出由一系列`log4j.event`元素组成，如`log4j.dtd`中所定义。 它不会输出完整的格式正确的 XML 文件。 该输出被设计为作为*外部实体*包含在单独的文件中，以形成正确的 XML 文件。”

例如，如果`abc`是`XMLLayout`输出所在的文件的名称，那么格式正确的 XML 文件将是：

```java
<!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`和嵌入它的附加器的独立性。

**祝您学习愉快！**