一、日志系统介绍
日志的重要性是随着系统的膨胀而显现的,在一个庞大的系统中查错没有各种日志信息是寸步难行的。所以在系统加入日志是必须的。
最原始的日志方式,就是在程序的适当地方添加System.out.println()方法,但是带来的问题是,系统稳定后,日志太大,如果要减少日志量,就需要重新修改程序,虽然只是注释掉System.out.println()方法。但是万一系统再次出错,又要改。
commons-logging提供分级日志功能,相当于把System.out.println()方法加强了,原来是一定输出到控制台,现在commons-logging有6级日志,但是apache建议使用4级,即ERROR、WARN、INFO、 DEBUG。什么情况下输出日志由程序中写日志的方法决定,输出什么级别以上的日志和输出到哪里由配置文件决定。
使用commons-logging如下:
02 |
import org.apache.commons.logging.Log;
|
03 |
import org.apache.commons.logging.LogFactory;
|
07 |
private static Log log = LogFactory.getLog(TestLog. class );
|
08 |
public static void main(String[] args){
|
当然还要配置commons-logging.properties文件,其中定义输出哪个级别以上的日志。略。
好像这就完了,和log4j没啥关系。那么为什么一般系统都会使用commons-logging和log4j两个包来记录日志呢?
原因就是commons-logging的输出功能比较弱,也就是输出格式和输出设备选择有限,只有原生输出类 org.apache.commons. logging.impl.SimpleLog。但是它提供了一个通用的日志接口org.apache.commons.logging.log,让其他的包来实现复杂的输出。其中就有Jdk14Logger, Log4JLogger,前面是jdk1.4之后加入的,后面就是log4j中的类。
log4j也可以直接像commons-logging一样在程序中定义输出信息,然后再配置文件中定义输出级别,但是这样做就会使程序唯一的和log4j绑定(如果你一定要单独使用log4j,那么也是可以的),而且commons-logging更加智能,帮我们‘自动选择’‘适当的’日志实现系统”:
1) 首先在classpath下寻找自己的配置文件commons-logging.properties,如果找到,则使用其中定义的Log实现类;
2) 如果找不到commons-logging.properties文件,则在查找是否已定义系统环境变量org.apache.commons.logging.Log,找到则使用其定义的Log实现类;
3) 否则,查看classpath中是否有Log4j的包,如果发现,则自动使用Log4j作为日志实现类;
4) 否则,使用JDK自身的日志实现类(JDK1.4以后才有日志实现类);
5) 否则,使用commons-logging自己提供的一个简单的日志实现类SimpleLog;
(以上顺序不保证完全准确,请参考官方文档)
所以,在前面程序的基础上,只要导入log4j的包,则commons-logging会自动使用log4j作为输出类,程序不需要任何改动,但是注意:log4j的配置文件log4j.properties对Log4j来说是必须的。如果classpath中没有该配置文件,或者配置不对,将会引发运行时异常。所以下面介绍log4j.properties的配置。
二、log4j.properties的配置
其实您也可以完全不使用配置文件,而是在代码中配置Log4j环境。但是,使用配置文件将使您的应用程序更加灵活。
Log4j支持两种配置文件格式,一种是XML格式的文件,一种是properties格式的文件。下面我们介绍使用properties格式做为配置文件的方法:
示例:
log4j.rootLogger=INFO, A1
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n
1. 配置根Logger,其语法为:
log4j.rootLogger = [ level ] , appenderName, appenderName, …
其中,level 是日志记录的优先级,分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定义的级别。Log4j建议只使用四个级别,优先级从高到低分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关。比如在这里定义了INFO级别,则应用程序中所有DEBUG级别的日志信息将不被打印出来。
appenderName就是指定日志信息输出到哪个地方。您可以同时指定多个输出目的地。 appenderName是自定义的,但是为了明了,都会使用console,file等特殊名字表示输出到哪里去。
2. 配置日志信息输出目的地Appender,其语法为:
log4j.appender.appenderName = fully.qualified.name.of.appender.class
log4j.appender.appenderName.option1 = value1
…
log4j.appender.appenderName.option = valueN
其中,Log4j提供的appender有以下几种:
org.apache.log4j.ConsoleAppender(控制台),
org.apache.log4j.FileAppender(文件),
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
(1).ConsoleAppender选项
Threshold=WARN:指定日志消息的输出最低层次。
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
Target=System.err:默认情况下是:System.out,指定输出控制台
(2).FileAppender 选项
Threshold=WARN:指定日志消息的输出最低层次。
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
File=mylog.txt:指定消息输出到mylog.txt文件。
Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
(3).DailyRollingFileAppender 选项
Threshold=WARN:指定日志消息的输出最低层次。
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
File=mylog.txt:指定消息输出到mylog.txt文件。
Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
DatePattern=’.'yyyy-ww:每周滚动一次文件,即每周产生一个新的文件。当然也可以指定按月、周、天、时和分。即对应的格式如下:
1)’.'yyyy-MM: 每月
2)’.'yyyy-ww: 每周
3)’.'yyyy-MM-dd: 每天
4)’.'yyyy-MM-dd-a: 每天两次
5)’.'yyyy-MM-dd-HH: 每小时
6)’.'yyyy-MM-dd-HH-mm: 每分钟
(4).RollingFileAppender 选项
Threshold=WARN:指定日志消息的输出最低层次。
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
File=mylog.txt:指定消息输出到mylog.txt文件。
Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
MaxFileSize=100KB: 后缀可以是KB, MB 或者是 GB. 在日志文件到达该大小时,将会自动滚动,即将原来的内容移到mylog.log.1文件。
MaxBackupIndex=2:指定可以产生的滚动文件的最大数。
3. 配置日志信息的布局,其语法为:
log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
log4j.appender.appenderName.layout.option1 = value1
…
log4j.appender.appenderName.layout.option = valueN
其中,Log4j提供的layout有以下几种:
org.apache.log4j.HTMLLayout(以HTML表格形式布局),
org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
4、输出格式设置
在配置文件中可以通过log4j.appender.A1.layout.ConversionPattern设置日志输出格式。
参数:
%p: 输出日志信息优先级,即DEBUG,INFO,WARN,ERROR,FATAL,
%d: 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921
%r: 输出自应用启动到输出该log信息耗费的毫秒数
%c: 输出日志信息所属的类目,通常就是所在类的全名
%t: 输出产生该日志事件的线程名
%l: 输出日志事件的发生位置,相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)
%x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。
%%: 输出一个”%”字符
%F: 输出日志消息产生时所在的文件名称
%L: 输出代码中的行号
%m: 输出代码中指定的消息,产生的日志具体信息
%n: 输出一个回车换行符,Windows平台为”\r\n”,Unix平台为”\n”输出日志信息换行
可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。如:
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字符,就从左边交远销出的字符截掉。
三、log4j.properties的几个例子
01 |
log4j.rootLogger=DEBUG,CONSOLE,A1,im |
02 |
log4j.addivity.org.apache= true
|
04 |
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender |
05 |
log4j.appender.Threshold=DEBUG |
06 |
log4j.appender.CONSOLE.Target=System.out |
07 |
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout |
08 |
log4j.appender.CONSOLE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n |
11 |
log4j.appender.FILE=org.apache.log4j.FileAppender |
12 |
log4j.appender.FILE.File= file .log
|
13 |
log4j.appender.FILE.Append= false
|
14 |
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout |
15 |
log4j.appender.FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n |
18 |
log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender |
19 |
log4j.appender.ROLLING_FILE.Threshold=ERROR |
20 |
log4j.appender.ROLLING_FILE.File=rolling.log //文件位置,也可以用变量${java.home}、rolling.log |
21 |
log4j.appender.ROLLING_FILE.Append= true // true :添加 false :覆盖
|
22 |
log4j.appender.ROLLING_FILE.MaxFileSize=10KB //文件最大尺寸 |
23 |
log4j.appender.ROLLING_FILE.MaxBackupIndex=1 //备份数 |
24 |
log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout |
25 |
log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n |
28 |
log4j.appender.SOCKET=org.apache.log4j.RollingFileAppender |
29 |
log4j.appender.SOCKET.RemoteHost=localhost |
30 |
log4j.appender.SOCKET.Port=5001 |
31 |
log4j.appender.SOCKET.LocationInfo= true
|
33 |
log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout |
34 |
log4j.appender.SOCET.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[thread]%n%c[CATEGORY]%n%m[MESSAGE]%n%n |
37 |
log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender |
38 |
log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000 |
40 |
log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender |
41 |
log4j.appender.MAIL.Threshold=FATAL |
42 |
log4j.appender.MAIL.BufferSize=10 |
43 |
log4j.appender.MAIL.From=web@www.wuset.com |
44 |
log4j.appender.MAIL.SMTPHost=www.wusetu.com |
45 |
log4j.appender.MAIL.Subject=Log4J Message |
46 |
log4j.appender.MAIL.To=web@www.wusetu.com |
47 |
log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout |
48 |
log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n |
50 |
log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender |
51 |
log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/ test
|
52 |
log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver |
53 |
log4j.appender.DATABASE.user=root |
54 |
log4j.appender.DATABASE.password= |
55 |
log4j.appender.DATABASE.sql=INSERT INTO LOG4J (Message) VALUES (’[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n’) |
56 |
log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout |
57 |
log4j.appender.DATABASE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n |
59 |
log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender |
60 |
log4j.appender.A1.File=SampleMessages.log4j |
61 |
log4j.appender.A1.DatePattern=yyyyMMdd-HH’.log4j’ |
62 |
log4j.appender.A1.layout=org.apache.log4j.xml.XMLLayout |
64 |
log4j.appender.im = net.cybercorlin.util.logger.appender.IMAppender |
65 |
log4j.appender.im.host = mail.cybercorlin.net |
66 |
log4j.appender.im.username = username |
67 |
log4j.appender.im.password = password |
68 |
log4j.appender.im.recipient = corlin@cybercorlin.net |
69 |
log4j.appender.im.layout=org.apache.log4j.PatternLayout |
70 |
log4j.appender.im.layout.ConversionPattern =[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n |
其中:log4j.addivity.org.apache=true的作用在于 children-logger是否使用 rootLogger的配置,例如 输出终端。
四、使用日志的其他问题
在程序中输出日志可以直接写 log.debug(theResult); 有些程序又使用if判断:
if (log.isDebugEnabled()) {
... do something expensive ...
log.debug(theResult);
}
其实是关于log.debug()参数的问题,如果参数初始化代价大,则先if判断,避免多余的初始化,例如多个String对象拼接。如果只是简单的传参,则无所谓使用何种方式。不过有人说为了统一风格,全部使用if判断。这个看个人喜欢了。
参考:http://www.cnblogs.com/suman/archive/2010/10/23/1858864.html
http://www.blogjava.net/sy1214520/default.html?page=3
分享到:
相关推荐
通过这种方式,你就可以实现一个既能够将日志记录到文件,又能在Qt界面中实时显示的自定义日志系统。当然,这个系统可以根据实际需求进行扩展,例如添加日志级别过滤、日志滚动、时间戳格式化等功能,以提高日志管理...
开源日志系统如"Log4CPlus"是这类工具的一个优秀代表,提供了灵活、高效的日志处理能力。 **Log4CPlus介绍** Log4CPlus 是一个模仿Java的Log4J库而设计的C++日志框架,它的目标是提供简单易用、可配置且功能丰富的...
### 网络日志系统在嵌入式文件上的实现 #### 概述 随着信息技术的进步,嵌入式系统在各个行业中发挥着越来越重要的作用。然而,由于嵌入式环境的特殊性,尤其是在非正常断电的情况下,如何保护数据安全成为了一个...
以下是对这个工作日志系统的详细介绍: 1. **日汇报功能**:系统提供一个方便的界面,让用户可以每日记录他们的工作内容,包括完成的任务、遇到的问题以及下一步的计划。这种即时反馈机制有助于个人及时调整工作...
以下将详细介绍日志管理系统的相关知识点: 1. **日志记录**:日志是系统在运行过程中生成的关于其操作和事件的文本记录。这些记录通常包含时间戳、事件类型、源、严重程度和详细信息,可以帮助我们理解系统的行为...
本文将详细介绍一款自主开发的先进日志分析工具——啄木鸟日志分析系统,探究其在信息安全领域的应用和重要性。 首先,日志分析的目的是通过收集和审查各种网络设备和服务生成的日志,来检测和识别网络环境中的异常...
本文档详细介绍了为Linux EXT2FS文件系统设计并实现事务元数据日志(journal)的工作进展。该研究针对的是如何提高文件系统在崩溃后的恢复速度和可靠性。在现代操作系统中,文件系统作为核心组件,不仅需要高效运行...
在本手册中,我们将对SANGFOR_LAS深信服日志审计系统的安装和配置进行详细介绍。该手册适用于SANGFOR_LAS深信服日志审计系统的管理员和技术支持人员,旨在帮助他们快速地安装和配置该系统。 从技术支持角度来说,...
系统日志诊断工具是IT维护和故障排查过程中不可或缺的一部分,它们帮助我们收集、分析和解释来自操作系统以及其他软件组件的日志信息。这些工具通常用于识别和解决各种系统问题,包括性能瓶颈、安全事件、应用程序...
工作日志管理系统是一个重要的工具,用于提升工作效率和团队协作,尤其在当今数字化时代,信息安全和数据管理的需求日益增长。传统的纸质日志或通知方式已经不能满足现代企业的需要,因为它们易丢失、不易检索且无法...
这篇手册将详细介绍如何配置天融信数据库审计网络审计系统的日志外发功能,包括SYSLOG外发配置、SNMP外发配置和邮件外发配置等内容。 知识点一:天融信数据库审计网络审计系统的日志外发功能 天融信数据库审计网络...
下面将详细介绍Asp.NET日志系统的核心概念、实现方式以及如何在实际应用中运用。 1. **日志系统的功能** - 错误跟踪:记录运行时出现的异常,便于分析和修复。 - 性能监控:记录系统性能指标,如请求响应时间、...
本篇文档主要介绍了三种不同的事务代码(T-CODEs)来查询SAP系统的日志信息,分别是STAD、ST03N和SE16N。 1. **STAD事务代码**: STAD是SAP系统内用于查询系统日志的常用工具,特别是针对ABAP工作日志。使用这个...
messages文件是Solaris操作系统中最重要的日志文件之一,它记录着系统核心的各种运行日志,包括认证、inetd等进程的消息及系统特殊状态,如温度超高等的系统消息。messages文件的内容是由/etc/syslog.conf文件决定的...
本文所讨论的主题是基于Python内建库设计并实现了一个分布式日志系统。该系统旨在应对自动化运维脚本数量增多、功能覆盖广泛而带来的管理难度增加的问题。分布式日志系统的设计,能够统一记录运维脚本的运行情况,...
- `程序说明.url` 可能指向日志管理系统ASP的详细使用说明书或者功能介绍。 - `rizhi` 文件名可能是遗漏了扩展名,可能是一个日志文件,或者是系统的配置文件。 总的来说,通过这个日志管理系统ASP,开发者和管理员...
本项目以C++作为主要编程语言,将详细介绍如何构建这样一个系统。 首先,C++是一种通用、面向对象的编程语言,以其高效、灵活和强大的功能而闻名。在构建日志服务分析系统时,C++可以提供低级别的控制,使得程序...
本文将详细介绍如何在安卓设备上抓取系统日志,并利用提供的工具进行本地保存,以便于后续分析。 首先,Android系统提供了多种日志类型,包括: 1. **系统日志** (System Log): 记录系统的各种事件,如开机、启动...
SecFox-LAS 日志审计系统介绍 SecFox-LAS 日志审计系统是基于 logAnalysis 和 auditSystem 的解决方案,旨在帮助企业解决安全审计问题。该系统提供了统一的日志监控和安全审计平台,实时安全日志分析,网络流量异常...