53.md 6.3 KB
Newer Older
W
wizardforcel 已提交
1
# Log4j `XMLLayout` – 以 XML 格式创建日志
W
wizardforcel 已提交
2 3 4

> 原文: [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/)

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

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

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

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

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

W
wizardforcel 已提交
15
**步骤 2)在`log4j.properties`文件**中配置`XMLLayout`
W
wizardforcel 已提交
16

W
wizardforcel 已提交
17
`XMLLayout`类扩展了抽象的`org.apache.log4j.Layout`类,并从其基类覆盖`format()`方法以提供 XML 样式的格式。
W
wizardforcel 已提交
18 19 20

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

W
wizardforcel 已提交
21 22 23
1.  **`log4j:event`**:该标签包含有关记录器设置的信息,例如记录器名称,时间戳,级别和线程。
2.  **`log4j:message`**:它包含 CDATA 格式的实际日志消息。 
3.  **`log4j:locationInfo`**:它包含类文件中 log 语句的位置。
W
wizardforcel 已提交
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39

```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

```

W
wizardforcel 已提交
40
**步骤 3)配置`log4j.properties`并测试应用**
W
wizardforcel 已提交
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64

```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");
	}
}

```

W
wizardforcel 已提交
65
输出将记录在项目根文件夹中的`application.xml`文件中。 示例内容将如下所示:
W
wizardforcel 已提交
66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89

```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>

```

W
wizardforcel 已提交
90
## 要点
W
wizardforcel 已提交
91

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

W
wizardforcel 已提交
94
同样根据[`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 文件。”
W
wizardforcel 已提交
95

W
wizardforcel 已提交
96
例如,如果`abc``XMLLayout`输出所在的文件的名称,那么格式正确的 XML 文件将是:
W
wizardforcel 已提交
97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125

```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>

```

W
wizardforcel 已提交
126
这种方法增强了`XMLLayout`和嵌入它的附加器的独立性。
W
wizardforcel 已提交
127 128

**祝您学习愉快!**