多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# 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`和嵌入它的附加器的独立性。 **祝您学习愉快!**