您的位置:首页 > 运维架构 > Apache

Apache Log4j配置说明/log4j的分层打印

2017-07-19 19:07 363 查看
Apache Log4j配置说明
本文详细介绍Log4j的所有配置属性。
author: ZJ 07-3-17
Blog: http://zhangjunhd.blog.51cto.com/
1.Log4j简介
Log4j是Apache的一个开源项目,它允许开发者以任意间隔输出日志信息。Log4j主要由三大类组件构成:
1)Logger-负责输出日志信息,并能够对日志信息进行分类筛选,即决定哪些日志信息应该被输出,哪些该被忽略。Loggers组件输出日志信息时分为5个级别:DEBUG、INFO、WARN、ERROR、FATAL。这五个级别的顺序是:DEBUG<INFO<WARN<ERROR<FATAL。如果设置某个Logger组件的级别是P,则只有级别比P高的日志信息才能输出。Logger是有继承关系的,最上层是rootLogger,定义的其他Logger都会继承rootLogger。

如:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" ><!-- debug="false" -->

<appender name="appAppender" class="org.apache.log4j.RollingFileAppender">

<param name="File" value="xcom_app.log" />

<param name="Threshold" value="debug" />

<param name="MaxFileSize" value="2MB" />

<param name="Append" value="true" />

<param name="MaxBackupIndex" value="10" />

<layout class="org.apache.log4j.PatternLayout">

<param name="ConversionPattern" value="%d [%c{1}] %-5p %m%n" />

</layout>

</appender>

<appender name="accessMonAppender" class="org.apache.log4j.RollingFileAppender">

<param name="File" value="xcom_mon.log" />

<param name="Threshold" value="debug" />

<param name="MaxFileSize" value="2MB" />

<param name="Append" value="true" />

<param name="MaxBackupIndex" value="10" />

<layout class="org.apache.log4j.PatternLayout">

<param name="ConversionPattern" value="%d %m%n" />

</layout>

</appender>

<appender name="rpcAccessAppender" class="org.apache.log4j.RollingFileAppender">

<param name="File" value="xcom_jsonrpc.log" />

<param name="Threshold" value="debug" />

<param name="MaxFileSize" value="2MB" />

<param name="Append" value="true" />

<param name="MaxBackupIndex" value="10" />

<layout class="org.apache.log4j.PatternLayout">

<param name="ConversionPattern" value="%d %m%n" />

</layout>

</appender>

<appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">

<param name="Target" value="System.out" />

<param name="Threshold" value="debug" />

<layout class="org.apache.log4j.PatternLayout">

<param name="ConversionPattern" value="%d{ABSOLUTE} [%c{1}] %-5p %m%n" />

</layout>

</appender>

<appender name="myFile" class="org.apache.log4j.RollingFileAppender">

<param name="File" value="c:\\TIMSLOG\\output.log" /><!-- 设置日志输出文件名 -->

<!-- 设置是否在重新启动服务时,在原有日志的基础添加新日志 -->

<param name="Append" value="true" />

<param name="MaxBackupIndex" value="10" />

<layout class="org.apache.log4j.PatternLayout">

<param name="ConversionPattern" value="%p (%c:%L)- %m%n" />

</layout>

</appender>

<appender name="logAppender" class="org.apache.log4j.DailyRollingFileAppender">

<param name="File" value="c:\\TIMSLOG\\sdhs-log.log" />

<param name="DatePattern" value="'.'yyyy-MM-dd'.log'" />

<param name="encoding" value="gbk" />

<layout class="org.apache.log4j.PatternLayout">

<param name="ConversionPattern"

value="[%d{MMdd HH:mm:ss SSS\} %-5p] [%t] %c{3\} - %m%n" />

</layout>

</appender>

<!-- 指定logger的设置,additivity指示是否遵循缺省的继承机制//com.waycool.hsdb-->

<logger name="com.waycool.controller" additivity=&
4000
quot;false">

<!-- <level value ="debug"/> --> Logger组件的级别

<level value ="info"/> Logger组件的级别

<appender-ref ref="logAppender" />

<appender-ref ref="CONSOLE" />

</logger>

<!-- 根logger的设置-->

<root>

<priority value ="info" />

<appender-ref ref="CONSOLE" />

<appender-ref ref="myFile" />

</root>

</log4j:configuration>

2)Appender-定义了日志输出目的地,指定日志信息应该被输出到什么地方。输出的目的地可以是控制台、文件或网络设备。

