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

时间: 2024-10-20 06:24:10

log4j2 使用说明的相关文章

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

Log4j2相关介绍可以百度看下,这里只注重配置Log4j2 能够马上跑起来: 1.pom.xml文件中添加Log4j2的相关Maven配置信息 <!-- log4j2 --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.1</version> &l

log4j与log4j2

一 log4j log4j是Apache的一个开源项目,用于输出程序的运行状况. 相比于在程序内部添加System.out.println()做日志输出,log4j有如下优点: 可以设定信息输出的目的地,常用的有控制台.文件等. 根据日志的严重程度,将日志分为6级,从高到低依次是:fatal.error.warn.info.debug.trace. 可以设定日志的输出格式,包含动态的信息. 可以开启或者关闭信息输出. 在java代码获取日志对象并输出: Logger logger=Logger.

log4j2日志配置

背景 log4j2相对于log4j 1.x有了脱胎换骨的变化,其官网宣称的优势有多线程下10几倍于log4j 1.x和logback的高吞吐量.可配置的审计型日志.基于插件架构的各种灵活配置等. 1.所需jar 1)maven配置 <dependencies> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId&

Linux系统下安装rz/sz命令及使用说明

对于经常使用Linux系统的人员来说,少不了将本地的文件上传到服务器或者从服务器上下载文件到本地,rz / sz命令很方便的帮我们实现了这个功能,但是很多Linux系统初始并没有这两个命令.今天,我们就简单的讲解一下如何安装和使用rz.sz命令. 1.软件安装 (1)编译安装 root 账号登陆后,依次执行以下命令: 1 cd /tmp 2 wget http://www.ohse.de/uwe/releases/lrzsz-0.12.20.tar.gz 3 tar zxvf lrzsz-0.1

android 布局之滑动探究 scrollTo 和 scrollBy 方法使用说明

涉及到滑动,就涉及到VIEW,大家都知道,android的UI界面都是由一个一个的View以及View的派生类组成,View作为基类,而常用的布局里面的各种布局就是它派生出来的ViewGroup的子类,ViewGroup作为各个组件的容器搭建了整体的UI.以下是android UI的结构示示意图: 查看源码 /** * Implement this to do your drawing. * * @param canvas the canvas on which the background w

笔记:MyBatis 日志显示-log4j2

在ClassPath路径创建log4j2.xml配置文件,增加如下日志配置: <?xml version="1.0" encoding="UTF-8"?> <Configuration status="OFF"> ????<!-- 附着器配置,日志输出到什么位置 --> ????<Appenders> ????????<!-- 控制台附着器类型,输出结果到 System.out 或是 Syst

Git使用说明

Git是流行的分布式版本控制系统,可以方便的管理多人协作的项目并避免了集中式版本控制系统对服务器的依赖. 简介 版本库(repository)是一个由Git管理的目录,Git将跟踪工作目录下文件的修改并在需要时还原. 在工作目录下.git子目录则维护着版本库 . Git维护三个组件: 工作目录: 保存实际文件 暂存区 : 保存尚未提交的修改 版本库: 保存已提交的修改 HEAD: 指向最后一次提交后的结果(checkout 命令的主要功能就是操作HEAD). Git将每次提交的修改串成一条时间线

软件使用说明

软件使用说明:我们的软件是一款基于在校女大学生的记账软件,根据调查身边的女生,统计出了大部分的女生每个月开销的分类.在我们的软件中按这些分类记录每个人的每天的开销,根据调查结果显示有部分学生还有收入,所以我们的记账软件还增加了收入项.我们软件可以根据你每天输入的开销来计算你每个月的开销,并且你可以在其中设置每个月开销的额度,根据你的开销对你的花销进行提醒.在每天你也可以收到关于你这一天开销的提醒,比如:提醒你录入,提醒你今天的花费是否超标.

IDEA工具使用说明

IDEA使用说明 1.安装 2.开始界面 1)create New Project (新建项目) 2)Import Project  (导入项目) 3)Open (打开已有的项目) 4)Check out from Version Control (从版本控制库中导入项目) 3.新建项目 1)方式一: 说明:左边的列表显示的是IDEA可以的项支持目种类,右边是需要额外添加的构面,选择好相应的构面,点击next. 说明:上面的一部分是制定项目的名称,下面一部分是制定项目中模块的名称.当创建了一个项