文档章节

Log4J日志组件

Soarkey
 Soarkey
发布于 2017/08/15 22:25
字数 5194
阅读 81
收藏 0

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

属性 描述
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源码中已经写死。

10.相关资料

© 著作权归作者所有

上一篇: Java中的标记接口
下一篇: MATLAB常用函数
Soarkey
粉丝 1
博文 20
码字总数 28411
作品 0
其它
程序员
私信 提问
java日志组件介绍(common-logging,log4j,slf4j,logback)

common-logging common-logging是apache提供的一个通用的日志接口。用户可以自由选择第三方的日志组件作为具体实现,像log4j,或者jdk自带的logging, common-logging会通过动态查找的机制,...

五大三粗
2015/11/04
70
0
java日志组件介绍(common-logging,log4j,slf4j,logback )

common-logging是apache提供的一个通用的日志接口。用户可以自由选择第三方的日志组件作为具体实现,像log4j,或者jdk自带的logging, common-logging会通过动态查找的机制,在程序运行时自动...

凯文加内特
2015/05/08
291
0
Spring整合log4j日志组件

Log4j是Apache的一个开放源代码项目,通过使用Log4j,控制日志信息输送的目的地可以为控制台、文件、数据库、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;可以控制...

技术小能手
2018/11/01
0
0
Apache Log4j 2.12.1 发布,Java 日志组件

Apache Log4j 2.12.1 发布了。Log4j 是一个用于记录应用程序行为的框架。Log4j 2 是对 Log4j 的升级,提供了重大改进,超越其前身 Log4j 1.x,并提供许多其它现代功能 ,例如对标记的支持、使...

h4cd
08/12
1K
0
commons-logging,log4j,logback,slf4j之间的关系详解。

commons-logging 是apache最早提供的日志的门面接口。它的主要作用是提供一个日志门面,使用者可以使用不同的日志实现。用户可以自由选择第三方的日志组件作为具体实现,像log4j,或者jdk自带...

java技术栈
2017/08/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Docker 可视化管理 portainer

官网安装指南: https://portainer.readthedocs.io/en/latest/deployment.html docker-compose.yml 位置,下载地址:https://downloads.portainer.io/docker-compose.yml...

Moks角木
46分钟前
5
0
Spring Security 实战干货:必须掌握的一些内置 Filter

1. 前言 上一文我们使用 Spring Security 实现了各种登录聚合的场面。其中我们是通过在 UsernamePasswordAuthenticationFilter 之前一个自定义的过滤器实现的。我怎么知道自定义过滤器要加在...

码农小胖哥
50分钟前
7
0
常见分布式事务解决方案

1 微服务的发展 微服务倡导将复杂的单体应用拆分为若干个功能简单、松耦合的服务,这样可以降低开发难度、增强扩展性、便于敏捷开发。当前被越来越多的开发者推崇,很多互联网行业巨头、开源...

asdf08442a
50分钟前
3
0
influxdb continuous queries(cq)从入门到放弃

从前一篇influxdb的文章prometheus基于influxdb的监控数据持久化存储方案完成之后,就一直在折腾influxdb发布测试和生产环境的问题,经过接近2个月的验证,最终发现使用influxdb自带cq的方案...

狗陈
今天
7
0
7.线程通信

在现实生活中,如果一个人团队正在共同完成任务,那么他们之间应该有通信,以便正确完成任务。 同样的比喻也适用于线程。 在编程中,要减少处理器的理想时间,我们创建了多个线程,并为每个线...

Eappo_Geng
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部