Chinaunix首页 | 论坛 | 博客
  • 博客访问: 29334590
  • 博文数量: 2065
  • 博客积分: 10377
  • 博客等级: 上将
  • 技术积分: 21525
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-04 17:50
文章分类

全部博文(2065)

文章存档

2012年(2)

2011年(19)

2010年(1160)

2009年(969)

2008年(153)

分类: Java

2010-03-25 22:43:33

Java配置日志整理[完整版]

[整理人:遥方  整理时间:2010-3-25]

之前有过整理不过感觉有点乱。现在整理出来以后直接使用!以后不会再出现类似于之前那样的整理文章了。自己现在看都很难看得明白了!

框架:Java Logging API

第一个日志输出:

package cn.ty.server;

import java.util.logging.Level;

import java.util.logging.Logger;

public class Test {

    public static void main(String[] args) {

       Logger logger1 = Logger.getAnonymousLogger();

       System.out.println("a");

       logger1.log(Level.INFO,"第一条日志记录");

    }

}

输出:

a

2010-3-25 21:06:14 cn.ty.server.Test main

信息: 第一条日志记录

 

Java Logging捕获操作系统平台和执行程序的安全故障、配置错误、执行瓶颈和(或)Bug

等数据信息,以纯文本、XML或程序员自定的某种方式将其格式化成 日志记录,然后

传递给内存、系统输出流、控制台、文件、Sockets等多种系统资源进行缓存和输出。

 

心得:从这句话可以知道Logging可以捕获到故障、配置错误、瓶颈异常等 以文本、XML的形式

保存到文件或数据库等。

 

一、输出的种类
Java Logging API
提供了七个级别用来控制输出。这七个级别分别是:
SEVERE (
最高级别)
WARNING
INFO
CONFIG
FINE
FINER
FINEST (
最低级别)

 

二、与上面的输出种类相对应的具有七种输出方法

log.severe("severe level");// <= (1)
log.warning("warning level");// <= (2)
log.info("info level");// <= (3)
log.config("config level");// <= (4)
log.fine("fine level");// <= (5)
log.finer("finer level");// <= (6)
log.finest("finest level");// <= (7)
 
 
三、变更日志输出的级别
默认为info级别!
变更输出级别的方法有两种:一是使用外部配置文件,二是使用程序编码。通常都是使用第一种方法。缺省的外部配置文件是JRElib/logging.properties文件。你可以打开这个文件,修改以下两行为: 
.level= ALL
java.util.logging.ConsoleHandler.level = ALL
PS在哪打开?我怎么找不到此文件?
找到了:C:\Program Files\Java\jre1.6.0_07\lib 里面有这个文件
默认为:
.level= INFO
java.util.logging.ConsoleHandler.level = INFO
默认为INFO级别。你可以修改它们过来
 
四、自定义日志配置文件
如果你不想使用系统提供的缺省配置文件lib/logging.properties,那么也可以使用自己定义的
配置文件。使用自定义配置文件的方法有很
多种,比较方便的方法是通过定义系统属性值
java.util.logging.config.file
来设置自定义配置文件。
 
疑点:对于配置文件不是很了解哦!
 
五、API理解

写一个日志流程可以是,创建一个Logger,可以放入LogManager统一管理,程序写入日志,Logger会先调用Logger中的 Filter进行过滤,过滤后的日志送入Handler,在经过Handler中的Filter过滤,随后调用Handler中的Fomatter进行格 式化,最终输出日志。

如果还有其他的Handler,日志将会继续流动。在该Logger所有Handler处理过后,

会依照继承层次,向上传递消息,并 进行同上的处理。


LogManager
只有一个实例,用来管理Logger,用来统一设置Logger的属性,还可以设置属性变化时的监听器。(管理用的)

Logger
用来记录日志的类,日志分为不同的级别,并可以设置什么级别以上需要记录,具体的设置可以

在运行时设置,也可以在配置文件中设置,配置文件位于 jre/lib/logging.properties

(记录日志用的)

Logger继承层次
当创建Logger时,会输入一个名字,名字类似包名 soulxu.myloggersoulxu则是

