log4j使用入门.docx

上传人:b****5 文档编号:7251582 上传时间:2023-01-22 格式:DOCX 页数:12 大小:21.17KB
下载 相关 举报
log4j使用入门.docx_第1页
第1页 / 共12页
log4j使用入门.docx_第2页
第2页 / 共12页
log4j使用入门.docx_第3页
第3页 / 共12页
log4j使用入门.docx_第4页
第4页 / 共12页
log4j使用入门.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

log4j使用入门.docx

《log4j使用入门.docx》由会员分享,可在线阅读,更多相关《log4j使用入门.docx(12页珍藏版)》请在冰豆网上搜索。

log4j使用入门.docx

log4j使用入门

21:

232012/3/4

Log4j

Apache开源(http:

//logging.apache.org/log4j/),轻量的日志管理框架,

控制日志信息输出地:

控制台,文件,GUI,套接字,NT事件记录器,UnixSyslog

守护进程等,控制输出格式,定义日志级别,无需修改代码,配置文件修改

日志用途分类:

开发调试日志

系统运行日志

log4j对比System.out.println优势

1.分级别控制日志的输出与开关

2.按不同的类和包进行输出控制

3.控制日志不同的输出位置

Log4j组成(三大核心组件)

1.Logger

代表了Log4J的日志记录器,它能够对日志信息进行分类筛选,控制日志级别,

完成日志信息的具体输出操作

2.Appender

控制日志的输出位置

3.Layout

配置日志的输出格式

一个Logger可以有多个Appender,即日志信息可以同时输出到多个设备上,

一个Appender可以被多个Logger使用

每个Appender对应一种Layout

Logger

\

Appender1-->Layout

/

Logger

\

Appender2-->Layout

Logger记录器

它能够对日志信息进行分类筛选,控制日志级别,完成日志信息的具体输出操作,

接收日志语句生成日志请求

log4j允许定义多个记录器,每个记录器都有自己的名字

Logger的命名是依据实体的,其名字区分大小写,遵循以下分层命名规则:

如果一个Logger以另外一个Logger的名字后跟"."作为前缀,则,该Logger是

另一Logger的子Logger

eg:

x.y.z是x.y的子Logger

根记录器

Log4J提供了一个顶层Logger,它是所有Logger组件的"祖先",它永远存在,且

不能通过名字得到,只能通过Logger.getRootLogger()得到

其他Logger则应该通过Logger.getLogger()得到

测试如下:

Stringname=Logger.getRootLogger().getName();//root

booleanb=Logger.getRootLogger().equals(Logger.getLogger(name));

System.out.println(b);//false

主要方法

//得到根Logger

publicstaticLoggergetRootLogger();

//得到名字为name的Logger

publicstaticLoggergetLogger(Stringname);

//相当于Logger.getLogger(clazz.getName())

publicstaticLoggergetLogger(java.lang.Classclazz);

publicvoiddebug(Objectmessage);//输出debug级别的日志信息

publicvoidinfo(Objectmessage);//输出info级别的日志信息

publicvoidwarn(Objectmessage);//输出warn级别的日志信息

publicvoiderror(Objectmessage);//输出error级别的日志信息

publicvoidfatal(Objectmessage);//输出fatal级别的日志信息

publicvoidtrace(Objectmessage);//输出trace级别的日志

///输出参数Priority指定级别的日志信息

publicvoidlog(Priorityp,Objectmessage);

publicvoidsetLevel(Levellevel);

Logger的级别

可以给Logger赋予不同的级别,如下:

1.TRACE查找,追踪

2.DEBUG7调试

3.INFO6提示的信息

4.WARN4警告

5.ERROR3错误

6.FATAL0严重的

//DEBUG

All//用来设置所有

OFF//关闭所有

这些级别定义在org.log4j.Level,可以通过继承Level定义自己的levels,

但是不建议.

Loger的日志继承性

如果某个Logger没有明确值,则自动从最接近它的父级继承级别值,

根记录器总有级别值,

如果在程序中使用setLevel()设置级别之后,则配置文件中不起作用

可以通过Logger实例的debug,info,warn,error,fatal,log输出日志请求.

规则:

1.如果日志请求的级别大于或等于Logger的级别,则日志请求才被启用

eg:

日志级别为WARN,程序中的warn()、error()、fatal()方法会被输出

2.多个logger都可以匹配输出,则每个都产生输出,其中根logger匹配所有

输出;级别控制来源于路径最详细的logger

通过getLogger()方法可以根据相同名字获取同一个Logger对象的引用

因此可以配置一个Logger然后在任何地方获得这个实例,或者在代码之外

传递它的引用

一个Logger的祖先可以比后代Logger出现的晚,但会自动根据名字之间的关系建立

父子关系

一般会在程序初始化时,读取一个文件来配置log4j环境。

Log4j中定义一个Logger简单的方法是使用类的完全限定名,可以在每个类中通过

静态实例变量来完成.

=================================================

配置文件中配置Logger组件

可在Log4J配置文件中配置自己的Logger组件,示例:

log4j.logger.myLogger=WARN

以上代码定义了一个Logger组件,名称为myLogger,日志级别为WARN

配置rootLogger代码:

log4j.rootLogger=INFO,console

日志分级的原因

在写程序的时,为了调试程序会在很多出错的地方输出大量的日志信息.

当程序调试完,不需要这些信息时,将程序中这些输出日志信息代码删除

费时费力,对于大型程序几乎不可行。

通过对日志分级,假如不想输出WARN级别的日志信息,则Logger组件的

级别调高即可

============================================================

Appender存放器

管理日志语句的输出结果,接收Logger发送来的日志,决定日志输出目的地,

log4j允许将日志请求输出到多个目的地

在Log4j中,输出目的地被称为Appender,支持一下目的地:

Console(控制台),File(文件),GUIcomponents(GUI组件),

Remotesocketservers(套接字服务器),JMS,NTEventLogger(NT事件记录器),

RemoteUNIXSyslogdaemon(UNIXSyslog守护进程)

Log4j提供的Appender有以下几种:

org.apache.log4j.ConsoleAppender//控制台

org.apache.log4j.FileAppender//文件

org.apache.log4j.DailyRollingFileAppender//每天产生一个日志文件

org.apache.log4j.RollingFileAppender//文件大小达到指定尺寸时产生一个新文件

org.apache.log4j.WriterAppender//将日志以流格式发送到任意指定位置

org.apache.log4j.JDBCAppender//把日志用JDBC记录到数据库

一个Logger可同时对应多个Appender,程序中可以通过addAppender为Logger

添加Appender

Appender的继承/叠加性

默认情况下,一个Logger子类将继承其祖先的所有Appender;

(Appender的继承层次是附加在记录器继承层次上的)

可以通过setAdditivity(false),取消叠加,之后该Logger则只拥有自己的

Appender

eg:

myLogger配置二个Appender:

一个名字为file,一个是名字为console

log4j.logger.myAppender=WARN,file,console

log4j.appender.file=org.apache.log4j.RollingFileAppender

log4j.appender.file.File=log.txt

log4j.apender.console=org.apache.log4j.ConsoleAppender

Logger组件的继承关系小结:

.如果子类Logger组件没有定义日志级别,则将继承父类的日志级别;

.如果子类Logger组件定义了日志级别,就不会继承父类的日志级别;

.黙认情况下,子类Logger组件会继承父类所有的Appender,把它们加入到自己的Appender;

.如果把子类Logger组件的additivity标志设为false,那么它就不会继承父类Appender

Layout布局

决定Appender将日志语句写入日志目的地采用的格式

输出信息的格式,Log4j中称为Layout

常用Layout

org.apache.log4j.HTMLLayout//HTML表格形式布局

org.apache.log4j.PatternLayout//根据模板布局

org.apache.log4j.SimpleLayout//包含日志信息级别和信息字符串

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

PatternLayout让开发者依照ConversionPattern定义输出格式

ConversionPattern中一些指定日志内容和格式的预定义符号如下:

%m输出代码中指定的消息

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

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

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

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

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

%d输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格

式,比如:

%d{yyyMMMddHH:

mm:

ss,SSS},输出类似:

2002年10月18日

22:

10:

28,921

%l输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行

-X号:

X信息输出时左对齐

%x:

输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像javaservlets这样的多客户多线程的应用中。

%%:

输出一个"%"字符

%F:

输出日志消息产生时所在的文件名称

%L:

输出代码中的行号

可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。

如:

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字符,就从左边较远输出的字符截掉

eg:

//为名称为console的Appender配置SimpleLayout:

log4j.appender.console.layout=org.apache.log4j.SimpleLayout

输出日志格式如下:

WARN-ThisisalogmessagefromthemyLogger

//为名称为file的Appender配置PatternLayout

log4j.appender.file.layout=org.apache.log4j.PatternLayout

//为PatternLayout设置ConversionPattern

log4j.appender.file.layout.ConversionPattern=%t%p-%m%n

输出日志格式如下

THREAD-1WARN-ThisisalogmessagefromthemyLogger

Log4j的基本使用步骤

1.定义配置文件

2.程序中使用

1)加载配置(该步骤一般放在入口类的静态代码段中完成)