3)Layout-通过在Appender的后面附加Layout来实现格式化输出。
一个Logger可以有多个Appender,每个Appender对应一个Layout。
2.Loggers
Logger的定义格式:log4j.[loggername]=[level],appenderName,appenderName,…
这里level是指Logger的优先级,appenderName是日志信息的输出地,可以同时定义多个输出地。
3.Appenders
Appender的定义格式:
log4j.appender.appenderName = fully.qualified.name.of.appender.class
// "fully.qualified.name.of.appender.class" 可以指定下面五个目的地中的一个:

Appender类及其作用列表
Appender类名作 用
org.apache.log4j.ConsoleAppender将日志输出到控制台
org.apache.log4j.FileAppender将日志输出到文件
org.apache.log4j.DailyRollingFileAppender每天产生一个日志文件
org.apache.log4j.RollingFileAppender文件大小到达指定尺寸时产生一个新的文件
org.apache.log4j. WriterAppender将日志信息以流格式发送到任意指定的地方
1)ConsoleAppender选项

-Threshold=WARN:指定日志消息的输出最低层次。

-ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。

-Target=System.err:默认情况下是:System.out,指定输出控制台。

2)FileAppender 选项

-Threshold=WARN:指定日志消息的输出最低层次。

-ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。

-File=mylog.txt:指定消息输出到mylog.txt文件。

- Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。

3)DailyRollingFileAppender 选项

-Threshold=WARN:指定日志消息的输出最低层次。

-ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。

-File=mylog.txt:指定消息输出到mylog.txt文件。

-Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。

-DatePattern='.'yyyy-ww:每周滚动一次文件,即每周产生一个新的文件。当然也可以指定按月、周、天、时和分。即对应的格式如下:

'.'yyyy-MM: 每月

'.'yyyy-ww: 每周

'.'yyyy-MM-dd: 每天

'.'yyyy-MM-dd-a: 每天两次

'.'yyyy-MM-dd-HH: 每小时

'.'yyyy-MM-dd-HH-mm: 每分钟

4)RollingFileAppender 选项
-Threshold=WARN:指定日志消息的输出最低层次。
-ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
-File=mylog.txt:指定消息输出到mylog.txt文件。
- Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
-MaxFileSize=100KB: 后缀可以是KB, MB 或者是 GB. 在日志文件到达该大小时,将会自动滚动,即将原来的内容移到mylog.log.1文件。
-MaxBackupIndex=2:指定可以产生的滚动文件的最大数。
4.Layouts
Layout的定义格式:
部分一log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
//"fully.qualified.name.of.layout.class" 可以指定下面4个格式中的一个:

Layout类及其作用列表
Layout类名作 用
org.apache.log4j.HTMLLayout以HTML表格形式布局
org.apache.log4j.PatternLayout可以灵活地指定布局模式
org.apache.log4j.SimpleLayout包含日志信息的级别和信息字符串
org.apache.log4j.TTCCLayout包含日志产生的时间、线程、类别等等信息
1)HTMLLayout 选项
-LocationInfo=true:默认值是false,输出java文件名称和行号。
-Title=my app file: 默认值是 Log4J Log Messages。

2)PatternLayout 选项
- ConversionPattern=%m%n :指定怎样格式化指定的消息。

3)XMLLayout 选项
-LocationInfo=true:默认值是false,输出java文件和行号。

部分二 log4j.appender.A1.layout.ConversionPattern=
%-4r %-5p %d{yyyy-MM-dd HH:mm:ssS} %c %m%n
这里需要说明的就是日志信息格式中几个符号所代表的含义:
1)-X号: X信息输出时左对齐。
2)%p: 输出日志信息优先级,即DEBUG,INFO,WARN,ERROR,FATAL。
3)%d: 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921。
4)%r: 输出自应用启动到输出该log信息耗费的毫秒数。
5)%c: 输出日志信息所属的类目,通常就是所在类的全名。
6)%t: 输出产生该日志事件的线程名。
7)%l: 输出日志事件的发生位置,相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)。
8)%x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。
9)%%: 输出一个"%"字符。
10)%F: 输出日志消息产生时所在的文件名称。
11) %L: 输出代码中的行号。
12)%m: 输出代码中指定的消息,产生的日志具体信息。
13)%n: 输出一个回车换行符,Windows平台为"\r\n",Unix平台为"\n"输出日志信息换行。
可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。如:
1)%20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,默认的情况下右对齐。
2)%-20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,"-"号指定左对齐。
3)%.30c:指定输出category的名称,最大的宽度是30,如果category的名称大于30的话,就会将左边多出的字符截掉,但小于30的话也不会有空格。
4)%20.30c:如果category的名称小于20就补空格,并且右对齐,如果其名称长于30字符,就从左边交远销出的字符截掉。
5.Apache Log介绍集
[1] Apache Log4j配置说明
[2] Apache Log4j使用实例
[3] Apache Commons-logging使用实例
[4] 如何自建appender扩展Log4j框架
6.参考资料
[1] 赵强,精通JSP编程,电子工业出版社
[2] Log4j配置过程
http://hi.baidu.com/hunqiu/blog/item/7386ad6e59c5a4da81cb4a31.html
本文出自 “i张俊” 博客,请务必保留此出处http://zhangjunhd.blog.51cto.com/113473/21014

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

