(三)、log4j2使用原理及相关参数配置说明
2017-09-13 09:56
483 查看
如有看不懂的地方可以先看本人之前发表的(一)、log4j/、(二)、logback
+ slf4j
log4j2官方说明
log4j2官方API
先上log4j2.xml参数说明:
<?xml version="1.0" encoding="UTF-8"?>
<!-- status:日志打印级别,开发期可以设置为debug,生产上改为info -->
<!-- monitorInterval:含义是每隔5秒重新读取配置文件,可以不重启应用的情况下修改配置 -->
<Configuration status="info" monitorInterval="5">
<!-- 定义两个常量 -->
<properties>
<property name="LOG_HOME">logs</property>
<property name="FILE_NAME">mylog</property>
</properties>
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] - {%l} %logger{36} - %msg%n" />
</Console>
<!-- fileName:指定当前日志文件的位置和文件名称
filePattern:指定当发生Rolling时,文件的转移和重命名规则-->
<RollingRandomAccessFile name="File" fileName="${LOG_HOME}/${FILE_NAME}.log" filePattern="${LOG_HOME}/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd}-%i.log">
<PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss} [%t] - {%l} %logger{36} - %msg%n" />
<Policies>
<!-- TimeBasedTriggeringPolicy:这个配置需要和filePattern结合使用:
filePattern中配置的文件重命名规则是${FILE_NAME}-%d{yyyy-MM-dd HH-mm}-%i,最小的时间粒度是mm,即分钟,TimeBasedTriggeringPolicy指定的size是1,结合起来就是每1分钟生成一个新文件。
如果改成%d{yyyy-MM-dd HH},最小粒度为小时,则每一个小时生成一个文件。 -->
<TimeBasedT
4000
riggeringPolicy interval="1" />
<!-- SizeBasedTriggeringPolicy:指定当文件体积大于size指定的值时,触发Rolling -->
<SizeBasedTriggeringPolicy size="10 MB" />
</Policies>
<!--DefaultRolloverStrategy:指定最多保存的文件个数-->
<DefaultRolloverStrategy max="20" />
</RollingRandomAccessFile>
</Appenders>
<!-- Logger -->
<Loggers>
<Logger name="mylog" level="trace" additivity="false">
<AppenderRef ref="Console" />
<!--<AppenderRef ref="File"/>-->
</Logger>
<Root level="info">
<AppenderRef ref="Console" />
</Root>
</Loggers>
</Configuration>
PatternLayout含义:
%d{HH:mm:ss.SSS} 表示输出到毫秒的时间
%t 输出当前线程名称
%-5level 输出日志级别,-5表示左对齐并且固定输出5个字符,如果不足在右边补0
%logger 输出logger名称,因为Root Logger没有名称,所以没有输出
%msg 日志文本
%n 换行
其他常用的占位符有:
%F 输出所在的类文件名,如Client.java
%L 输出行号
%M 输出所在方法名
%l 输出语句所在的行数, 包括类名、方法名、文件名、行数
最后是Logger的配置,这里只配置了一个Root Logger。
Filter:按日志级别区分文件输出
有些人习惯按日志信息级别输出到不同名称的文件中,如info.log,error.log,warn.log等,在log4j2中可通过配置Filters来实现。
假定需求是把INFO及以下级别的信息输出到info.log,WARN和ERROR级别的信息输出到error.log,FATAL级别输出到fatal.log,配置文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorInterval="300">
<properties>
<property name="LOG_HOME">D:/logs</property>
</properties>
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
</Console>
<!-- info.log -->
<RollingRandomAccessFile name="InfoFile" fileName="${LOG_HOME}/info.log" filePattern="${LOG_HOME}/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log">
<Filters>
<ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL" />
<ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY" />
</Filters>
<PatternLayout pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %level [%thread][%file:%line] - %msg%n" />
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="10 MB" />
</Policies>
<DefaultRolloverStrategy max="20" />
</RollingRandomAccessFile>
<!-- error.log -->
<RollingRandomAccessFile name="ErrorFile" fileName="${LOG_HOME}/error.log" filePattern="${LOG_HOME}/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log">
<Filters>
<ThresholdFilter level="fatal" onMatch="DENY" onMismatch="NEUTRAL" />
<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY" />
</Filters>
<PatternLayout pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %level [%thread][%file:%line] - %msg%n" />
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="10 MB" />
</Policies>
<DefaultRolloverStrategy max="20" />
</RollingRandomAccessFile>
<!-- fatal.log -->
<RollingRandomAccessFile name="FatalFile" fileName="${LOG_HOME}/fatal.log" filePattern="${LOG_HOME}/$${date:yyyy-MM}/fatal-%d{yyyy-MM-dd}-%i.log">
<Filters>
<ThresholdFilter level="fatal" onMatch="ACCEPT" onMismatch="DENY" />
</Filters>
<PatternLayout pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %level [%thread][%file:%line] - %msg%n" />
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="10 MB" />
</Policies>
<DefaultRolloverStrategy max="20" />
</RollingRandomAccessFile>
</Appenders>
<Loggers>
<Root level="trace">
<AppenderRef ref="Console" />
<AppenderRef ref="InfoFile" />
<AppenderRef ref="ErrorFile" />
<AppenderRef ref="FatalFile" />
</Root>
</Loggers>
</Configuration>
异步输出日志:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorInterval="300">
<properties>
<property name="LOG_HOME">D:/logs</property>
<property name="FILE_NAME">mylog</property>
</properties>
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
</Console>
<RollingRandomAccessFile name="MyFile" fileName="${LOG_HOME}/${FILE_NAME}.log" filePattern="${LOG_HOME}/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd HH-mm}-%i.log">
<PatternLayout pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %level [%thread][%file:%line] - %msg%n" />
<Policies>
<TimeBasedTriggeringPolicy interval="1" />
<SizeBasedTriggeringPolicy size="10 MB" />
</Policies>
<DefaultRolloverStrategy max="20" />
</RollingRandomAccessFile>
<!-- 异步输出日志 -->
<Async name="Async">
<AppenderRef ref="MyFile" />
</Async>
</Appenders>
<Loggers>
<Logger name="asynclog" level="trace" additivity="false" >
<AppenderRef ref="Async" />
</Logger>
<Root level="error">
<AppenderRef ref="Console" />
</Root>
</Loggers>
</Configuration>
下面两条输出方式本人未进过实践测试,如有此方面需求人士可以照此进行配置,如有不足之处欢迎反馈。
*输出到 MongoDB:
需要添加依赖:
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-nosql</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>3.2.2</version>
</dependency>
log4j2.xml:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorInterval="300">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
</Console>
<NoSql name="databaseAppender">
<MongoDb databaseName="test" collectionName="errorlog" server="localhost" port="27017" />
</NoSql>
</Appenders>
<Loggers>
<Logger name="mongolog" level="trace" additivity="false">
<AppenderRef ref="databaseAppender" />
</Logger>
<Root level="error">
<AppenderRef ref="Console" />
</Root>
</Loggers>
</Configuration>
*输出到Flume:
flume-conf.properties:
agent1.sources=source1
agent1.sinks=sink1
agent1.channels=channel1
agent1.sources.source1.type=avro
agent1.sources.source1.channels=channel1
agent1.sources.source1.bind=0.0.0.0
agent1.sources.source1.port=41414
agent1.sinks.sink1.type=file_roll
agent1.sinks.sink1.sink.directory=D:/log
agent1.sinks.sink1.channel=channel1
agent1.sinks.sink1.sink.rollInterval=86400
agent1.sinks.sink1.sink.batchSize=100
agent1.sinks.sink1.sink.serializer=text
agent1.sinks.sink1.sink.serializer.appendNewline = false
agent1.channels.channel1.type=file
agent1.channels.channel1.checkpointDir=D:/log/checkpoint
agent1.channels.channel1.dataDirs=D:/log/data
启动Flume(注:测试环境为windows)
flume-ng.cmd agent --conf ../conf/ --conf-file ../conf/flume-conf.properties -name agent1
添加依赖:
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-flume-ng</artifactId>
<version>2.5</version>
</dependency>
log4j2.xml:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorInterval="300">
<Appenders>
<Flume name="eventLogger" compress="false">
<Agent host="127.0.0.1" port="41414" />
<RFC5424Layout enterpriseNumber="18060" includeMDC="true" appName="MyApp" />
</Flume>
</Appenders>
<Loggers>
<Root level="trace">
<AppenderRef ref="eventLogger" />
</Root>
</Loggers>
</Configuration>
log4j2官方说明
log4j2官方API
+ slf4j
log4j2官方说明
log4j2官方API
先上log4j2.xml参数说明:
<?xml version="1.0" encoding="UTF-8"?>
<!-- status:日志打印级别,开发期可以设置为debug,生产上改为info -->
<!-- monitorInterval:含义是每隔5秒重新读取配置文件,可以不重启应用的情况下修改配置 -->
<Configuration status="info" monitorInterval="5">
<!-- 定义两个常量 -->
<properties>
<property name="LOG_HOME">logs</property>
<property name="FILE_NAME">mylog</property>
</properties>
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] - {%l} %logger{36} - %msg%n" />
</Console>
<!-- fileName:指定当前日志文件的位置和文件名称
filePattern:指定当发生Rolling时,文件的转移和重命名规则-->
<RollingRandomAccessFile name="File" fileName="${LOG_HOME}/${FILE_NAME}.log" filePattern="${LOG_HOME}/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd}-%i.log">
<PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss} [%t] - {%l} %logger{36} - %msg%n" />
<Policies>
<!-- TimeBasedTriggeringPolicy:这个配置需要和filePattern结合使用:
filePattern中配置的文件重命名规则是${FILE_NAME}-%d{yyyy-MM-dd HH-mm}-%i,最小的时间粒度是mm,即分钟,TimeBasedTriggeringPolicy指定的size是1,结合起来就是每1分钟生成一个新文件。
如果改成%d{yyyy-MM-dd HH},最小粒度为小时,则每一个小时生成一个文件。 -->
<TimeBasedT
4000
riggeringPolicy interval="1" />
<!-- SizeBasedTriggeringPolicy:指定当文件体积大于size指定的值时,触发Rolling -->
<SizeBasedTriggeringPolicy size="10 MB" />
</Policies>
<!--DefaultRolloverStrategy:指定最多保存的文件个数-->
<DefaultRolloverStrategy max="20" />
</RollingRandomAccessFile>
</Appenders>
<!-- Logger -->
<Loggers>
<Logger name="mylog" level="trace" additivity="false">
<AppenderRef ref="Console" />
<!--<AppenderRef ref="File"/>-->
</Logger>
<Root level="info">
<AppenderRef ref="Console" />
</Root>
</Loggers>
</Configuration>
PatternLayout含义:
%d{HH:mm:ss.SSS} 表示输出到毫秒的时间
%t 输出当前线程名称
%-5level 输出日志级别,-5表示左对齐并且固定输出5个字符,如果不足在右边补0
%logger 输出logger名称,因为Root Logger没有名称,所以没有输出
%msg 日志文本
%n 换行
其他常用的占位符有:
%F 输出所在的类文件名,如Client.java
%L 输出行号
%M 输出所在方法名
%l 输出语句所在的行数, 包括类名、方法名、文件名、行数
最后是Logger的配置,这里只配置了一个Root Logger。
Filter:按日志级别区分文件输出
有些人习惯按日志信息级别输出到不同名称的文件中,如info.log,error.log,warn.log等,在log4j2中可通过配置Filters来实现。
假定需求是把INFO及以下级别的信息输出到info.log,WARN和ERROR级别的信息输出到error.log,FATAL级别输出到fatal.log,配置文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorInterval="300">
<properties>
<property name="LOG_HOME">D:/logs</property>
</properties>
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
</Console>
<!-- info.log -->
<RollingRandomAccessFile name="InfoFile" fileName="${LOG_HOME}/info.log" filePattern="${LOG_HOME}/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log">
<Filters>
<ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL" />
<ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY" />
</Filters>
<PatternLayout pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %level [%thread][%file:%line] - %msg%n" />
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="10 MB" />
</Policies>
<DefaultRolloverStrategy max="20" />
</RollingRandomAccessFile>
<!-- error.log -->
<RollingRandomAccessFile name="ErrorFile" fileName="${LOG_HOME}/error.log" filePattern="${LOG_HOME}/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log">
<Filters>
<ThresholdFilter level="fatal" onMatch="DENY" onMismatch="NEUTRAL" />
<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY" />
</Filters>
<PatternLayout pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %level [%thread][%file:%line] - %msg%n" />
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="10 MB" />
</Policies>
<DefaultRolloverStrategy max="20" />
</RollingRandomAccessFile>
<!-- fatal.log -->
<RollingRandomAccessFile name="FatalFile" fileName="${LOG_HOME}/fatal.log" filePattern="${LOG_HOME}/$${date:yyyy-MM}/fatal-%d{yyyy-MM-dd}-%i.log">
<Filters>
<ThresholdFilter level="fatal" onMatch="ACCEPT" onMismatch="DENY" />
</Filters>
<PatternLayout pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %level [%thread][%file:%line] - %msg%n" />
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="10 MB" />
</Policies>
<DefaultRolloverStrategy max="20" />
</RollingRandomAccessFile>
</Appenders>
<Loggers>
<Root level="trace">
<AppenderRef ref="Console" />
<AppenderRef ref="InfoFile" />
<AppenderRef ref="ErrorFile" />
<AppenderRef ref="FatalFile" />
</Root>
</Loggers>
</Configuration>
异步输出日志:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorInterval="300">
<properties>
<property name="LOG_HOME">D:/logs</property>
<property name="FILE_NAME">mylog</property>
</properties>
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
</Console>
<RollingRandomAccessFile name="MyFile" fileName="${LOG_HOME}/${FILE_NAME}.log" filePattern="${LOG_HOME}/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd HH-mm}-%i.log">
<PatternLayout pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %level [%thread][%file:%line] - %msg%n" />
<Policies>
<TimeBasedTriggeringPolicy interval="1" />
<SizeBasedTriggeringPolicy size="10 MB" />
</Policies>
<DefaultRolloverStrategy max="20" />
</RollingRandomAccessFile>
<!-- 异步输出日志 -->
<Async name="Async">
<AppenderRef ref="MyFile" />
</Async>
</Appenders>
<Loggers>
<Logger name="asynclog" level="trace" additivity="false" >
<AppenderRef ref="Async" />
</Logger>
<Root level="error">
<AppenderRef ref="Console" />
</Root>
</Loggers>
</Configuration>
下面两条输出方式本人未进过实践测试,如有此方面需求人士可以照此进行配置,如有不足之处欢迎反馈。
*输出到 MongoDB:
需要添加依赖:
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-nosql</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>3.2.2</version>
</dependency>
log4j2.xml:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorInterval="300">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
</Console>
<NoSql name="databaseAppender">
<MongoDb databaseName="test" collectionName="errorlog" server="localhost" port="27017" />
</NoSql>
</Appenders>
<Loggers>
<Logger name="mongolog" level="trace" additivity="false">
<AppenderRef ref="databaseAppender" />
</Logger>
<Root level="error">
<AppenderRef ref="Console" />
</Root>
</Loggers>
</Configuration>
*输出到Flume:
flume-conf.properties:
agent1.sources=source1
agent1.sinks=sink1
agent1.channels=channel1
agent1.sources.source1.type=avro
agent1.sources.source1.channels=channel1
agent1.sources.source1.bind=0.0.0.0
agent1.sources.source1.port=41414
agent1.sinks.sink1.type=file_roll
agent1.sinks.sink1.sink.directory=D:/log
agent1.sinks.sink1.channel=channel1
agent1.sinks.sink1.sink.rollInterval=86400
agent1.sinks.sink1.sink.batchSize=100
agent1.sinks.sink1.sink.serializer=text
agent1.sinks.sink1.sink.serializer.appendNewline = false
agent1.channels.channel1.type=file
agent1.channels.channel1.checkpointDir=D:/log/checkpoint
agent1.channels.channel1.dataDirs=D:/log/data
启动Flume(注:测试环境为windows)
flume-ng.cmd agent --conf ../conf/ --conf-file ../conf/flume-conf.properties -name agent1
添加依赖:
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-flume-ng</artifactId>
<version>2.5</version>
</dependency>
log4j2.xml:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorInterval="300">
<Appenders>
<Flume name="eventLogger" compress="false">
<Agent host="127.0.0.1" port="41414" />
<RFC5424Layout enterpriseNumber="18060" includeMDC="true" appName="MyApp" />
</Flume>
</Appenders>
<Loggers>
<Root level="trace">
<AppenderRef ref="eventLogger" />
</Root>
</Loggers>
</Configuration>
log4j2官方说明
log4j2官方API
相关文章推荐
- amchart配置使用说明, amline_settings.xml 参数说明详解
- C#中使用API(SHFileOperation)进行文件操作,特别说明了回收站相关参数
- CentOS RedHat 5 Yum源使用配置及相关参数详解
- tomcat相关【各种参数说明以及内存配置优化需要整理】
- Ubuntu server 15.0.4 Redis相关笔记及配置参数说明
- hadoop相关配置文件参数详细说明
- CentOS RedHat 5 Yum源使用配置及相关参数详解
- 使用mysql数据库是检测建立的索引是否生效的检测方法及相关参数说明
- ***文件上传控件bootstrap-fileinput的使用和参数配置说明
- Redis(Windows安装方法与Java调用实例 & 配置文件参数说明 & Java使用Redis所用Jar包 & Redis与Memcached区别 & redis-cli.exe命令及示例)
- Redis (Replication) 主从原理和相关配置说明
- rsyncd - 认证相关参数配置说明
- log4j2相关配置说明以及${sys:catalina.home}应用
- composer安装及使用说明和相关原理文档
- CentOS RedHat 5 Yum源使用配置及相关参数详解
- nginx的yum安装,基本参数使用,编译参数说明和Nginx基本配置,模块安装
- [J2EE]DBCP、C3P0、Proxool三大连接池的配置参数说明和使用详解
- Kafka 配置参数汇总及相关说明
- log4net配置相关参数说明 .
- Proftpd有关权限配置的相关参数说明