mylogger的父日志,根日志是“”,子日志输入的日志会延继承层次向上传。(子日志会上传到

父日志中去)

Level
消息级别,该类封装了一些常量,用来表示不同的级别,在LoggerHandler中都有setLevel方法,设置级别,他们会按照设置的级别对消息进行过滤。

管理消息报警级别用的!

Handler
用来决定日志的去向,库中提供了ConsoleHandler, FileHandler, MemoryHandler, SocketHandler, StreamHandler,每个日志可以添加多个Handler,消息按顺序传递,

这好像算监听者模式!?
其中MemoryHandler比较特殊,他是个内存回环,可以设置一个数量值,当超过这个值,

最老的日志将会丢失,并且还可以连接一个Handler 其后接收日志。

[处理器]

Filter
是个借口,一个过滤器,可以自己实现该接口,isLoggalbe(LogRecord),该方法返回true

表示可以被记录下来,参数 LogRecord是对每一条日志的封装

Formatter[设置消息格式用的]
是在Handler中对日志进行格式化,最后由Handler输出

 
六、对以上的API的理解代码

public class Test {

    public static void main(String[] args) {

       LogManager lm = LogManager.getLogManager();

       Logger logger;

       try {

           FileHandler handler = new FileHandler("text.txt");

           logger = Logger.getLogger("instance");

           lm.addLogger(logger);

           logger.setLevel(Level.INFO);

           handler.setFormatter(new XMLFormatter());

           logger.addHandler(handler);     //至此配置LOG完毕

           logger.log(Level.INFO,"test1");

           logger.log(Level.INFO,"test1");

           logger.log(Level.INFO,"test1");

           logger.log(Level.INFO,"test1");

           handler.close();

       } catch (SecurityException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       } catch (IOException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       }

      

    }

}

 

七、整理完成的日志类

import java.io.IOException;

import java.util.logging.ConsoleHandler;

import java.util.logging.Formatter;

import java.util.logging.FileHandler;

import java.util.logging.Level;

import java.util.logging.LogManager;

import java.util.logging.LogRecord;

import java.util.logging.Logger;

import java.util.logging.StreamHandler;

import java.util.logging.XMLFormatter;

import java.util.regex.Matcher;

import java.util.regex.Pattern;

 

/**

 * 调用示例:new LogTool().deblog(e.toString());

 * */

class LogTool {

    /**

    *ses: -Basics/Createlogwithpackagename.htm

    *CopyRright (c)2010-03:   自定义格式处理器类               

    *Comments:                捕获带有Except的信息                                  

    *JDK version used:                                   

    *Create Date               <2010-03-25>

    *Version:                   <1.0>                     

    */

    class CustomFormatter extends Formatter {

         public synchronized String format(LogRecord record) {

           String methodName = record.getSourceMethodName();

           String message = record.getMessage();

           String err = "";

           int exceptionIndex = message.indexOf("Exception");

           if (exceptionIndex > -1) {

             Pattern pattern = Pattern.compile("(.*Exception.*)");

 

             Matcher matcher = pattern.matcher(message);

 

             if (matcher != null && matcher.find()) {

               err = "EXCEPTION:" + matcher.group(1);

             }

           }

           StringBuffer buffer = new StringBuffer(100);

           buffer.append(methodName);

           buffer.append("=");

           buffer.append(err);

           buffer.append("\n");

           return buffer.toString();

         }

    }

    public  void deblog(String content) {

       LogManager lm = LogManager.getLogManager();

       Logger logger = null;

       try {

           FileHandler handler = new FileHandler("syslog.txt",1000,1,true);

           logger = Logger.getLogger(Test.class.getPackage().getName());

           lm.addLogger(logger);

           handler.setFormatter(new CustomFormatter());

           logger.addHandler(handler);

           logger.addHandler(new ConsoleHandler());

           logger.log(Level.INFO,content);

           handler.close();

       } catch (SecurityException e) {

           e.printStackTrace();    

       } catch (IOException e) {

           e.printStackTrace();    

       }

    }

}

阅读(933) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~