- 浏览: 342678 次
- 性别:
- 来自: 上海
-
文章分类
最新评论
-
alafqq:
很好的一篇启蒙hashmap的文章;HASHTABLE的93行 ...
使用数组和链表实现hash表存储信息 -
小帅1127:
我擦,我还以为有什么大坑呢,这也写出来。。。
if..else if和if..if的区别 -
fncj:
转下http://www.dodoer.com
hadoop单机版搭建图文详解 -
yueshang520:
Spring注解原理的详细剖析与实现 -
fncj:
转下,谢谢http://www.whohelpme.com/b ...
Spring注解原理的详细剖析与实现
一、什么是log4j? http://logging.apache.org/log4j/(官方网站)
Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
二、为什么使用log4j?
1、java中System.out.println(message) 太长,每次输入太麻烦,用log4j可以log.debug(message),相对比较短
2、信息输出来源不确定,由于有太多的System.out.println()来自不同的class和方法,有时候都不知道这些"FlagMsg"是哪里来的,只好用"classA", "methodB"来区分,用了log4j,每个消息会自动附上发生的时间和来源,便于区分,比如,在你的class里面用log.info("I am form here") 便产生如下log:
[2011-08-04 20:34:42,828] INFO testpkg.pkg1.TestLog run() – I am from here
3、自动添加/删除调试信息:开发的时候需要调试信息,安装到运行环境中又要删除部分调试信息(这可是体力活),一旦出错进行后期维护又需要调试信息了,可是这些调试信息已经从源代码中删掉了,又要再加,再删除,如此往复。有了log4j,所有信息分为不同级别,DEBUG<INFO<WARN<ERROR<FATAL 开发/调试时候需要DEBUG以上的信息,正式运行环境中需要INFO以上的信息,通过更改配置文件即可随时调整,无须再删除/添加了。
4、多日志目标。有条信息,即想要输出到屏幕,又想要写文件,还要发送邮件(比如严重的系统错误),在程序中,仍然是一句log.error(msg)搞定,至于log发送到什么地方,全由配置文件来决定,开发者不要关心文件如何写,邮件如何发的问题,留给log4j去解决把。
5、超强的免维护rolling file的log功能,如果开发个服务器应用,有什么问题往log里面写,万一几个月忘了清理log文件,弄不好log把硬盘撑满了。log4j提供超强的rolling file,可以指定log文件为 xxx.log ,大小500k,循环5个,如果超过了这个大小,则自动变成xxx.log.1 xxx.log.2 ... xxx.log.5 最老的log文件就自动删除,永远也不要担心log文件把硬盘撑爆了。
(以上理由同样适用于java se 1.4以上自带的logging)
6、用户众多,性能超群,数量众多的应用服务器比如jboss, springframework等等都使用了log4j,再次证明了它的价值。
7、apache logging还提供了log4net, log4cxx等,大部分功能都与log4j兼容如果你使用多种语言开发,可以因此受益。省去每种语言都学习一套类库。
三、如何使用log4j?
1、 在官网上下载到dom4j-1.2.X.jar包,并将其加入到项目project的lib下。
2、在project的src目录下建立一个名字为log4j.properties的配置文件:
、 根据自己需要配置属性(下面会详细介绍配置信息内容)
4 、在需要输出日志的类中加入相关的代码:
定义属性:
static Logger logger = Logger.getLogger(PointDipatchTest.class.getName());
在相应的方法中用如下代码代替system.out.println(“message”):
if(logger.isInfoEnabled())
logger.info(message);
}
至此,四步完成对log4j的配置与使用!
四、log4j.properties配置文件中各属性揭秘:
1、 log4j.rootCategory=INFO, stdout , R
此句为将等级为INFO的日志信息输出到stdout和R这两个目的地,stdout和R的定义在下面的代码,可以任意起名。等级可分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL,如果配置OFF则不打出任何信息,如果配置为INFO这样只显示INFO, WARN, ERROR的log信息,而DEBUG信息不会被显示,具体讲解可参照第五部分定义配置文件中的logger。
2、 log4j.appender.stdout=org.apache.log4j.ConsoleAppender
此句为定义名为stdout的输出端是哪种类型,可以是 org.apache.log4j.ConsoleAppender(控制台), org.apache.log4j.FileAppender(文件), org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件), org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件) org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
3、 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
此句为定义名为stdout的输出端的layout是哪种类型,可以是 org.apache.log4j.HTMLLayout(以HTML表格形式布局), org.apache.log4j.PatternLayout(可以灵活地指定布局模式)org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串), org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
4、 log4j.appender.stdout.layout.ConversionPattern= [QC] %p [%t] %C.%M(%L) | %m%n
如果使用pattern布局就要指定的打印信息的具体格式ConversionPattern,打印参数如下: %m 输出代码中指定的消息 %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL %r 输出自应用启动到输出该log信息耗费的毫秒数 %c 输出所属的类目,通常就是所在类的全名 %t 输出产生该日志事件的线程名 %n 输出一个回车换行符,Windows平台为“rn”,Unix平台为“n” %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921 %l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。 [QC]是log信息的开头,可以为任意字符,一般为项目简称。
5、 log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
此句与第3行一样。定义名为R的输出端的类型为每天产生一个日志文件。
6、 log4j.appender.R.File=D:\\Tomcat 5.5\\logs\\qc.log
此句为定义名为R的输出端的文件名为D:\\Tomcat 5.5\\logs\\qc.log可以自行修改。
7、 log4j.appender.R.layout=org.apache.log4j.PatternLayout与第4行相同。
8、 log4j.appender.R.layout.ConversionPattern=%d-[TS] %p %t %c - %m%n 与第5行相同。
9、 log4j.logger.com. neusoft =DEBUG
指定com.neusoft包下的所有类的等级为DEBUG。可以把com.neusoft改为自己项目所用的包名。
10、 log4j.logger.com.opensymphony.oscache=ERROR
11、 log4j.logger.net.sf.navigator=ERROR
这两句是把这两个包下出现的错误的等级设为ERROR,如果项目中没有配置EHCache,则不需要这两句。
12、log4j.logger.org.apache.commons=ERROR
13、 log4j.logger.org.apache.struts=WARN
这两句是struts的包。
14、 log4j.logger.org.displaytag=ERROR
这句是displaytag的包。(QC问题列表页面所用)
15、 log4j.logger.org.springframework=DEBUG
此句为Spring的包。
16、 log4j.logger.org.hibernate.ps.PreparedStatementCache=WARN
17、 log4j.logger.org.hibernate=DEBUG
此两句是hibernate的包。
以上这些包的设置可根据项目的实际情况而自行定制。
五、log4j的详细组成:
--Log4J组件的超
Log4J提供了一个root Logger,它是所有Logger组件的“祖先”,它永远存在,且不能通过名字检索或引用,通过Logger.getRootLogger()方法取得它。配置root Logger代码: log4j.rootLogger=INFO,console
--LOG4J组件的继承性
可在配置文件中方便地配置存在继承关系的Logger组件,凡是在符号“.”后面的组件都会成为在符号“.”前面的Logger组件的子类。例如: log4j.apache.myLogger=WARN log4j.apache.myLogger.mySonLogger=,file
Logger继承关系示例图
root Logger: 日志级别=INFO appender清单=console
myLogger: 日志级别=WARN appender清单=null
mySonLogger: 日志级别=null appender清单=file
这三个Logger组件实际日志级别和Appender如下表:
Logger组件 日志级别 Appender清单
root Logger INFO console
myLogger WARN console(继承)
mySonLogger WARN(继承) file,console(继承
--LOG4J主要由三大组件组成:
三大组件定义配置文件
Log4j支持两种配置文件格式,一种是XML格式的文件,一种是Java特性文件log4j.properties(键=值)
1、记录器(Logger):决定什么日志信息应该被输出、什么日志信息应该被忽略;
Logger组件是LOG4J的核心组件,它代表了Log4J的日志记录器,它能够对日志信息进行分类筛选。它由org.apache.log4j.Logger类实现
Logger组件提供的方法: package org.apache.log4j; public class Logger { // Creation & retrieval methods: public static Logger getRootLogger(); public static Logger getLogger(String name); // printing methods: public void debug(Object message); public void info(Object message); public void warn(Object message); public void error(Object message); public void fatal(Object message); // generic printing method public void log(Priority p, Object message); }
以上代码定义了一个Logger组件,名称为myLogger,日志级别为WARN
2、存放器(Appender): 指定日志信息应该输出到什么地方, 这些地方可以是控制台、文件、网络设备
3、布局管理器(Layout): 指定日志信息的输出格式
组件之间的关系:
一个Logger可以有多个Appender,也就是说日志信息可以同时输出到多个设备上,每个Appender对应一种Layout
Logger 负责处理日志记录的大部分操作。
其语法为:
log4j.rootLogger = [ level ] , appenderName, appenderName, …
其中,level 是日志记录的优先级,分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者自定义的级别。Log4j建议只使用四个级别,优先级从高到低分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关。比如在这里定义了INFO级别,只有等于及高于这个级别的才进行处理,则应用程序中所有DEBUG级别的日志信息将不被打印出来。ALL:打印所有的日志,OFF:关闭所有的日志输出。 appenderName就是指定日志信息输出到哪个地方。可同时指定多个输出目的地。
2、配置日志信息输出目的地 Appender
Appender 负责控制日志记录操作的输出。
其语法为:这里的appenderName为在上面提到的,可任意起名。
log4j.appender.appenderName=fully.qualified.name.of.appender.class log4j.appender.appenderName.option1 = value1 … log4j.appender.appenderName.optionN = valueN
其中,Log4j提供的appender有以下几种:例如:log4j.appender.stdout=org.apache.log4j.ConsoleAppender
org.apache.log4j.ConsoleAppender(控制台), org.apache.log4j.FileAppender(文件), org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件), org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),可通过log4j.appender.R.MaxFileSize=100KB设置文件大小,还可通过log4j.appender.R.MaxBackupIndex=1设置为保存一个备份文件。 org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
定义一个名为stdout的输出目的地,ConsoleAppender为控制台。
3、配置日志信息的格式(布局)Layout
Layout 负责格式化Appender的输出。
其语法为:
log4j.appender.appenderName.layout=fully.qualified.name.of.layout.class log4j.appender.appenderName.layout.option1 = value1 … log4j.appender.appenderName.layout.optionN = valueN
其中,Log4j提供的layout有以下几种: 格式化日志信息
org.apache.log4j.HTMLLayout(以HTML表格形式布局), org.apache.log4j.PatternLayout(可以灵活地指定布局模式), org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串), org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
Log4J采用类似C语言中的printf函数的打印格式格式化日志信息,打印参数如下:日志级别 实例后,我们可调用以下方法之一输出日志信息:
记录器还有一个重要的属性,就是级别。(就象一个家庭中,成员间存在辈份关系,但不同的成员的身高可能不一样,且身高与辈份无关)程序员可以给不同的记录器赋以不同的级别,如果某个成员没有被明确值,就自动继承最近的一个有级别长辈的级别值。根记录器总有级别值。
日志级别种类一共有五种,级别由高到低依次是:fatal、error、warn、info、debug。获得Logger
%m 输出代码中指定的消息 %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL %r 输出自应用启动到输出该log信息耗费的毫秒数 %c 输出所属的类目,通常就是所在类的全名 %t 输出产生该日志事件的线程名 %n 输出一个回车换行符,Windows平台为“rn”,Unix平台为“n” %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921 %l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。
注意:以上方法只有当它的级别大于或等于Logger组件配置的日志级别时才调用。以前面我们配置的myLogger为例,它的日志级别为WARN, 那么在程序中,它的warn()、error()、fatal()方法会被执行。对于log()方法,只有当它的参数Priority指定的日志级别大于或等于WARN时,它才会被执行。
为什么需要对日志进行分级?
在写程序的时候,为了调试程序,我们会在很多出错的地方输出大量的日志信息。当程序调试完,不需要这些信息时,将程序中这些输出日志信息代码删除吗?这样费时费力,对于大型程序几乎不可行。通过对日志分级,假如不想输出WARN级别的日志信息,则Logger组件的级别调高即可,省时省心。
Tips:
如果你用eclipse,有个免费的插件叫做log4e,可以自动帮你生成if(logger.isDebugEnabled()) {}这些代码,自动生成private static final Logger logger = org.apache.log4j.Logger.getLogger(本类名字.class);的定义,而且可以自动帮你把文件里的System.out.println()都替换成logger.debug(),减少你自己手写的部分,还是很方便的。
- apache-log4j-1.2.16.zip (4.4 MB)
- 下载次数: 2
发表评论
-
apache日志信息详解
2011-11-06 21:19 6318一、访问日志的格式 Apache内建了记录服务器 ... -
使用CGLIB实现AOP功能与AOP概念解释 .
2011-08-19 10:30 1424第三方创建代理对象的框架cglib,目标类可以不实现接口 ... -
浏览器如何工作
2011-08-19 08:57 0http://taligarsiel.com/Projects ... -
编码实现用JDK中的Proxy实现springAOP功能
2011-08-18 15:04 792http://blog.csdn.net/iamtheevil ... -
Spring注解原理的详细剖析与实现
2011-08-14 23:09 84350本文主要分为三部分: ... -
Spring装配基本属性的原理分析与代码实现
2011-08-11 15:37 1481首先,做一个配置属性的基本测试。修改beans.xml,使引用 ... -
编码剖析Spring依赖注入的原理
2011-08-10 20:01 1866一、注入依赖对象 基本类型对象注入: <b ... -
Spring的三种实例化Bean的方法
2011-08-10 14:03 1Spring的三种实例化Bean的方法 1、 使用 ... -
Spring管理bean的原理自定义实现
2011-08-10 10:44 62441、Spring通过BeanDefinition管理基于S ... -
spring环境搭建与测试
2011-08-10 08:40 3473Chapter1、搭建与测试spring的环境 1、 ... -
java回调机制实现
2011-08-08 09:06 2106Java的接口支持提供了一种获得回调的等价功能的 ... -
log4j使用详解
2011-08-04 23:05 2http://logging.apache.org/log4j ... -
spring入门及Demo
2011-07-29 16:01 0一、Spring是什么? Spring是一个开源框架,它 ... -
ibatis入门及环境搭建
2011-07-23 12:27 1468使用ibatis的理由: 1. 知道怎样操作10种以上 ... -
java解析XML的四种方法的学习与比较
2011-03-30 20:55 7293四种XML解析方法: ... -
自定义日志模块实现
2011-03-30 09:58 1167package wxy.XXXX.Utils; impo ... -
synchronized(this)
2011-03-29 09:17 70551、当两个并发线程访问同一个对象object中的这个synch ... -
详细解析Java中抽象类和接口的区别(转)
2011-03-24 23:48 972在Java语言中, abstract cl ... -
div内页面背景图片无法显示解决方法
2011-03-14 21:12 1385用photoshop打开背景图片,在“图像”菜单下将“模式 ... -
NIO学习笔记(三)---通道
2011-03-09 23:06 16031、通道基础 ...
相关推荐
与Log4j 1.x相比,Log4j2在设计上进行了重大改进,并解决了Logback等其他日志框架中存在的某些体系结构问题。 #### 特性概述 1. **审计功能**:Log4j2设计时考虑到了审计需求,这意味着即使在配置更新过程中,它也...
描述中的"NULL"意味着没有额外的具体信息,但我们通常可以从Log4j的使用上下文中了解到,它广泛用于调试、性能分析和系统监控,通过输出详细的运行时信息帮助开发者理解程序状态和追踪问题。 **标签解析** "源码...
Log4j 详解 Log4j 是一款功能强大的日志记录工具,广泛应用于 Java 应用程序中。它可以帮助开发人员调试和分析程序,记录程序的运行情况,并提供了灵活的配置方式来控制日志的输出。 Log4j 的概念 Log4j 中有三个...
### Log4j 使用详解 #### 一、Log4j简介 Log4j 是 Apache 的一个开源项目,通过使用 Log4j,开发者能够控制日志信息的输出等级及去向,从而更加灵活地处理日志信息。它具有强大的功能,简单的配置,并且能够支持...
Log4j、Log4j2和Fastjson的安全性问题在过去曾引起广泛关注,例如Log4j2的CVE-2021-44228(也被称为Log4Shell漏洞),这是一个远程代码执行漏洞,影响了许多使用Log4j2的系统。这个插件可能就是为了检测和利用这些...
Log4j是一款广泛使用的Java日志记录框架,它允许开发者以高效且灵活的方式来记录应用程序的日志信息。在本文中,我们将深入探讨Log4j的使用方法,包括配置文件的设置、根配置、输出目的地以及日志信息的格式。 首先...
这表明我们可以从这个文件中获取Log4j 1.2 API的详细使用指南和参考文档。 **Log4j API知识点** 1. **日志级别**:Log4j API支持多个日志级别,如DEBUG、INFO、WARN、ERROR和FATAL。这些级别允许开发者根据需要...
#### 四、使用Log4j记录日志 1. **引入Log对象**: ```java protected final Log log = LogFactory.getLog(getClass()); ``` 在Java类中,需要引入Log对象以便记录日志信息。 2. **记录日志信息**: ```...
Log4Shell漏洞的核心在于log4j2的Lookup功能,该功能允许在日志消息中动态解析变量。攻击者可以利用此功能,将恶意的JNDI链接注入到日志记录中,当log4j2尝试解析这些链接时,就会执行攻击者控制的代码。由于很多...
本文将详细探讨Log4j的使用,主要关注1.2.17版本的jar包以及配置文件`log4j.properties`。 ### 1. Log4j简介 Log4j是一个开源的日志组件,支持多种输出格式,如控制台、文件、数据库等。它的核心概念包括Logger、...
Log4j是一个广泛使用的Java日志框架,由ApacheJakarta项目开发。它为开发者提供了灵活且功能丰富的日志记录机制,使应用程序中的日志管理变得简单。本教程将深入介绍如何使用Log4j进行日志记录,包括配置、基本用法...
本文将详细探讨Log4j2中的两个关键组件:log4j-api-2.17.1.jar和log4j-core-2.17.1.jar。 首先,log4j-api-2.17.1.jar是Log4j2的核心API库,它定义了日志记录的接口和抽象类,为应用程序提供了一套编程模型。这些...
Log4j是Java编程语言中广泛使用的日志记录框架,特别是在企业级应用和大型系统中。这个"**log4j-2.17.1**"的版本是该框架的一个更新,提供了修复的安全漏洞和性能优化。以下是关于Log4j 2.17.1的一些关键知识点: 1...
本文将详细解析Log4j 1.2.15.jar这个版本的核心概念、使用方法以及重要特性。 一、Log4j简介 Log4j是由Apache软件基金会开发的一个开源日志组件,主要为Java应用程序提供日志服务。它的设计理念是让日志输出变得...
- **log4j使用方法.doc**:这是一个文档文件,很可能包含关于如何在实际项目中配置和使用log4j的详细步骤和示例代码。 - **log4j.rar**:这个压缩文件可能是log4j的库文件,或者包含了额外的示例项目、配置文件和...
### Log4J完整说明与配置解析 #### 一、Log4J简介 Log4J是Apache的一个开源项目,用于提供灵活的日志记录功能。通过它,开发者能够控制日志信息的输出级别、输出目的地(控制台、文件等)、格式化方式等。本文将...
Log4j是一款广泛使用的Java日志记录框架,它允许开发者以灵活的方式控制应用程序的日志输出。这个框架的主要目的是提供一种简单、高效的日志记录机制,帮助开发者调试代码、追踪问题,以及收集运行时信息。在Java...
本文将详细解析Log4j的1.2.16版本,探讨其核心组件,并提供实际应用中的指导。 一、Log4j概述 Log4j是一个基于Java的日志API,它的设计目标是提供一个灵活且高效的日志记录系统,支持多种输出格式,如控制台、文件...
#### 四、log4j的核心组件 log4j的核心组件主要包括**Loggers(记录器)**、**Appenders(输出源)**和**Layouts(布局)**。 1. **Loggers (记录器)**:负责生成日志信息,并决定是否发送日志信息到Appenders。记录器...
**IDEA与log4j**: IntelliJ IDEA(简称IDEA)是一款流行的Java集成开发环境,它支持将log4j集成到项目中,通过配置pom.xml或build.gradle文件添加依赖,或者手动将log4j.jar添加到项目的类路径下,以便在IDEA中直接...