2)获取Logger

3)输出日志

配置文件

Log4J支持二种配置文件格式:

XML和properties

log4j.xml和log4j.properties,前者优先

log4j.xml比log4j.properties多的功能

1.log4j.xml优先于log4j.properties,如果同时存在log4j.xml和log4j.properites,以log4j.xml为准。

2.在log4j.properties里,控制级别的时候,只能打印出大于指定级别的所有信息;

但是在log4j.xml中可以通过filter来完成过滤:

典型的引用是只打印出某种级别的信息。

class="org.apache.log4j.DailyRollingFileAppender">

3.可以通过logger的additivity=“false”属性,来设置多个logger是否重复输出同一条信息

properties配置

1.配置Logger组件

配置rootLogger语法:

log4j.rootLogger=[priority],appenderName,appenderName,...

配置自定义Logger语法:

log4j.logger.loggerName=[priority/优先的],appenderName,appenderName,...

其中:

priority为日志级别,

可选值包括FATAL,ERROR,WARN,INFO,DEBUG,ALL,OFF;

appenderName指定Appender组件,可指定多个

2.配置Appender组件

配置日志信息输出目的地Appender,语法为:

//fully.ualified.name.of.appender.class为实现类

log4j.appender.appenderName=fully.ualified.name.of.appender.class

