Apache Log4j是一个基于Java的日志记录工具。它是由Ceki Gülcü首创的,现在则是Apache软件基金会的一个项目。 log4j是几种常用的Java日志框架之一。其衍生工具有Log4j2/logback.
有三种方法来配置log4j:通过.properties文件,通过XML文件,通过Java代码。通过上述三种方法,你可以定义log4j的三个主要组件:Logger、Appender和Layout。通过文件配置log4j,具有无需修改应用字节码即可打开或关闭日志的好处,实现配置的软编码。
Logger(记录器)是日志的逻辑文件名。其使用已知的Java应用程序的名称。每个记录器当前以什么日志记录级别(FATAL、ERROR等)记录是独立配置的。在log4j的早期版本中,这些被称为类别(category)和优先级(priority),但现在他们分别被称为logger(记录器)和level(级别)。
实际的输出是通过Appender(输出源)。有许多可用的Appender,比如FileAppender、ConsoleAppender、SocketAppender、SyslogAppender、NTEventLogAppender,甚至SMTPAppender。多个Appender可以被关联到任何Logger上,所以可以到多个输出文件上记录相同的信息,例如同时到一个本地文件和通过套接字监听器到另一台计算机上。
Appender使用Layout(布局)格式化日志条目。常用的格式化为“一次一行”式日志文件的布局是PatternLayout,其使用一个模式字符串,就像C/C++函数printf那样。此外还有HTMLLayout和XMLLayout,使用HTML或XML格式的时候会更方便。
log4j 1.2 配置示例
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE log4j:configuration PUBLIC "-//LOGGER" "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd"> <log4j:configuration> <!-- 定义输出源 可以有多个 --> <appender name="stdout" class="org.apache.log4j.ConsoleAppender"> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="[%c] %5p - %m %d{yyyy-MM-dd HH:mm:ss}%n"/> </layout> <!-- 过滤器设置appender输出级别 --> <filter class="org.apache.log4j.varia.LevelRangeFilter"> <!-- org.apache.log4j.Level 中的toLevel(String str) 有String.toUpperCase()--> <param name="levelMin" value="debug"/> <param name="levelMax" value="error"/> </filter> </appender> <appender name="errorFile" class="org.apache.log4j.RollingFileAppender"> <!-- 定义输出到文件的文件名,及其路径 --> <param name="File" value="${catalina.base}/log/${project.artifactId}.log"/> <!-- 设置是否在重新启动服务时,在原有日志基础上添加新行 --> <param name="Append" value="true"/> <!-- 设置最大文件容量 --> <param name="MaxFileSize" value="100KB"/> <!-- 设置最多文件数量,当容量达到时,旧文件将生成fileName.log.1~index --> <param name="MaxBackupIndex" value="3"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="[%c] %5p - %m %d{yyyy-MM-dd HH:mm:ss}%n"/> </layout> <filter class="org.apache.log4j.varia.LevelRangeFilter"> <param name="levelMin" value="error"/> <param name="levelMax" value="error"/> </filter> </appender> ... <!-- additivity 继承配置,设置为true时,当Clazz.class包含属性name指定的值时,符合条过滤条件.默认为true --> <logger name="com.sknn" additivity="false"> <level value="error"/> <appender-ref ref="errorFile"/> </logger> <!-- 可以有多个logger--> ... <!-- 只有一个root --> <root> <!-- 也可以使用level标签指定基本日志等级 --> <priority value="debug"/> <appender-ref ref="stdout"/> <appender-ref ref="errorFile"/> </root> </log4j:configuration>
log4j.dtd结构(1.2X版本,不含log4j2)
根标签:<log4j:configuration />,必须包含在所有配置元素外.
<!ATTLIST log4j:configuration xmlns:log4j CDATA #FIXED "http://jakarta.apache.org/log4j/" threshold (all|trace|debug|info|warn|error|fatal|off|null) "null" debug (true|false|null) "null" reset (true|false) "false" >
<appender/>,ELEMENT表示其子标签的类型,ATTLIST为其属性名及其是否为必须属性.name值可以为任意值,但是不要重复.该标签的主要是指定输出目的地,如控制台/文件/邮件等.
<!ELEMENT appender (errorHandler?, param*, rollingPolicy?, triggeringPolicy?, connectionSource?, layout?, filter*, appender-ref*)> <!ATTLIST appender name CDATA #REQUIRED class CDATA #REQUIRED >
<logger/>,在上面xml配置中,指定logger.name="com.sknn"表示类别为"com.sknn"的logger只记录level为error/更高级别的消息. 例:在使用Logger.getLogger(User.class),而User.class在com.sknn或者其子包下时,即得到的logger的%c在该类别下. 划分更细致的logger类别会覆盖范围较大的,可以利用这一点来设置大类下的特殊小类别.
<!ELEMENT logger (param*,level?,appender-ref*)> <!ATTLIST logger class CDATA #IMPLIED name CDATA #REQUIRED additivity (true|false) "true" >
<root />,指定所有appender的级别,低于该级别的将不输出.没有在<root/>中注册的appender将不输出.(除非另有logger定义)
<!ELEMENT root (param*, (priority|level)?, appender-ref*)>