1.Log4J简介
Log4J是Apache的一个开放源代码项目,它是一个日志操作包,通过使用Log4J,可以指定日志信息输出的目的地,如控制台、文件、GUI组件、NT的事件记录器;还可以控制每一条日志输出格式。此外,通过定义日志信息的级别,能够非常细致地控制日志的输出,最令人感兴趣的是,这些功能可以通过一个配置文件来灵活进行配置,而不需要修改应程序代码。
2.获取Log4J
注意:Log4J 1.x和2.x版本差异较大,此处使用的是2.x版本,不适用于1.x版本!
方法1:导入jar包
方法2:通过Maven引入
-
Maven坐标
<dependencies> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.8.2</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.8.2</version> </dependency> </dependencies> ```
log4j结构:
log4j-api
log4j-core
3.三大组件
- ** Logger** [日志]
负责生成日志,并能够对日志信息进行分类筛选,通俗地讲就是决定什么日志信息应该输出,什么日志信息应该被忽略。
-
** Appender** [目的地]
定义了日志信息输出的目的地,指定日志信息应该被输出到什么地方,这些地方可以是控制台、文件、网络设备等。
-
** Layout** [格式]
指定日志信息的输出格式。
log4j架构图
一个Logger可以有多个Appender,这意味着日志信息可以同时输出到多个设备上,每个Appender都对应一种Layout,Layout决定了输出日志信息的格式,也就是说,一个Logger的日志信息可以同时输出到多个目的地。例如要为Logger配置两个Appender,一个是File,一个是Console,则代码配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="error">
<appenders>
<!-- 控制台输出的配置 -->
<Console name="Console" target="SYSTEM_OUT">
<!-- 控制台只输出debug及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->
<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
<!-- 输出日志的格式 -->
<PatternLayout pattern="%d{yyyy:HH:mm:ss} %-5level %class{36}.%M - %msg%xEx%n"/>
</Console>
<File name="File" append="true" filename="E:/logs/app.log">
<!-- 输出日志的格式 -->
<PatternLayout pattern="%d{yyyy:HH:mm:ss} %-5level %class{36}.%M - %msg%xEx%n"/>
</File>
</appenders>
<!-- 定义logger,只有定义了logger并引入的appender,appender才会生效 -->
<loggers>
<!-- 建立一个默认的root的logger -->
<root level="debug">
<appender-ref ref="Console"/>
<appender-ref ref="File"/>
</root>
</loggers>
</configuration>
此时Logger、Appender、Layout三者之间的关系如下图:
4.Logger [日志]
Logger为日志对象,负责日志的打印,log4j中提供了以下日志级别:
Level | 描述 |
---|---|
ALL(全部) | 各级包括自定义级别 |
DEBUG(调试) | 指定细粒度信息事件是最有用的应用程序调试 |
ERROR(错误) | 错误事件可能仍然允许应用程序继续运行 |
FATAL(致命的) | 指定非常严重的错误事件,这可能导致应用程序中止 |
INFO(信息) | 指定能够突出在粗粒度级别的应用程序运行情况的信息的消息 |
OFF(关闭) | 这是最高等级,为了关闭日志记录 |
TRACE(细节) | 指定细粒度比DEBUG更低的信息事件 |
WARN(警告) | 指定具有潜在危害的情况 |
log4j中规定日志级别的顺序关系如下:
ALL < DEBUG < INFO < WARN < ERROR < FATAL < OFF
只有日志请求级别大与等于当前启用的日志级别,日志才会被启用。
当然,log4j官方也提供了让我们可以自由定义日志级别优先级的方法,Custom Log Levels。
5.Appender [目的地]
Apache Log4j 提供的 Appender 对象主要负责将日志信息打印至不同目的地,比如控制台、文件、网络套接字、NT 事件日志等。
每个 Appender 对象都有不同的属性,这些属性决定了该对象的行为。
属性 | 描述 |
---|---|
layout | Appender 使用 Layout 对象和与之关联的模式来格式化日志信息。 |
target | 目的地可以是控制台、文件,或依赖于 appender 的对象。 |
level | 级别用来控制过滤日志信息。 |
threshold | Appender 可脱离于日志级别定义一个阀值级别,Appender 对象会忽略所有级别低于阀值级别的日志。 |
filter | Filter 对象可在级别基础之上分析日志信息,来决定 Appender 对象是否处理或忽略一条日志记录。 |
在配置文件中可以按如下将appender对象添加至Logger对象:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="MyApp" packages="">
<Appenders>
<File name="MyFile" fileName="logs/app.log">
<PatternLayout>
<Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
</PatternLayout>
</File>
</Appenders>
<Loggers>
<Root level="error">
<AppenderRef ref="MyFile"/>
</Root>
</Loggers>
</Configuration>
log4j提供了非常多的输出源配置,如下
- Async Appender
- Cassandra Appender
- Console Appender(控制台)
- DailyRollingFileAppender (每天产生一个日志文件)
- Failover Appender
- File Appender(文件) 【只能把日志输出一个文件,不推荐】
- Flume Appender
- JDBC Appender
- JMS Appender
- JPA Appender
- Kafka Appender
- Memory Mapped File Appender
- NoSQL Appender
- Output Stream Appender
- Random Access File Appender
- Rewrite Appender
- Rolling File Appender(文件大小到达指定尺寸的时候产生一个新的文件)
- Rolling Random Access File Appender
- Routing Appender
- SMTP Appender
- ScriptAppenderSelector Appender
- Socket Appender
- Syslog Appender
- WriterAppender(将日志信息以流格式发送到任意指定的地方)
- ZeroMQ/JeroMQ Appender
A.ConsoleAppender选项
Threshold=WARN:指定日志消息的输出最低层次。
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
Target=System.err:默认情况下是:System.out,指定输出控制台
B.FileAppender 选项
Threshold=WARN:指定日志消息的输出最低层次。
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
File=mylog.txt:指定消息输出到mylog.txt文件。
Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖 指定的文件内容。
C.DailyRollingFileAppender 选项
Threshold=WARN:指定日志消息的输出最低层次。
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
File=mylog.txt:指定消息输出到mylog.txt文件。
Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定 的文件内容。
DatePattern='.'yyyy-ww:每周滚动一次文件,即每周产生一个新的文件。当然也可 以指定按月、周、天、时和分。即对应的格式如下:
1)'.'yyyy-MM: 每月
2)'.'yyyy-ww: 每周
3)'.'yyyy-MM-dd: 每天
4)'.'yyyy-MM-dd-a: 每天两次
5)'.'yyyy-MM-dd-HH: 每小时
6)'.'yyyy-MM-dd-HH-mm: 每分钟
D.RollingFileAppender 选项
Threshold=WARN:指定日志消息的输出最低层次。
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
File=mylog.log:指定消息输出到mylog.txt文件。
Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指 定的文件内容。
MaxFileSize=100KB: 后缀可以是KB, MB 或者是 GB. 在日志文件到达该大小 时,将会自动滚动,即将原来的内容移到mylog.log.1文件。
MaxBackupIndex=2:指定可以产生的滚动文件的最大数。
官方配置属性介绍:
- ConsoleAppender
参数名称 | 类型 | 描述 |
---|---|---|
filter | Filter | A Filter to determine if the event should be handled by this Appender. More than one Filter may be used by using a CompositeFilter. |
layout | Layout | The Layout to use to format the LogEvent. If no layout is supplied the default pattern layout of "%m%n" will be used. |
follow | boolean | Identifies whether the appender honors reassignments of System.out or System.err via System.setOut or System.setErr made after configuration. Note that the follow attribute cannot be used with Jansi on Windows. Cannot be used with direct. |
direct | boolean | Write directly to java.io.FileDescriptor and bypass java.lang.System.out/.err. Can give up to 10x performance boost when the output is redirected to file or other process. Cannot be used with Jansi on Windows. Cannot be used with follow. Output will not respect java.lang.System.setOut()/.setErr() and may get intertwined with other output to java.lang.System.out/.err in a multi-threaded application. New since 2.6.2. Be aware that this is a new addition, and it has only been tested with Oracle JVM on Linux and Windows so far. |
name | String | The name of the Appender. |
ignoreExceptions | boolean | The default is true, causing exceptions encountered while appending events to be internally logged and then ignored. When set to false exceptions will be propagated to the caller, instead. You must set this to false when wrapping this Appender in a FailoverAppender. |
target | String | Either "SYSTEM_OUT" or "SYSTEM_ERR". The default is "SYSTEM_OUT". |
xml配置文件如下
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="MyApp" packages="">
<Appenders>
<Console name="STDOUT" target="SYSTEM_OUT">
<PatternLayout pattern="%m%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="error">
<AppenderRef ref="STDOUT"/>
</Root>
</Loggers>
</Configuration>
- FileAppender
参数名称 | 类型 | 描述 |
---|---|---|
append | boolean | When true - the default, records will be appended to the end of the file. When set to false, the file will be cleared before new records are written. |
bufferedIO | boolean | When true - the default, records will be written to a buffer and the data will be written to disk when the buffer is full or, if immediateFlush is set, when the record is written. File locking cannot be used with bufferedIO. Performance tests have shown that using buffered I/O significantly improves performance, even if immediateFlush is enabled. |
bufferSize | int | When bufferedIO is true, this is the buffer size, the default is 8192 bytes. |
createOnDemand | boolean | The appender creates the file on-demand. The appender only creates the file when a log event passes all filters and is routed to this appender. Defaults to false. |
filter | Filter | A Filter to determine if the event should be handled by this Appender. More than one Filter may be used by using a CompositeFilter. |
fileName | String | The name of the file to write to. If the file, or any of its parent directories, do not exist, they will be created. |
immediateFlush | boolean | When set to true - the default, each write will be followed by a flush. This will guarantee the data is written to disk but could impact performance. Flushing after every write is only useful when using this appender with synchronous loggers. Asynchronous loggers and appenders will automatically flush at the end of a batch of events, even if immediateFlush is set to false. This also guarantees the data is written to disk but is more efficient. |
layout | Layout | The Layout to use to format the LogEvent. If no layout is supplied the default pattern layout of "%m%n" will be used. |
locking | boolean | When set to true, I/O operations will occur only while the file lock is held allowing FileAppenders in multiple JVMs and potentially multiple hosts to write to the same file simultaneously. This will significantly impact performance so should be used carefully. Furthermore, on many systems the file lock is "advisory" meaning that other applications can perform operations on the file without acquiring a lock. The default value is false. |
name | String | The name of the Appender. |
ignoreExceptions | boolean | The default is true, causing exceptions encountered while appending events to be internally logged and then ignored. When set to false exceptions will be propagated to the caller, instead. You must set this to false when wrapping this Appender in a FailoverAppender. |
xml配置文件如下
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="MyApp" packages="">
<Appenders>
<File name="MyFile" fileName="logs/app.log">
<PatternLayout>
<Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
</PatternLayout>
</File>
</Appenders>
<Loggers>
<Root level="error">
<AppenderRef ref="MyFile"/>
</Root>
</Loggers>
</Configuration>
关于其他Appender的详细配置可查看官方文档。
6.Layout [格式]
Layout组件用来决定日志的输出格式,它有以下几种类型:
- CSVLayout
- GELFLayout
- HTMLLayout (以HTML表格形式布局)
- JSONLayout
- PatternLayout (可以灵活地指定布局模式)
- RFC-5424Layout
- SerializedLayout
- SyslogLayout
- XMLLayout
- YAMLLayout
- SimpleLayout
PatternLayout的常用配置
PatternLayout配置格式默认为%r [%t] %p %c %x - %m%n
, 其中的模式转换字符含义如下表:
- 模式转换字符
转换字符 | 含义 |
---|---|
c | 使用它为输出的日志事件分类,比如对于分类 "a.b.c",模式 %c{2} 会输出 "b.c" 。 |
C | 使用它输出发起记录日志请求的类的全名。比如对于类 "org.apache.xyz.SomeClass",模式 %C{1} 会输出 "SomeClass"。 |
d | 使用它输出记录日志的日期,比如 %d{HH:mm:ss,SSS} 或 %d{dd MMM yyyy HH:mm:ss,SSS}。 |
F | 在记录日志时,使用它输出文件名。 |
l | 用它输出生成日志的调用者的地域信息。 |
L | 使用它输出发起日志请求的行号。 |
m | 使用它输出和日志事件关联的,由应用提供的信息。 |
M | 使用它输出发起日志请求的方法名。 |
n | 输出平台相关的换行符。 |
p | 输出日志事件的优先级。 |
r | 使用它输出从构建布局到生成日志事件所花费的时间,以毫秒为单位。 |
t | 输出生成日志事件的线程名。 |
x | 输出和生成日志事件线程相关的 NDC (嵌套诊断上下文)。 |
X | 该字符后跟 MDC 键,比如 X{clientIP} 会输出保存在 MDC 中键 clientIP 对应的值。 |
% | 百分号, %% 会输出一个 %。 |
- 格式修饰符
缺省情况下,信息保持原样输出。但是借助格式修饰符的帮助,就可调整最小列宽、最大列宽以及对齐。
下面的表格涵盖了各种修饰符:
|格式修饰符| 左对齐| 最小宽度 |最大宽度| 注释| |-|-|-|-| |%20c |否 |20 |无 |如果列名少于 20 个字符,左边使用空格补齐。| |%-20c |是 |20 |无 |如果列名少于 20 个字符,右边使用空格补齐。| |%.30c |不适用| 无 |30 |如果列名长于 30 个字符,从开头剪除。| |%20.30c |否 |20 |30 |如果列名少于 20 个字符,左边使用空格补齐,如果列名长于 30 个字符,从开头剪除。| |%-20.30c| 是 |20| 30 |如果列名少于 20 个字符,右边使用空格补齐,如果列名长于 30 个字符,从开头剪除。|
PatternLayout配置示例
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="error">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
7.配置文件
在应用程序中使用Log4J,首先在一个配置文件中配置Log4j的各个组件,然后就可以在程序中通过Log4JAPI来操作日志。
可以采用properties或xml格式的配置文件,配置文件实例如下:
- properties格式
log4j.rootLogger=DEBUG,CONSOLE,A1,im
log4j.addivity.org.apache=true
# 应用于控制台
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.Threshold=DEBUG
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
#log4j.appender.CONSOLE.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[thread] n%c[CATEGORY]%n%m[MESSAGE]%n%n
#应用于文件
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=file.log
log4j.appender.FILE.Append=false
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
# Use this layout for LogFactor 5 analysis
# 应用于文件回滚
log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender
log4j.appender.ROLLING_FILE.Threshold=ERROR
log4j.appender.ROLLING_FILE.File=rolling.log //文件位置,也可以用变量${java.home}、rolling.log
log4j.appender.ROLLING_FILE.Append=true //true:添加 false:覆盖
log4j.appender.ROLLING_FILE.MaxFileSize=10KB //文件最大尺寸
log4j.appender.ROLLING_FILE.MaxBackupIndex=1 //备份数
log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
#应用于socket
log4j.appender.SOCKET=org.apache.log4j.RollingFileAppender
log4j.appender.SOCKET.RemoteHost=localhost
log4j.appender.SOCKET.Port=5001
log4j.appender.SOCKET.LocationInfo=true
# Set up for Log Facter 5
log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout
log4j.appender.SOCET.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[thread]%n%c[CATEGORY]%n%m[MESSAGE]%n%n
# Log Factor 5 Appender
log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender
log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000
# 发送日志给邮件
log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender
log4j.appender.MAIL.Threshold=FATAL
log4j.appender.MAIL.BufferSize=10
log4j.appender.MAIL.From=web@www.wuset.com
log4j.appender.MAIL.SMTPHost=www.wusetu.com
log4j.appender.MAIL.Subject=Log4J Message
log4j.appender.MAIL.To=web@www.wusetu.com
log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout
log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
# 用于数据库
log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/test
log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver
log4j.appender.DATABASE.user=root
log4j.appender.DATABASE.password=
log4j.appender.DATABASE.sql=INSERT INTO LOG4J (Message) VALUES (’[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n’)
log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout
log4j.appender.DATABASE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A1.File=SampleMessages.log4j
log4j.appender.A1.DatePattern=yyyyMMdd-HH’.log4j’
log4j.appender.A1.layout=org.apache.log4j.xml.XMLLayout
#自定义Appender
log4j.appender.im = net.cybercorlin.util.logger.appender.IMAppender
log4j.appender.im.host = mail.cybercorlin.net
log4j.appender.im.username = username
log4j.appender.im.password = password
log4j.appender.im.recipient = corlin@cybercorlin.net
log4j.appender.im.layout=org.apache.log4j.PatternLayout
log4j.appender.im.layout.ConversionPattern =[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
- xml格式
<?xml version="1.0" encoding="UTF-8"?>
<!--
status : 这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,会看到log4j2内部各种详细输出
monitorInterval : Log4j能够自动检测修改配置文件和重新配置本身, 设置间隔秒数。
注:本配置文件的目标是将不同级别的日志输出到不同文件,最大2MB一个文件,
文件数据达到最大值时,旧数据会被压缩并放进指定文件夹
-->
<Configuration status="WARN" monitorInterval="600">
<Properties>
<!-- 配置日志文件输出目录,此配置将日志输出到tomcat根目录下的指定文件夹 -->
<Property name="LOG_HOME">${sys:catalina.home}/WebAppLogs/SSHExample</Property>
</Properties>
<Appenders>
<!--这个输出控制台的配置,这里输出除了warn和error级别的信息到System.out-->
<Console name="console_out_appender" target="SYSTEM_OUT">
<!-- 控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->
<ThresholdFilter level="warn" onMatch="DENY" onMismatch="ACCEPT"/>
<!-- 输出日志的格式 -->
<PatternLayout pattern="%5p [%t] %d{yyyy-MM-dd HH:mm:ss} (%F:%L) %m%n"/>
</Console>
<!--这个输出控制台的配置,这里输出warn和error级别的信息到System.err,在eclipse控制台上看到的是红色文字-->
<Console name="console_err_appender" target="SYSTEM_ERR">
<!-- 控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->
<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
<!-- 输出日志的格式 -->
<PatternLayout pattern="%5p [%t] %d{yyyy-MM-dd HH:mm:ss} (%F:%L) %m%n"/>
</Console>
<!-- TRACE级别日志 -->
<!-- 设置日志格式并配置日志压缩格式,压缩文件独立放在一个文件夹内,
日期格式不能为冒号,否则无法生成,因为文件名不允许有冒号,此appender只输出trace级别的数据到trace.log -->
<RollingRandomAccessFile name="trace_appender"
immediateFlush="true" fileName="${LOG_HOME}/trace.log"
filePattern="${LOG_HOME}/trace/trace - %d{yyyy-MM-dd HH_mm_ss}.log.gz">
<PatternLayout>
<pattern>%5p [%t] %d{yyyy-MM-dd HH:mm:ss} (%F:%L) %m%n</pattern>
</PatternLayout>
<Policies><!-- 两个配置任选其一 -->
<!-- 每个日志文件最大2MB -->
<SizeBasedTriggeringPolicy size="2MB"/>
</Policies>
<Filters><!-- 此Filter意思是,只输出debug级别的数据 -->
<!-- DENY,日志将立即被抛弃不再经过其他过滤器;
NEUTRAL,有序列表里的下个过滤器过接着处理日志;
ACCEPT,日志会被立即处理,不再经过剩余过滤器。 -->
<ThresholdFilter level="debug" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
</RollingRandomAccessFile>
<!-- DEBUG级别日志 -->
<!-- 设置日志格式并配置日志压缩格式,压缩文件独立放在一个文件夹内,
日期格式不能为冒号,否则无法生成,因为文件名不允许有冒号,此appender只输出debug级别的数据到debug.log -->
<RollingRandomAccessFile name="debug_appender"
immediateFlush="true" fileName="${LOG_HOME}/debug.log"
filePattern="${LOG_HOME}/debug/debug - %d{yyyy-MM-dd HH_mm_ss}.log.gz">
<PatternLayout>
<pattern>%5p [%t] %d{yyyy-MM-dd HH:mm:ss} (%F:%L) %m%n</pattern>
</PatternLayout>
<Policies><!-- 两个配置任选其一 -->
<!-- 每个日志文件最大2MB -->
<SizeBasedTriggeringPolicy size="2MB"/>
<!-- 如果启用此配置,则日志会按文件名生成新压缩文件,
即如果filePattern配置的日期格式为 %d{yyyy-MM-dd HH} ,则每小时生成一个压缩文件,
如果filePattern配置的日期格式为 %d{yyyy-MM-dd} ,则天生成一个压缩文件 -->
<!-- <TimeBasedTriggeringPolicy interval="1" modulate="true" /> -->
</Policies>
<Filters><!-- 此Filter意思是,只输出debug级别的数据 -->
<!-- DENY,日志将立即被抛弃不再经过其他过滤器;
NEUTRAL,有序列表里的下个过滤器过接着处理日志;
ACCEPT,日志会被立即处理,不再经过剩余过滤器。 -->
<ThresholdFilter level="info" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
</RollingRandomAccessFile>
<!-- INFO级别日志 -->
<RollingRandomAccessFile name="info_appender"
immediateFlush="true" fileName="${LOG_HOME}/info.log"
filePattern="${LOG_HOME}/info/info - %d{yyyy-MM-dd HH_mm_ss}.log.gz">
<PatternLayout>
<pattern>%5p [%t] %d{yyyy-MM-dd HH:mm:ss} (%F:%L) %m%n</pattern>
</PatternLayout>
<Policies>
<SizeBasedTriggeringPolicy size="2MB"/>
</Policies>
<Filters>
<ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
</RollingRandomAccessFile>
<!-- WARN级别日志 -->
<RollingRandomAccessFile name="warn_appender"
immediateFlush="true" fileName="${LOG_HOME}/warn.log"
filePattern="${LOG_HOME}/warn/warn - %d{yyyy-MM-dd HH_mm_ss}.log.gz">
<PatternLayout>
<pattern>%5p [%t] %d{yyyy-MM-dd HH:mm:ss} (%F:%L) %m%n</pattern>
</PatternLayout>
<Policies>
<SizeBasedTriggeringPolicy size="2MB"/>
</Policies>
<Filters>
<ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
</RollingRandomAccessFile>
<!-- ERROR级别日志 -->
<RollingRandomAccessFile name="error_appender"
immediateFlush="true" fileName="${LOG_HOME}/error.log"
filePattern="${LOG_HOME}/error/error - %d{yyyy-MM-dd HH_mm_ss}.log.gz">
<PatternLayout>
<pattern>%5p [%t] %d{yyyy-MM-dd HH:mm:ss} (%F:%L) %m%n</pattern>
</PatternLayout>
<Policies>
<SizeBasedTriggeringPolicy size="2MB"/>
</Policies>
<Filters>
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
</RollingRandomAccessFile>
</Appenders>
<Loggers>
<!-- 配置日志的根节点 -->
<root level="trace">
<appender-ref ref="console_out_appender"/>
<appender-ref ref="console_err_appender"/>
<appender-ref ref="trace_appender"/>
<appender-ref ref="debug_appender"/>
<appender-ref ref="info_appender"/>
<appender-ref ref="warn_appender"/>
<appender-ref ref="error_appender"/>
</root>
<!-- 第三方日志系统 -->
<logger name="org.springframework.core" level="info"/>
<logger name="org.springframework.beans" level="info"/>
<logger name="org.springframework.context" level="info"/>
<logger name="org.springframework.web" level="info"/>
<logger name="org.jboss.netty" level="warn"/>
<logger name="org.apache.http" level="warn"/>
</Loggers>
</Configuration>
8.第一个实例
App.java
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class App {
private static final Logger logger = LogManager.getLogger(App.class);
public static void main(String[] args) {
logger.info("信息提示");
logger.debug("调试信息");
logger.warn("警告");
logger.error("异常");
}
}
配置文件:log4j2.properties
status = error
dest = error
name = PropertiesConfig
rootLogger.level = debug
rootLogger.appenderRef.stdout.ref = Console
appender.console.type = Console
appender.console.name = Console
appender.console.target = SYSTEM_OUT
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = %d{yyyy:HH:mm:ss} %-5level %class{36}.%M - %msg%xEx%n
或者xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="error">
<appenders>
<!-- 控制台输出的配置 -->
<Console name="Console" target="SYSTEM_OUT">
<!-- 控制台只输出debug及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->
<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
<!-- 输出日志的格式 -->
<PatternLayout pattern="%d{yyyy:HH:mm:ss} %-5level %class{36}.%M - %msg%xEx%n"/>
</Console>
</appenders>
<!-- 定义logger,只有定义了logger并引入的appender,appender才会生效 -->
<loggers>
<!-- 建立一个默认的root的logger -->
<root level="trace">
<appender-ref ref="Console"/>
</root>
</loggers>
</configuration>
控制台输出结果
2017:21:51:17 INFO App.main - 信息提示
2017:21:51:17 DEBUG App.main - 调试信息
2017:21:51:17 WARN App.main - 警告
2017:21:51:17 ERROR App.main - 异常
至此,Log4j的第一个案例已经成功了!
9.常见错误
- ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console.
解决方案:
该错误的出现主要是因为log4j2.x版本配置文件的名称发生了变化,配置文件名称一定要是log4j2.properties或者log4j2.xml,而不能为log4j.properties或log4j.xml!具体原因可能是因为配置文件名称在log4j源码中已经写死。