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();在一个方法开始的时候打
印所有的参数;输出一个变量等等