因近期需要编写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 使用说明的更多相关文章

  1. Log4j2 配置笔记(Eclipse+maven+SpringMVC)

    Log4j2相关介绍可以百度看下,这里只注重配置Log4j2 能够马上跑起来: 1.pom.xml文件中添加Log4j2的相关Maven配置信息 <!-- log4j2 --> <d ...

  2. slf4j 与 log4j2 实战讲解与日志分割

    这两天搭建项目的时候用到log4j2在这里把自己的问题与了解拿出来与大家分享一下. 1.为什我要用 因为,使用slf4j可以很好的保证我们的日志系统具有良好的兼容性,兼容当前常见几种日志系统,而使用l ...

  3. slf4j 与 log4j2 基本用法

    简单的说 log4j2 是log4j2的升级版,解决了部分性能问题和部分死锁问题,其使用方式与使用配置与log4j相同. 建议使用maven依赖直接使用log4j2 <dependency> ...

  4. log4j及其log4j2的使用

    简单的说 log4j2 是log4j2的升级版,据说采用了一些新技术(无锁异步.等等),使得日志的吞吐量.性能比log4j 1.x提高10倍,并解决了一些死锁的bug,而且配置更加简单灵活.其使用方式 ...

  5. 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 ...

  6. 日志套餐篇 - log4j2 logback全量套餐

    日志套餐篇 - log4j2 logback全量套餐 前情提要: Log4j Log4j2 logback是当下主流的日志框架 slf4j则是新一代的日志框架接口,logback直接实现了slf4j接 ...

  7. java版集成Allure报告--注释使用说明

    testNG集成Allure报告--注释使用说明 前置条件 首先需要下载allure的zip包解压,然后配置环境变量即可(win).allure的GitHub下载地址: 然后执行testn.xml或者 ...

  8. Atitit.项目修改补丁打包工具 使用说明

    Atitit.项目修改补丁打包工具 使用说明 1.1. 打包工具已经在群里面.打包工具.bat1 1.2. 使用方法:放在项目主目录下,执行即可1 1.3. 打包工具的原理以及要打包的项目列表1 1. ...

  9. awk使用说明

    原文地址:http://www.cnblogs.com/verrion/p/awk_usage.html Awk使用说明 运维必须掌握的三剑客工具:grep(文件内容过滤器),sed(数据流处理器), ...

随机推荐

  1. 边工作边刷题:70天一遍leetcode: day 82-1

    Closest Binary Search Tree Value II 要点:通过iterator,把closest值附近的k个closest找到,从而time降为O(klgn) in order i ...

  2. UESTC 923 稳住GCD DP + GCD

    定义:dp[i][j] 表示 在前i个数中,使整个gcd值为j时最少取的数个数. 则有方程: gg = gcd(a[i],j) gg == j : 添加这个数gcd不变,不添加,  dp[i][j] ...

  3. 使用Unity3D引擎开发赛车游戏

    Car Tutorial 在Unity3D的Asset Store有一个赛车的Demo —— Car Tutorial,看起来特别酷的赛车游戏Demo,不过我还没有下载下来,因为在公司下载Assets ...

  4. linux部署的java应用,浏览器访问时,报域名解析错误

    工作中,经常需要在Linux环境中部署Tomcat,配置java应用.在浏览器中访问应用时,却报域名解析错误,该怎么样解决呢? 解决方法:关闭防火墙 iptables -L -n     查看已添加的 ...

  5. 关于JAVA应用中文字体显示小方框的问题解决

    最近碰到linux下jboss应用中中文字体显示为小方框: “在JRE 5以上的java环境中,java会自动加载$JAVA_HOME/jre/lib/fonts目录下的字体.链接或复制宋体或微软雅黑 ...

  6. R语言-merge和rbind

    rbind 使用方式 合并两个数据集,要求两个数据集的列数相等: rbind(parameter1,parameter2) 1 1 合并多个数据集,各个数据集的列数相等: rbind(paramete ...

  7. localStroage的用法

    Cookie 每个域名存储量比较小(各浏览器不同,大致4K) 所有域名的存储量有限制(各浏览器不同,大致4K) 有个数限制(各浏览器不同) 会随请求发送到服务器 LocalStorage 永久存储 单 ...

  8. 将博客搬至CSDN(放弃)

    将博客搬至CSDN需要发这篇文章,但是到现在CSDN还没给我发通知,因为急着要记东西,所以不搬了,继续写我下一篇随笔.

  9. Ant 执行 YUICompressor

    Ant 执行 YUICompressor 任务压缩 JavaScript 和 CSS 文件,解决中文乱码问题,增加源文件字符编码集设定 标签: javascriptantcss任务encodingnu ...

  10. [CareerCup] 3.5 Implement Queue using Two Stacks 使用两个栈来实现队列

    3.5 Implement a MyQueue class which implements a queue using two stacks. LeetCode上的原题,请参见我之前的博客Imple ...