`
ghl116
  • 浏览: 161371 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

一、日志系统介绍

 
阅读更多

一、日志系统介绍

日志的重要性是随着系统的膨胀而显现的,在一个庞大的系统中查错没有各种日志信息是寸步难行的。所以在系统加入日志是必须的。

最原始的日志方式,就是在程序的适当地方添加System.out.println()方法,但是带来的问题是,系统稳定后,日志太大,如果要减少日志量,就需要重新修改程序,虽然只是注释掉System.out.println()方法。但是万一系统再次出错,又要改。

commons-logging提供分级日志功能,相当于把System.out.println()方法加强了,原来是一定输出到控制台,现在commons-logging有6级日志,但是apache建议使用4级,即ERROR、WARN、INFO、 DEBUG。什么情况下输出日志由程序中写日志的方法决定,输出什么级别以上的日志和输出到哪里由配置文件决定。

使用commons-logging如下:

01 //导入类
02 import org.apache.commons.logging.Log;
03 import org.apache.commons.logging.LogFactory;
04 public class TestLog
05 {
06     //获取以当前类为参数的日志对象
07     private static Log log = LogFactory.getLog(TestLog.class);
08     public static void main(String[] args){
09         //输出4种不同级别的日志
10         log.debug("111");
11         log.info("222");
12         log.warn("333");
13         log.error("444");
14     }
15 }

 

当然还要配置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
03 # 应用于控制台
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
09 #log4j.appender.CONSOLE.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[thread] n%c[CATEGORY]%n%m[MESSAGE]%n%n
10 #应用于文件
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
16 # Use this layout for LogFactor 5 analysis
17 # 应用于文件回滚
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
26    
27 #应用于socket
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
32 # Set up for Log Facter 5
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
35    
36 # Log Factor 5 Appender
37 log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender
38 log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000
39 # 发送日志给邮件
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
49 # 用于数据库
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
58    
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
63 #自定义Appender
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

分享到:
评论

相关推荐

    操作系统安全:linux系统日志介绍.ppt

    系统日志介绍 常见的日志类型 常见的日志优先级 系统日志是由一个名为syslog的服务管理的,如以下日志文件都是由syslog日志服务驱动的: /var/log/boot.log:录了系统在引导过程中发生的事件,就是Linux系统开机...

    PHP日志系统plog(PHP).zip

    这是博客“无网不剩”的博主开发的一款日志系统。博主介绍说:“日志是一个应用程序的重要组成部分,今天在看pylons对日志的处理时,受到启发,于是plog就诞生了。很多php框架都忽略了日志的重要性(如kohana),往往...

    个人日志系统的设计与实现

    在互联网越来越普及的今天,信息在人们的日常生活中占据了非常重要的地位,个人日志系统是基于ASP和SQL Server的一种在Internet上公开发布的快速更新的个人网站系统,使用者可以简单快速地完成个人网页的创建、发布...

    Solaris日志记录介绍.doc

    solaris日志介绍 假设你是一位使用solaris操作系统的网站管理员,有一天你无意中在你硬盘/var/adm目录下messages文件中看到了如下类似内容:

    论文研究-日志分析法在一卡通系统测试中的应用.pdf

    介绍了实现该方法的系统结构和所使用的测试状态机,引入了一种自行开发的支持层次化状态机、具有执行自定义函数功能的状态机定义语言,增强了扩展日志分析法测试复杂大型系统的能力。该方法在一卡通系统测试中得到了...

    基于Hadoop的网络日志分析系统研究

    的有用信息也难以发现 分布式计算技术正好可以用来解决这一难题 阐述了 syslog 日志收集流程 详细介绍了 Hadoop 分布式计 算框架 设计并实现了一套基于 Hadoop 的网络日志分析系统 实验证明该系统是有效而实用的

    evtsys此程序将应用程序、系统日志安全日志等发送到日志服务器

    evtsys_exe.zip 一个把系统日志发送到log服务器的程序 comlog101.zip 一个用perl写的偷偷记录cmd.exe的程序,不会在进程列表中显示,因为入侵者运行的的确是cmd.exe :) Kiwi_Syslog_Daemon_7 一个很专业的日志...

    Log网监日志管理系统(介绍)

    WiLog是一款专门记录网络日志、网络访问日志的日志记录系统,通过接口查询用户资料系统(认证计费系统或者BOSS系统),从而联动显示用户访问情况及其该访问的用户姓名、、、地址、访问信息。 目前支持多种日志采集...

    基于ASP的个人日志系统(源代码+说明报告)

    在互联网越来越普及的今天,信息在人们的日常生活中占据了非常重要的地位,个人日志系统是基于ASP和SQL Server的一种在Internet上公开发布的快速更新的个人网站系统,使用者可以简单快速地完成个人网页的创建、发布...

    基于ssm美好生活日志网(源码+部署说明+系统介绍).zip

    基于SSM(Spring+SpringMVC+Mybatis)开发的美好生活日志网是一个高效、安全、可靠、易用的日志分享平台,主要功能包括个人日志管理、日志发布、日志分享等。 系统采用了SSM框架,实现了前后端的数据交互,系统的...

    [计算机毕设]基于asp的个人日志系统设计与实现(源代码+项目报告).zip

    在互联网越来越普及的今天,信息在人们的日常生活中占据了非常重要的地位,个人日志系统是基于ASP和SQL Server的一种在Internet上公开发布的快速更新的个人网站系统,使用者可以简单快速地完成个人网页的创建、发布...

    计算机毕业设计asp.net日志管理系统VS开发sqlserver数据库web结构c#编程计算机网页源码项目

    日志管理系统主要日志用户管理、日志系统管理权限管理、日志管理系统公告管理、日志管理等功能,能够实现用户通过互联网随时能够记录自己身边发生的事情 (1)权限管理:对权限信息进行添加、删除、修改和查看 (2)用户...

    ASP个人日志系统论文及毕业设计_开题报告

    ASP个人日志系统论文及毕业设计是对四年所学的一次大检测,一般包括一个开题报告.用以介绍研究方向,描述ASP个人日志系统论文研究的具体内容,ASP个人日志系统毕业设计的进度安排.同时,开题报告也是后期程序设计与实现...

    ASP个人日志系统的设计与实现(源代码+毕设文档).zip

    个人日志系统是基于ASP和SQL Server的一种在Internet上公开发布的快速更新的个人网站系统,使用者可以简单快速地完成个人网页的创建、发布和更新,是一个方便的供广大互联网用户相互交流的平台。它可以是单用户的,...

    员工的工作日志管理系统

    员工工作日志管理系统是一种非常重要的信息管理工具,它帮助企业管理员工的工作日志,包括员工的工作任务、完成的工作量以及工作时间等。这个系统可以帮助企业更好地管理员工的生产力和工作表现,以及帮助员工更好地...

    基于IIS日志的Web攻击检测系统设计与实现

    日志分析对于网站管理员来说是一件非常重要的工作,但对海量的日志进行...文章介绍基于模式匹配的误用检测技术,并描述如何采用此技术设计、实现一种攻击监测系统,以定时对Web日志进行安全分析,提高网站安全管理的效率。

    关于Linux系统中日志文件系统的概述

    众所周知,文件系统是操作系统最为重要的一部分。每种操作系统都有自己的文件系统。文件系统直接影响着操作系统的稳定...Linux下的文件系统通常有两种,即日志文件系统和非日志文件系统,本文将简单介绍两类文件系统。

    slf4j+logback日志系统介绍

    SLF4J(Simple Logging Facade for Java)作为commons-logging的替代,为各种logging APIs提供了一个简单的统一接口,使得最终用户能够在部署的时候配置所希望的logging APIs的实现。

    简单配置log4Net记录系统日志

    这里简单介绍关于如何使用log4Net来开速配置日志记录,很简单

    新闻日志大数据分析及可视化系统的设计与实现.doc

    对系统所使用到的相关技术的原理进行了介绍;对系统进行了总体的需求分析并且按照系统实现的功能划分了相关模块;在进行了需求分析后,对系统进行了具体的硬件平台构建以及各个功能模块设计实现,最终完成对用户搜索...

Global site tag (gtag.js) - Google Analytics