Log4J日志组件

1.Log4J简介

log4j

Log4J是Apache的一个开放源代码项目,它是一个日志操作包,通过使用Log4J,可以指定日志信息输出的目的地,如控制台、文件、GUI组件、NT的事件记录器;还可以控制每一条日志输出格式。此外,通过定义日志信息的级别,能够非常细致地控制日志的输出,最令人感兴趣的是,这些功能可以通过一个配置文件来灵活进行配置,而不需要修改应程序代码。

2.获取Log4J

注意:Log4J 1.x和2.x版本差异较大,此处使用的是2.x版本,不适用于1.x版本!

方法1:导入jar包

Apache log4j 2.8.2 官方下载地址

方法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-api

log4j-core

log4j-core

3.三大组件

  • ** Logger** [日志]

负责生成日志,并能够对日志信息进行分类筛选,通俗地讲就是决定什么日志信息应该输出,什么日志信息应该被忽略。

  • ** Appender** [目的地]

    定义了日志信息输出的目的地,指定日志信息应该被输出到什么地方,这些地方可以是控制台、文件、网络设备等。

  • ** Layout** [格式]

    指定日志信息的输出格式。

log4j架构图

log4j-arch

一个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三者之间的关系如下图:

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 对象都有不同的属性,这些属性决定了该对象的行为。

属性描述
layoutAppender 使用 Layout 对象和与之关联的模式来格式化日志信息。
target目的地可以是控制台、文件,或依赖于 appender 的对象。
level级别用来控制过滤日志信息。
thresholdAppender 可脱离于日志级别定义一个阀值级别,Appender 对象会忽略所有级别低于阀值级别的日志。
filterFilter 对象可在级别基础之上分析日志信息,来决定 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
参数名称类型描述
filterFilterA Filter to determine if the event should be handled by this Appender. More than one Filter may be used by using a CompositeFilter.
layoutLayoutThe Layout to use to format the LogEvent. If no layout is supplied the default pattern layout of "%m%n" will be used.
followbooleanIdentifies 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.
directbooleanWrite 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.
nameStringThe name of the Appender.
ignoreExceptionsbooleanThe 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.
targetStringEither "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
参数名称类型描述
appendbooleanWhen 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.
bufferedIObooleanWhen 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.
bufferSizeintWhen bufferedIO is true, this is the buffer size, the default is 8192 bytes.
createOnDemandbooleanThe 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.
filterFilterA Filter to determine if the event should be handled by this Appender. More than one Filter may be used by using a CompositeFilter.
fileNameStringThe name of the file to write to. If the file, or any of its parent directories, do not exist, they will be created.
immediateFlushbooleanWhen 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.
layoutLayoutThe Layout to use to format the LogEvent. If no layout is supplied the default pattern layout of "%m%n" will be used.
lockingbooleanWhen 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.
nameStringThe name of the Appender.
ignoreExceptionsbooleanThe 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源码中已经写死。

10.相关资料

转载于:https://my.oschina.net/u/3296367/blog/1510777

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值