log4j的分层打印

在开发的过程中,我们总会想看到更多的错误,这时候log4j便产生了作用,但是有时候我们总会把日志给打印在一个文件中,那我们如何对各个不同的模块的日志进行分不同的日志文件存放呢,比如dao、service、controller、error、jsp等不同层次的日志。
1、log4j的配置

[html] view
plain copy







<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

<appender name="ConsoleAppender" class="org.apache.log4j.ConsoleAppender">

<layout class="org.apache.log4j.SimpleLayout" />

</appender>

<!-- 根,会把所有涉及到的log都打印出来

根logger没有默认的appender

根logger默认被分配了Level.DEBUG的级别

-->

<root>

<level value="INFO" />

<appender-ref ref="ConsoleAppender" />

</root>

<!--

A、

(1)、如果类别的名称(后面加一个点)是其子类别名称的前缀,则它就是另一个类别的祖类

(2)、如果一个类别和它的子类别之间没有其他的继承关系,我们就称之为parent与child的关系

例如:类别com.foo是类别com.foo.Bar的parent。

B、

根(root) 类别位于logger继承结构的最上层。它有两种例外:

(1) 它一直存在

(2) 它不能根据名称而获得。

调用类的静态方法Logger.getRootLogger可以得到它

C、

如果一个Logger没有被分配一个级别,那么它将从一个被分配了级别的最接近它的ancestor哪里继承。

正规的说:级别的继承:对于一个给定的Logger C,它的继承的级别等于从C开始上溯到的第一个拥有非空级别的Logger的级别。

D、

对于一个给定的logger,它每个生效的日志请求都被转发到logger所有的appender上和该logger的父辈logger的appender上。

换句话说,appende自动从它的父辈获得继承。举例来说,如果一个根logger拥有一个console appender,

那么所有生效的日志请求至少会被输出到console上。

如果一个名为C的logger有一个file类型的appender,那么它就会对它自己以及所有它的子logger生效。

E、

我们也可以通过设置appender的additivity flag为false,来重载appender的默认行为,以便继承的属性不在生效。

F、

Log4j的子logger只连接到已经存在的它们的父代。特别的是,名为com.foo.bar的logger是直接连接到根logger,

而不是围绕着没用的com或com.foo logger。这显著的提高了程序性能并且减少的内存占用。

G、

避免参数构建的花费应如下,

if(logger.isDebugEnabled() {

logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));

}

如果logger的debug被关闭这将不会招致参数构建的花费。另一方面,如果logger是debug的话,它将产生两次判断 logger是否能用的花费。

一次是在debugenabled,一次是debug。这是无关紧要的,因为判断日志是否可用只占日志实际花费时间的约1%。

H、 如果是DailyRollingFileAppender的话,不会立刻生成error.log.2014.02.23.log,而是先生成error.log,然后等到这天的

23:59分,把当天的日志写到error.log.2014.02.23.log的文件中去

如果DailyRollingFileAppender的append=true的话,即使当天没有日志,也会生成error.log.2014.02.23.log文件,否则不会生成

-->

<!-- dao层的日志 -->

<appender name="dao" class="org.apache.log4j.FileAppender">

<param name="File" value="${webapp.root}/logs/dao.log" />

<param name="Append" value="true" />

<!--

Log4j提供的layout有以下几种:

org.apache.log4j.HTMLLayout(以HTML表格形式布局),

org.apache.log4j.PatternLayout(可以灵活地指定布局模式),

org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),

org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)

%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL

%r 输出自应用启动到输出该log信息耗费的毫秒数

%c 输出所属的类目,通常就是所在类的全名

%t 输出产生该日志事件的线程名

%n 输出一个回车换行符,Windows平台为"\r\n",Unix平台为"\n"

%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921

%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)

-->

<layout class="org.apache.log4j.PatternLayout">

<param name="ConversionPattern" value="%d [%t] %p - %m%n" />

</layout>

</appender>

