黑马程序员_Log4J

来源:互联网 发布:全文翻译软件 编辑:程序博客网 时间:2024/05/17 09:31

------- android培训java培训、期待与您交流! ----------

Log4j

Log4j概述

Log4j能控制日志信息输送的目的地是控制台、文件、GUI组件、远程套接字服务器、NT的事件记录器、UNIX Syslog守护进程等。同时可以控制每一条日志的输出格式,通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。

Log4j中有三个主要的组件,它们分别是Logger、Appender和Layout。要在程序中使用Log4j,首先需要将commons-logging.jar和logging-log4j -1.2.9.jar导入到构建路径中。然后再将log4j.properties放到src根目录下。这样才能在程序中使用log4j

Logger的使用:

声明一个静态变量Logger logger = Logger.getLog("classname");导入Property或者XML配置文件,调用输出log信息的方法,如logger.debug("msg "),logger.info("msg")

Logger(日志)

Logger hierarchy

自定义logger:通过Logger logger = Logger.getLogger(“com.foo”)返回名字为com.foo的Logger对象的引用,Logger是通过名字表明logger之间从属关系的,Logger名字体系描述如下:

比如,com.foo名字的logger是com.foo.Bar的父亲,com是com.foo.Bar的祖先

并且,Logger logger2 = Logger.getLogger(“com.foo”)返回的logger2和logger是同一个Logger对象,因为logger的名字相同,都为com.foo

Rootlogger:除了用户自定义的logger外,Log4j有rootlogger,通过Logger.getRootLogger获得,是所有logger的祖先,

Basic methods of Logger

Logger Level

Log4j中要输出的logger信息有级别,依次是DEBUG,INFO,WARN,ERROR,FATAL,级别的存在是为了更加方便的控制日志信息的输出,通常每个logger都分配一个level(创建的日志对象有level),如果某个logger没有指定等级,那么该logger会从已经分配了level里logger最近的祖先哪里继承level,具体描述如下:

因为root logger总是有loggerlevel,那么所有的logger总会有对应的level,默认情况下,root logger的level是DEBUG

下面举个例子:

首先我们定义了每个logger的级别,比如com.foo的级别为INFO(或者自己定义或者来自继承),而logging的请求同样有一个级别,比如请求的是:logger.warn(“msg”),并且注意级别的顺序:debug<info<warn<error<fatal,那么是否输出日志信息的规则是:requestlevel>=logging level,具体描述如下:

举个例子,如果com.foo.Bar的级别为INFO,那么:

logger.warn(“msg”):enable

logger.debug(“msg”):disable

Appender(输出目的地)

Appender则是用来指明将所有的log信息存放到什么地方,Log4j中支持多种appender,如console、files、GUI components、NT Event Loggers等,一个logger可以拥有多个Appender,并且enabled logging requests fora given logger will be forwarded to all the appenders in that logger as well asthe appenders higher in the hierarchy,如果com.foo有console appender,com.foo.Bar有file appender,那么com.foo.Bar既有console appender,又有file appender,因此appender也在logger的继承体系中,称为Appender Additivity,因为appender的继承源自于logger的继承,当然能够通过改变additivity flag为false,来取消appender的累加,具体描述如下:

比如,

那么,zzjie.crawl.parser的log信息只会输出到自身的appender,不再往上

例子:

Log4j提供的appender有以下几种格式,如表所示:

appender的格式含义

序号

配置

含义

1

org.apache.log4j.ConsoleAppender

控制台

2

org.apache.log4j.FileAppender

文件

3

org.apache.log4j.DailyRollingFileAppender

每天产生一个日志文件

4

org.apache.log4j.RollingFileAppender

文件大小到达指定尺寸的时候产生新文件

5

org.apache.log4j.WriterAppender

将日志信息以流格式发送到任意指定的地方

详细情况,查阅API文档

Layout(输出格式)

现在我们有了日志的级别,日志请求的级别,日志的输出目的地等,那么下一步需要明确日志的输出格式,Layout,注意layout一定是对应appender,而appender是在logger上面的,PatternLayout又能指定格式:

常见的Layout,具体查阅API文档:

需要特别说明的是PatternLayout,允许用户指定输出格式:

Log4j采用类似C语言中的printf函数的打印格式格式化日志信息,打印参数如下:

1)%m表示输出代码中指定的消息;

2)%p表示输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL;

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

4)%c表示输出所属的类目,通常就是所在类的全名;

5)%t表示输出产生该日志事件的线程名;

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

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

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

例子:

log4j.apender.stdout=org.apache.log.log4j.ConsoleAppdender

log4j.apender.stdout.layout=org.apache.log4j.PatternLayout

log4j.apender.stdout.layout.ConversionPattern=%c %-5p[%d{yyyy-MM-dd HH:mm:ss}] <%t> %m%n

Configuration(配置日志)

Log4j支持两种格式的配置文件:XML格式和Java的property格式

首先是Log4j默认的配置:BasicConfigurator.configure()

外面导入Property配置文件:PropertyConfigurator.configure(Stringpath)

外面导入XML配置文件:DOMConfigurator.configure(Stringpath)

配置文件基本格式:

options:(详细配置Google

log4j.appender.appenderName.Append = true      // 日志内容附加到文件末尾

例子:

首先是配置root,指定level = DEBUG和appender为控制台和文件

指定com.weibo.common.util和com.weibo.common.filters包里所有类的level

指定AccessTokenServiceImpl类的level和appender

 

 

 


0 0
原创粉丝点击