曾听人这样说过:如果你编程中,还是用System.out来打印一些调试信息,那么你依旧只是个菜鸟。
日志,最早来源于航海日志,是用来记录航海过程中的所见所闻。
在应用程序开发领域,特别是企业级应用程序,需要在程序不停止的情况下,能够分析程序的运行过程。这个时候就需要把程序运行过程中的数据内容,分支选择,异常,错误等信息完整的记录下来。实现这个功能的部件就叫做日志,因而日志主要是用在部署之后的排错调试。
如果没有日志,你无法知道导致错误的数据,无法确定究竟是什么操作导致了异常,是什么异常,因为我们不会24小时盯着它。
现在我们来介绍一下日志工具:logging,log4j,commons-logging。
系统会在有log4j的时候使用log4j,没有的时候使用logging,那么commons-logging是一个什么东西呢?
commons-logging其实没有做什么实质上的实现,它仅仅是将log4j和logging重新封装了一遍,使得你系统中如果有log4j,就使用log4j的实现,如果没有,那么就用jdk的默认实现,从而使你系统不会因为没有拷进去log4j而不能使用,如果想使用,直接将jar包放进去就可以使用,代码不用做任何改变。
所以在使用日志的时候,建议使用commons-logging。
而一个日志工具,至少应该饮食以下几个组成部分:
1、Logger
记录器组件负责产生日志,并能够对日志信息进行分类筛选,控制什么样的日志应该被输出,什么样的日志应该被忽略。它还有一个重要的属性——日志级别。不管何种日志记录工具,大概包含如下几种日志级别:DEBUG,INFO,WARN,ERROR,FATAL。
在log4j中,使用
log4j.rootLogger=[级别],[使用哪个appender]
log4.logger.[logger的名称]=[级别],[使用哪个appender]
来对logger进行配置,如果某个logger没有进行配置,那么就会使用rootLogger的配置信息。
2、Level
日志级别组件。在log4j中,级别的排序是这样的DEBUG<INFO<WARN<ERROR<FATAL。要求输出低级为低级别时,高级别的信息也会相应打出
3、Appender
日志记录工具基本上通过Appender组件来输出到目的地,一个Appender实例就表示了一个输出的目的地。
在log4j中,使用
log4j.appender.[appender的名称]=[appender类名] 来指定appender,其中常用的类是ConsoleAppender,FileAppender。
log4j.appender.[appender的名称].[appender的属性名]=[appender的属性值] 对appender中的属性进行赋值。
例,
log4j.appender.file=org.apache.log4j.FileAppender log4j.appender.file.File=d:/oa.log
4、Layout
Layout组件负责格式化输出的日志信息,一个Appender只能有一个Layout。
在log4j中,使用
log4j.appender.[appender的名称].layout=[layout的类名] 来指定layout要使用的类,常用的有PatternLayout
log4j.appender.[appender的名称].layout.[layout的属性名]=[layout的属性名] 来定义layout的格式
而log4j采用类似C语言中的printf函数的打印格式格式化日志信息,打印参数如下:
%m输出代码中指定的消息
%p输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
%r输出自应用启动到输出该log信息耗费的毫秒数
%c输出所属的类目,通常就是所在类的全名
%t输出产生该日志事件的线程名
%n输出一个回车换行符,Windows平台为“\r\n”,Unix平台为“\n”
%d输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,如:%d{yyyy MM dd HH:mm:ss}
%l输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数
总结,对于日志的使用,还可以结合AOP(面向切面编程)的思想进行使用,从而达到更好的使用效果。