log4j2 使用说明
因近期需要编写J2EE程序,所以简单学习了Log4j2,这里把我学习的一些信息做记录:
1、从HelloWorld开始
参考:http://logging.apache.org/log4j/2.x/manual/api.html
首先创建一个Java Project,如下图,在项目中创建lib文件夹,将log4j的api和core包复制进去并配置到项目编译路径中。
创建包com.demo并在包内创建类HelloWorld。
HelloWorld类的内容如下:
package com.demo;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class HelloWorld {
private static final Logger logger = LogManager.getLogger("HelloWorld");
public static void main(String[] args) {
String hello = "Hello, World!";
logger.trace("TRACE: " + hello);
logger.debug("DEBUG: " + hello);
logger.info("INFO: " + hello);
logger.warn("WARN: " + hello);
logger.error("ERROR: " + hello);
logger.fatal("FATAL: " + hello);
}
}
运行HelloWorld,结果显示如下:
ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console.
00:06:16.530 [main] ERROR HelloWorld - ERROR: Hello, World!
00:06:16.532 [main] FATAL HelloWorld - FATAL: Hello, World!
运行时提示没有找到Log4j2的配置文件,使用默认配置,只显示error到控制台。
缺省的配置等同于如下配置,其中Root指定的level是error,所有只输出了error和fatal级别的日志。
<?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>
2、理解log4j2的结构
参考:http://logging.apache.org/log4j/2.x/manual/architecture.html
结合我们的HelloWorld程序,我们看一下log4j2的结构:
LoggerContext是整个Log系统的锚点,每一个LoggerContext会含有一个Configuration,在congfiguration中会包含Appender(输出器)、Filter(过滤器)、LoggerConfig及StrSubstitutor的引用。
当我们在配置文件中声明一个Loggers时就会创建一个LoggerConfig, LoggerConfig包含有一组Filter,同时持有一组Appender的引用。LoggerConfig所收到的所有LogEvent首先经过过滤器处理才会传递给Appendar输出。
Filter会存在三种返回结果:Accept、Deny、Neutral。Accept表示事件将直接被处理并不继续转发其他Filter,Deny表示事件将被忽略,Neutral表示事件将被转发给下一个filter,如果没有后续的filter,事件将被处理。
3、理解Named Hierarchy (日志名称层次规则)
首先我们在com.demo包内新增一个类NamedHierarchy:
package com.demo;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class NamedHierarchy {
private static final Logger logger = LogManager.getLogger(NamedHierarchy.class);
public static void main(String[] args) {
// TODO Auto-generated method stub
String nh = "Named Hierarchy";
logger.getLevel();
logger.trace("TRACE: " + nh + " " + logger.getLevel());
NamedHierarchy n = new NamedHierarchy();
n.run();
logger.error("ERROR: " + nh + " " + logger.getLevel());
}
public void run(){
String nh = "NamedHierarchy.run";
logger.debug("DEBUG: " + nh + " " + logger.getLevel());
}
}
在src下新增log4j2.xml,并按如下修改文件:
<?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>
<Logger name="com.demo.NamedHierarchy" level="trace">
<AppenderRef ref="Console"/>
</Logger>
<Logger name="com.demo" level="debug">
<AppenderRef ref="Console"/>
</Logger>
<Root level="error">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
工程结构如下:
运行NamedHierarchy你会发现结果如下:
01:33:48.864 [main] TRACE com.demo.NamedHierarchy - TRACE: Named Hierarchy TRACE
01:33:48.864 [main] TRACE com.demo.NamedHierarchy - TRACE: Named Hierarchy TRACE
01:33:48.864 [main] TRACE com.demo.NamedHierarchy - TRACE: Named Hierarchy TRACE
01:33:48.867 [main] DEBUG com.demo.NamedHierarchy - DEBUG: NamedHierarchy.run TRACE
01:33:48.867 [main] DEBUG com.demo.NamedHierarchy - DEBUG: NamedHierarchy.run TRACE
01:33:48.867 [main] DEBUG com.demo.NamedHierarchy - DEBUG: NamedHierarchy.run TRACE
01:33:48.868 [main] ERROR com.demo.NamedHierarchy - ERROR: Named Hierarchy TRACE
01:33:48.868 [main] ERROR com.demo.NamedHierarchy - ERROR: Named Hierarchy TRACE
01:33:48.868 [main] ERROR com.demo.NamedHierarchy - ERROR: Named Hierarchy TRACE
为什么同样的日志信息会被输出三次呢?这是因为logger的命名符合命名层次规则,而层次关系是由对应的LoggerConfig来维护的。root是整个层次规则(或结构)的顶层,父节点和子节点是通过“.”来识别的,如com.demo是com.demo.NamedHierarchy的父节点,com.demo.NamedHierarchy是com.demo的子节点。
同时Logger的命名和类的命名又有关联的,如果我们在配置文件中配置一个Logger的名称为com.demo.NamedHierarchy,那么类com.demo.NamedHierarchy中的Logger就会匹配到这一配置,同时所有父节点的配置也会被适用。所以在我们使用logger.trace("TRACE: " + nh + " " + logger.getLevel()); 输出日志时,配置文件中3个Logger对应的Appender分别被调用。
如果你把
<Logger name="com.demo.NamedHierarchy" level="trace">
修改为
<Logger name="com.demo.NamedHierarchy" level="error">
运行,结果如下:
21:40:44.389 [main] ERROR com.demo.NamedHierarchy - ERROR: Named Hierarchy ERROR
21:40:44.389 [main] ERROR com.demo.NamedHierarchy - ERROR: Named Hierarchy ERROR
21:40:44.389 [main] ERROR com.demo.NamedHierarchy - ERROR: Named Hierarchy ERROR
为什么父节点的Appender没有输出?这是由于LogEvent的level和LoggerConfig的level在特定组合下,LogEvent不会被继续向下转发处理,组合关系如下,其中YES表示转发继续处理,NO表示不继续转发。
Event Level |
LoggerConfig Level |
||||||
聽 |
TRACE |
DEBUG |
INFO |
WARN |
ERROR |
FATAL |
OFF |
ALL |
YES |
YES |
YES |
YES |
YES |
YES |
NO |
TRACE |
YES |
NO |
NO |
NO |
NO |
NO |
NO |
DEBUG |
YES |
YES |
NO |
NO |
NO |
NO |
NO |
INFO |
YES |
YES |
YES |
NO |
NO |
NO |
NO |
WARN |
YES |
YES |
YES |
YES |
NO |
NO |
NO |
ERROR |
YES |
YES |
YES |
YES |
YES |
NO |
NO |
FATAL |
YES |
YES |
YES |
YES |
YES |
YES |
NO |
OFF |
NO |
NO |
NO |
NO |
NO |
NO |
NO |
如果你不希望LogEvent被按命名层次分别处理,只希望最低一层的子节点处理,那么可以在Logger配置时增加additivity="false",如:
<Logger name="com.demo.NamedHierarchy" level="trace" additivity="false">
<AppenderRef ref="Console"/>
</Logger>
4、定时重新加载配置
Log4j2支持定时检查配置文件是否变化并根据变化重新加载,这个功能在实际应用中比较有价值,比如产品上网后有问题,如果默认的error级别的日志不能支撑定位,需要切换到trace级别,定时加载的功能就可以避免重启服务,毕竟商用产品重启服务代价还是很大的,有时候还必须先获取客户的授权。
在Configuration中增加monitorInterval="30"参数,其中30指30秒,如下:
<Configuration monitorInterval="30">
...
</Configuration>
5、常用的Appender
关于详细的Appender及配置参数,建议查看API:http://logging.apache.org/log4j/2.x/manual/appenders.html
5.1 FileAppender
FileAppender支持把日志信息写入文件,典型的配置如下:
append用来设置程序开始时日志是否被追加到原日志文件上,fileName表示要保存的文件名称,bufferedIO和bufferSize表示将日志内容缓存到bufferSize大小后写入文件:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Appenders>
<File name="MyFile" append="true" fileName="logs/mylog.log" bufferedIO="true" bufferSize="512">
<PatternLayout>
<Pattern>%d{MM-dd-yyyy} %p %c{1.} [%t] %m%n</Pattern>
</PatternLayout>
</File>
</Appenders>
<Loggers>
<Root level="error">
<AppenderRef ref="MyFile"/>
</Root>
</Loggers>
</Configuration>
5.2 RollingFileAppender
循环写入文件,典型配置如下:
以下的配置可以简单概括为:初始日志名称是rolling.log,当rolling.log日志文件达到1KB时,将rolling.log修改为app-日期-1.log并压缩为app-日期-1.log.gz,rolling.log重新开始写;当再次达到1KB时,将rolling.log修改为app-日期-2.log并压缩为app-日期-2.log.gz,rolling.log重新开始写;当再次达到1KB时,删除app-日期-1.log.gz,修改app-日期-2.log.gz为app-日期-1.log.gz,将rolling.log修改为app-日期-2.log并压缩为app-日期-2.log.gz,rolling.log重新开始写;
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Appenders>
<RollingFile name="RollingFile" fileName="logs/rolling.log"
filePattern="logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
<PatternLayout>
<Pattern>%d{MM-dd-yyyy} %p %c{1.} [%t] %m%n</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="1 KB"/>
</Policies>
<DefaultRolloverStrategy fileIndex="max" max="2"/>
</RollingFile>
</Appenders>
<Loggers>
<Root level="error">
<AppenderRef ref="RollingFile"/>
</Root>
</Loggers>
</Configuration>
建议你使用此配置写一个简单的脚步验证效果。
更多详细内容,请查看官方文档:http://logging.apache.org/log4j/2.x/manual/architecture.html
http://blog.csdn.net/axwolfer/article/details/40718609
log4j2 使用说明的更多相关文章
- Log4j2 配置笔记(Eclipse+maven+SpringMVC)
Log4j2相关介绍可以百度看下,这里只注重配置Log4j2 能够马上跑起来: 1.pom.xml文件中添加Log4j2的相关Maven配置信息 <!-- log4j2 --> <d ...
- slf4j 与 log4j2 实战讲解与日志分割
这两天搭建项目的时候用到log4j2在这里把自己的问题与了解拿出来与大家分享一下. 1.为什我要用 因为,使用slf4j可以很好的保证我们的日志系统具有良好的兼容性,兼容当前常见几种日志系统,而使用l ...
- slf4j 与 log4j2 基本用法
简单的说 log4j2 是log4j2的升级版,解决了部分性能问题和部分死锁问题,其使用方式与使用配置与log4j相同. 建议使用maven依赖直接使用log4j2 <dependency> ...
- log4j及其log4j2的使用
简单的说 log4j2 是log4j2的升级版,据说采用了一些新技术(无锁异步.等等),使得日志的吞吐量.性能比log4j 1.x提高10倍,并解决了一些死锁的bug,而且配置更加简单灵活.其使用方式 ...
- spring-第N篇整合SSM,即Mybatis+Spring+Spring MVC
1.Mybatis的配置使用 1>Jar包:mybatis-3.4.5.jar.mysql-connector-6.0.2或者ojdbc6-11.2.0.4.jar. 2>编写conf.x ...
- 日志套餐篇 - log4j2 logback全量套餐
日志套餐篇 - log4j2 logback全量套餐 前情提要: Log4j Log4j2 logback是当下主流的日志框架 slf4j则是新一代的日志框架接口,logback直接实现了slf4j接 ...
- java版集成Allure报告--注释使用说明
testNG集成Allure报告--注释使用说明 前置条件 首先需要下载allure的zip包解压,然后配置环境变量即可(win).allure的GitHub下载地址: 然后执行testn.xml或者 ...
- Atitit.项目修改补丁打包工具 使用说明
Atitit.项目修改补丁打包工具 使用说明 1.1. 打包工具已经在群里面.打包工具.bat1 1.2. 使用方法:放在项目主目录下,执行即可1 1.3. 打包工具的原理以及要打包的项目列表1 1. ...
- awk使用说明
原文地址:http://www.cnblogs.com/verrion/p/awk_usage.html Awk使用说明 运维必须掌握的三剑客工具:grep(文件内容过滤器),sed(数据流处理器), ...
随机推荐
- 边工作边刷题:70天一遍leetcode: day 82-1
Closest Binary Search Tree Value II 要点:通过iterator,把closest值附近的k个closest找到,从而time降为O(klgn) in order i ...
- UESTC 923 稳住GCD DP + GCD
定义:dp[i][j] 表示 在前i个数中,使整个gcd值为j时最少取的数个数. 则有方程: gg = gcd(a[i],j) gg == j : 添加这个数gcd不变,不添加, dp[i][j] ...
- 使用Unity3D引擎开发赛车游戏
Car Tutorial 在Unity3D的Asset Store有一个赛车的Demo —— Car Tutorial,看起来特别酷的赛车游戏Demo,不过我还没有下载下来,因为在公司下载Assets ...
- linux部署的java应用,浏览器访问时,报域名解析错误
工作中,经常需要在Linux环境中部署Tomcat,配置java应用.在浏览器中访问应用时,却报域名解析错误,该怎么样解决呢? 解决方法:关闭防火墙 iptables -L -n 查看已添加的 ...
- 关于JAVA应用中文字体显示小方框的问题解决
最近碰到linux下jboss应用中中文字体显示为小方框: “在JRE 5以上的java环境中,java会自动加载$JAVA_HOME/jre/lib/fonts目录下的字体.链接或复制宋体或微软雅黑 ...
- R语言-merge和rbind
rbind 使用方式 合并两个数据集,要求两个数据集的列数相等: rbind(parameter1,parameter2) 1 1 合并多个数据集,各个数据集的列数相等: rbind(paramete ...
- localStroage的用法
Cookie 每个域名存储量比较小(各浏览器不同,大致4K) 所有域名的存储量有限制(各浏览器不同,大致4K) 有个数限制(各浏览器不同) 会随请求发送到服务器 LocalStorage 永久存储 单 ...
- 将博客搬至CSDN(放弃)
将博客搬至CSDN需要发这篇文章,但是到现在CSDN还没给我发通知,因为急着要记东西,所以不搬了,继续写我下一篇随笔.
- Ant 执行 YUICompressor
Ant 执行 YUICompressor 任务压缩 JavaScript 和 CSS 文件,解决中文乱码问题,增加源文件字符编码集设定 标签: javascriptantcss任务encodingnu ...
- [CareerCup] 3.5 Implement Queue using Two Stacks 使用两个栈来实现队列
3.5 Implement a MyQueue class which implements a queue using two stacks. LeetCode上的原题,请参见我之前的博客Imple ...