<!-- 以com.hj.dao包开头的所涉及到的类进行log -->

<logger name="com.hj.dao" additivity="true">

<level value="INFO" />

<appender-ref ref="dao" />

</logger>

<!-- service层的日志 -->

<appender name="service" class="org.apache.log4j.FileAppender">

<param name="File" value="${webapp.root}/logs/service.log" />

<param name="MaxFileSize" value="5MB" />

<param name="MaxBackupIndex" value="20" />

<param name="Encoding" value="utf-8"/>

<layout class="org.apache.log4j.PatternLayout">

<param name="ConversionPattern" value="%d [%-5p][%t] %c{1} %m %n" />

</layout>

</appender>

<!-- 以com.hj.service包开头的所涉及到的类进行log -->

<logger name="com.hj.service" additivity="true">

<level value="INFO" />

<appender-ref ref="service" />

</logger>

<!-- controller层的日志 -->

<appender name="controller" class="org.apache.log4j.RollingFileAppender">

<param name="File" value="${webapp.root}/logs/controller.log" />

<param name="MaxFileSize" value="5MB" />

<param name="MaxBackupIndex" value="20" />

<param name="Encoding" value="utf-8"/>

<layout class="org.apache.log4j.PatternLayout">

<param name="ConversionPattern" value="%d [%-5p][%t] %c{1} %m %n" />

</layout>

</appender>

<!-- 以com.hj.controller包开头的所涉及到的类进行log -->

<!-- 输出源的可添加性(Appender Additivity):一个名为C的logger的日志定义的输出将延续到它自身以及它的ancestor logger的appenders

Loggers的附加标记(additivity flag)默认为true。 -->

<logger name="com.hj.controller" additivity="true">

<level value="INFO" />

<appender-ref ref="controller" />

</logger>

<!-- 异常捕获的日志 -->

<appender name="error" class="org.apache.log4j.RollingFileAppender">

<param name="File" value="${webapp.root}/logs/error.log" />

<param name="MaxFileSize" value="5MB" />

<param name="MaxBackupIndex" value="20" />

<param name="Encoding" value="utf-8"/>

<layout class="org.apache.log4j.PatternLayout">

<param name="ConversionPattern" value="%d [%-5p][%t] %c{1} %m %n" />

</layout>

</appender>

<!-- 对com.hj.exception.ErrorHandler类进行log -->

<logger name="com.hj.exception.ErrorHandler" additivity="true">

<level value="ERROR" />

<appender-ref ref="error" />

</logger>

</log4j:configuration>

2、dao层

[java] view
plain copy







@Repository

public class UserDao {

private Logger logger = Logger.getLogger(this.getClass());

public void show(){

logger.info("this is DAO add");

}

public void exception(){

String str = null;

try{

str.charAt(2);

}catch(Exception e){

logger.error("DAO空指针异常", e);

}

}

public void throwsExcep() throws Exception{

String str = null;

logger.info("dao测试异常");

str.charAt(2);

}

}

3、service层

[java] view
plain copy







@Service

public class UserService {

private Logger logger = Logger.getLogger(this.getClass());

@Resource

private UserDao userDao;

public void show(){

logger.info("ths is Service add");

userDao.show();

}

public void exception(){

String str = null;

try{

str.charAt(2);

}catch(Exception e){

logger.error("Service空指针异常", e);

}

userDao.exception();

}

public void throwsExcep() throws Exception{

logger.info("service测试异常");

userDao.throwsExcep();

}

}

4、controller层

[java] view
plain copy







@Controller

public class UserController {

private Logger logger = Logger.getLogger(this.getClass());

@Resource

private UserService userService;

@RequestMapping(value = "/show")

public String show(){

logger.info("this is Controller add");

userService.show();

return "index";

}

@RequestMapping(value = "/exception")

public String exception(){

String str = null;

try{

str.charAt(2);

}catch(Exception e){

logger.error("Controller空指针异常", e);

}

userService.exception();

return "index";

}

@RequestMapping(value = "/throwsExcep")

public String throwsExcep() throws Exception{

logger.info("controller测试异常");

userService.throwsExcep();

return "index";

}

}

5、异常处理中心,捕获所有controller的所有异常

[java] view
plain copy







@ControllerAdvice

public class ErrorHandler {

private Logger logger = Logger.getLogger(this.getClass());

@ExceptionHandler(value = Exception.class)

public @ResponseBody Object errorResponse(Exception e) {

logger.error("异常处理中心", e);

return e;

}

}

6、生成的日志文件



工程下载地址:http://download.csdn.NET/detail/wxwzy738/7409341
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: