告别System.out.print()—J2SDK1.4新增Java日志框架(三)

原创 2003年02月05日 19:35:00

2003-1-15 7:02:04 LoggingLevelTest main<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

信息: INFO级消息

 

可以看出,优先级低于INFO的日志消息不被记录。

Level的构造函数为protected便于程序员开发自己的消息级别类。

 

import java.util.logging.*;

//自定义消息级别

class myLevel extends Level{

//定义自己的消息级别SYSE

public static final Level SYSE = new myLevel("SYSE", Level.SEVERE.intValue()+10);

    public myLevel(String ln,int v) {

        super(ln,v);

    }

}

public class MyLevelTest {

public static void main(String args[]) {

    Logger logger1 = Logger.getAnonymousLogger();     

    //设置消息级别

    logger1.setLevel(myLevel.SYSE);

    //记录消息

    logger1.log(myLevel.SYSE,"SYSE消息");

    logger1.severe("SVERE消息");

}

}  

                           实例4

 

运行结果:

           

2003-1-15 15:40:04 MyLevelTest main

SYSE: SYSE消息

 

只有SYSE消息被记录,SVERE消息不被记录,因为自定义级别SYSE高于SEVERE.

    (五)Formatter

Formatter负责对LogRecords进行格式化。每个记录处理器Handler同一个Formatter对象相关联。Formatter对象接收从Handler传来的LogRecord,将其格式化成字符串后返回给Handler进行输出。

Formatter是一个抽象类。J2SDK1.4中,其子类及它们之间的关系见图二。

自定义扩展Formatter类。实例:MyFormatterTest.java

 

import java.util.Date;

import java.util.logging.*;

 

//创建每条日志记录以行的日志格式:

//时间<空格>消息级别<空格>消息ID<空格>日志信息内容<换行>

class MyFormatter extends Formatter {

       

       public String format(LogRecord rec) {

              StringBuffer buf = new StringBuffer(1000);

        buf.append(new Date().toLocaleString()); //时间

        buf.append(' ');

        buf.append(rec.getLevel()); //消息级别

        buf.append(' ');

        buf.append(rec.getMillis()); //作为消息ID

        buf.append(' ');

        buf.append(formatMessage(rec));//格式化日志记录数据

        buf.append('/n');    //换行

        return buf.toString();

    }      

}

 

public class MyFormatterTest {

       public static void main(String args[]){

              //创建记录器

Logger log1 = Logger.getLogger("MyLogger");

              //创建记录处理器

Handler mh = new ConsoleHandler();

//为记录处理器设置Formatter

              mh.setFormatter(new MyFormatter());

              //为记录器添加记录处理器

log1.addHandler(mh);

//禁止消息处理将日志消息上传给父级处理器

              log1.setUseParentHandlers(false);

              //记录消息

              log1.severe("消息1");

              log1.warning("消息2");

              log1.info("消息3");

              log1.config("消息4");

       }

}

                   实例5

程序运行结果:

 

2003-1-15 16:59:38 SEVERE 1042621178968 消息1

2003-1-15 16:59:40 WARNING 1042621178985 消息2

2003-1-15 16:59:41 INFO 1042621179105 消息3

 

三、配置文件

   J2SDK1.4的Java Logging框架的配置文件(Windows):

%J2SDK1.4_HOME%/jre/lig/logging.properties

    从配置文件可以看到:

(一) 自定义日志配置文件:

java -Djava.util.logging.config.file=myfile

    (二)全局Handler在Java VM启动时被加载。

(二) 全局Handler默认为java.util.logging.ConsoleHandler。

handlers= java.util.logging.ConsoleHandler

所以我们的任何日志记录动作都会在控制台进行显示。

(三) 缺省的消息记录级别为:INFO

.level= INFO 

在缺省情况下我们在控制台看不见低于INFO级别的日志消息。

(四) 缺省的Handler消息格式为java.util.logging.SimpleFormatter

 

四、日志框架在程序测试中的应用

    Logger类提供了两个的方法:Logger.entering() ogger.exiting() 。这对我们调试自己的方法调用提供了便利的方式。

    例子:

    记录方法调用的输入参数和输出参数 方法myMethod将一个int 追加在一个对象之后。

运行该程序应将logging.properties的

java.util.logging.ConsoleHandler.level = INFO

改为:

java.util.logging.ConsoleHandler.level = ALL

 

import java.util.logging.*;

public class MyClass {

        public String myMethod(int p1, Object p2) {

            Logger logger = Logger.getLogger("com.mycompany.MyClass");

            if (logger.isLoggable(Level.FINER)) {

                logger.entering(this.getClass().getName(), "myMethod",

                                new Object[]{new Integer(p1), p2});

            }

            String tmp = p2.toString() + p1;

 

            if (logger.isLoggable(Level.FINER)) {

                logger.exiting(this.getClass().getName(), "myMethod", tmp);

            }

            return tmp;

        }

        

        public static void main(String args[]) {

            MyClass mc = new MyClass();

            String rslt = mc.myMethod(123,"Hello");

           

        }

}

 

后记

       J2SDK1.4引入的日志记录框架为构建简易的日志记录系统提供了便利的解决方案。虽然还有期它的一些专用日志包如Log4j,但从简单的打印输出到严密的、可扩展的日志记录框架,J2SDK1.4的日志系统已经足以满足一般的系统开发的要求。

分布式日志收集系统:Flume

Flume知识点:Event 是一行一行的数据 1.flume是分布式的日志收集系统,把收集来的数据传送到目的地去。 2.flume里面有个核心概念,叫做agent。agent是一个java进程...
  • u013067629
  • u013067629
  • 2015年05月30日 18:37
  • 2268

Java常用的日志框架对比和深入分析

java常用日志框架的梳理总结,Log4j、Log4j2、Logback、SLF4j、Commons-Logging
  • k1280000
  • k1280000
  • 2017年03月24日 00:40
  • 2213

JAVA日志框架

1、日志框架 提供日志调用的接口,实际的日志输出委托给日志系统实现。 JCL(Jakarta Commons Logging):比较流行的日志框架,很多框架都依赖JCL,例如Spring等。 S...
  • HEYUTAO007
  • HEYUTAO007
  • 2015年11月06日 16:40
  • 3083

Java日志框架介绍

概述 在刚接触日志框架时,被很多日志框架搞的头晕,下面将整体介绍下当前流行的开源日志框架,并重点介绍log4j的日志输出原理及配置指导 日志框架 简介 参考 JUL JDK自带日志框架(j...
  • junefsh
  • junefsh
  • 2015年02月28日 16:49
  • 947

Java常用日志框架及实现

Java常用日志框架及实现 作者:雨水,日期:2015-12-16,CSDN博客: http://blog.csdn.net/gobitan 概述 本文简单介绍了一下Java的日志框架,包括接口...
  • gobitan
  • gobitan
  • 2015年12月16日 09:32
  • 4198

Java开源日志框架介绍

在大型应用系统中,日志是不可缺少的重要组成部分,所有的应用的出错信息等都应该能在日志文件中查找到,有的应用系统日志可能数量很小,有的庞大的应用系统的日志是相当庞大,同时日志文件必须是方便用户定制和查找...
  • FX_SKY
  • FX_SKY
  • 2014年02月20日 12:01
  • 1607

Java日志框架梳理-Java日志框架总览

常见的Java日志框架 log4j logback j.u.l (java.util.logging) 常见的Java日志门面 SLF4J commons-logging 其中,j.u.l是Java...
  • xktxoo
  • xktxoo
  • 2017年07月29日 22:58
  • 664

java 日志框架日志系统关系详解

java 日志框架日志系统关系详解 刚刚接触java的日志框架和日志系统时,完全搞不清楚他们之间的关系,也不是很清楚,自己使用的具体是哪种框架那种系统。今天好好总结一下他们之间的...
  • a724888
  • a724888
  • 2017年05月22日 12:01
  • 815

java日志框架,Log4j配置全攻略

1. 配置文件 Log4J配置文件的基本格式如下:   #配置根Logger log4j.rootLogger  =   [ level ]   ,  appenderName1 ,  appende...
  • han_huayi
  • han_huayi
  • 2015年06月12日 13:41
  • 812

各个日志框架之间的关系

可以看出,实际上commons-logging和slf4j都是日志的接口,供用户使用,而没有提供实现。                   log4j,logback等才是日志的真正实现       ...
  • cpf2016
  • cpf2016
  • 2015年05月30日 22:00
  • 367
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:告别System.out.print()—J2SDK1.4新增Java日志框架(三)
举报原因:
原因补充:

(最多只允许输入30个字)