log4j.appender.appenderName.option1=value1

...

log4j.appender.appenderName.optionN=valueN

option(选项)是该类的属性,long4j会去调用其对应的setter方法进行设置

Log4j提供的Appender常用的有以下几种:

org.apache.log4j.ConsoleAppender//控制台

org.apache.log4j.FileAppender//文件

org.apache.log4j.DailyRollingFileAppender//每天产生一个日志文件

org.apache.log4j.RollingFileAppender//文件大小达到指定尺寸时产生一个新文件

org.apache.log4j.WriterAppender//将日志以流格式发送到任意指定位置

org.apache.log4j.JDBCAppender//把日志用JDBC记录到数据库

3.配置Layout组件

配置Layout组件语法为:

log4j.appender.appenderName.layout=fully.ualified.name.of.appender.class

log4j.appender.appenderName.layout.option1=value1

...

log4j.appender.appenderName.layout.optionN=valueN

完整示例:

##LOGGERS##

#configurerootlogger

log4j.rootLogger=INFO,console

#definealoggernamedmyLogger

log4j.logger.myLogger=WARN

#defineasecondloggerthatisachildtomyLogger

log4j.logger.myLogger.mySonLogger=,file

##APPENDERS##

#defineanappendernamedconsole,whichissettobeaConsoleAppender

log4j.appender.console=org.apache.log4j.ConsoleAppender

#defineanappendernamedfile,whichissettobeaRollingFileAppender

log4j.appender.file=org.apache.log4j.FileAppender

log4j.appender.file.File=log.txt

##LAYOUTS##

#assianaSimpleLayouttoconsoleappender

log4j.appender.console.layout=org.apache.log4j.SimpleLayout

#assianaPatternLayouttofileappender

log4j.appender.file.layout=org.apache.log4j.PatternLayout

加载配置文件,配置Log4j

该步骤一般放在入口类的静态代码段中完成

a.BasicConfigurator.configure()

自动快速地使用默认Log4J环境,不需要再写配置文件

b.PropertyConfigurator.configure(StringconfigFilename)

读取使用Java属性格式的配置文件并配置Log4J环境

c.DOMConfigurator.configure(Stringfilename)

读取XML形式的配置文件并配置LOG4J环境;

获取日志记录器Logger

Logger.getLogger(Stringname);//获得自定义Logger

Logger.getLogger(Classclazz);//<==>Logger.getLogger(clazz.getName());

Logger.getRootLogger()//获得rootLogger

eg:

Loggerlog=Logger.getLogger(A.class);

程序中输出日志

eg:

myLogger.debug("Thieisalogmessagefromthe"+myLogger.getName());

使用注意:

1.看似奇怪的重复级别判断:

我们在看一些成熟框架的源代码中,经常看到如下代码:

if(logger.isDebugEnabled()){

logger.debug(“debug:

“+name);

}

为什么不是直接logger.debug(“debug:

“+name);呢?

在配置文件中虽然可以使用控制级别为比debug级别更高的级别,而不输出

debug信息;但是,这里的字符串连接操作仍然会影响运行效率;如果先判断当

前logger的级别,如果级别不合适的话,连这句字符串连接都可以不做了。

2.在java中使用log4j时,我们可以使用它的eclipse插件log4e。

它的官方网址

是:

http:

//log4e.jayefem.de/,分为商业版本和免费版本。

我们只需要使用其

免费版本,就可以极大的帮我们提高开发效率。

比如:

在一个类中声明一个

logger;帮我们写麻烦的logger.isDebugEnabled();在一个方法开始的时候打

印所有的参数;输出一个变量等等

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 笔试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1