- 浏览: 409256 次
- 性别:
- 来自: 秦皇岛
最新评论
-
prayjourney:
了解了,讲的不错
DataInputStream和DataOutputStream类 -
niunianss:
将字节退回的时候,需要添加判断,最后一个字符是英文时,实际数组 ...
PushbackInputStream -
cctt_1:
不要误人子弟,那根本就不是 解释器模式!!!那是Composi ...
Interpreter(解释器)模式 -
java-大神:
[i][i]引用引用引用引用[/img][/img][/img ...
BufferedReader和BufferedWriter -
百合不是茶:
你的程序在文件输入输出流中传入agrs[0]时,会报错越界 ...
DataInputStream和DataOutputStream类
1. 日志(Logging)
程序不免会出现错误,当出现错误时,可能会想将错误信息以某种方式存储下来,以供使用者或是程序开发人员调试(Debug)时使用。java.lang.logging包提供了一系列的logging工具类,如果只是要简单地记录一些信息,就可以使用这些工具类。
要使用J2SE的日志功能,首先要取得java.util.logging.Logger实例,这可以通过Logger类的静态getLogger()方法来取得。如下例,当程序在启动时没有提供参数时会显示警示信息:
package ysu.hxy; import java.util.logging.*; public class LoggingDemo { public static void main(String[] args) { Logger logger = Logger.getLogger("LoggingDemo"); try { System.out.println(args[0]); } catch(ArrayIndexOutOfBoundsException e) { logger.warning("没有提供执行时的自变量!"); } } }
执行结果:
D:\Java_Test>java ysu.hxy.LoggingDemo
2009-4-7 15:41:43 ysu.hxy.LoggingDemo main
警告: 没有提供执行时的自变量!
2.Logging的等级:
在进行信息的记录时,依信息程序的不同,会设定不同等级的信息输出。可以通过操作Logger上的几个方法来得到不同等级的信息输出。如下列范例:
package ysu.hxy; import java.util.logging.*; public class LoggingLevelDemo { public static void main(String[] args) { Logger logger = Logger.getLogger("loggingLevelDemo"); logger.severe("严重信息"); logger.warning("警示信息"); logger.info("一般信息"); logger.config("设定方面的信息"); logger.fine("细微的信息"); logger.finer("更细微的信息"); logger.finest("最细微的信息"); } }
运行结果:
D:\Java_Test>java ysu.hxy.LoggingLevelDemo
2009-4-7 15:50:43 ysu.hxy.LoggingLevelDemo main
严重: 严重信息
2009-4-7 15:50:43 ysu.hxy.LoggingLevelDemo main
警告: 警示信息
2009-4-7 15:50:43 ysu.hxy.LoggingLevelDemo main
信息: 一般信息
此示例中config()方法及以下的信息并没有显示出来,这是因为Logger的默认等级是INFO,比这个等级更低的信息,Logger并不会将信息输出。
Logger的默认等级是定义在执行环境的属性文件logging.properties中,这个文件位于JRE安装目录的lib目录下。部分内容如下:
handlers = java.util.logging.ConsoleHandler
.level = INFO
java.util.logging.ConsoleHandler.level = INFO
Logger默认的处理者(Handler)是java.util.logging.ConsolerHandler,也就是将信息输出至命令行模式。一个Logger可以拥有多个处理者,每个处理者可以有自己的信息等级,在通过Logger的等级限制后,实际上还要再经过处理者的等级限制。所以在上面的范例中如果想要看到所有的信息,则必须同时设定Logger与ConsoleHandler的等级。下面的范例示范了如何设定:
package ysu.hxy; import java.util.logging.*; public class LoggingLevelDemo2 { public static void main(String[] args) { Logger logger = Logger.getLogger("loggingLevelDemo2"); //显示所有等级的信息 logger.setLevel(Level.ALL); ConsoleHandler consoleHandler = new ConsoleHandler(); //显示所有等级的信息 consoleHandler.setLevel(Level.ALL); //设定处理者为ConsoleHandler logger.addHandler(consoleHandler); logger.severe("严重信息"); logger.warning("警示信息"); logger.info("一般信息"); logger.config("设定方面的信息"); logger.fine("细微的信息"); logger.finer("更细微的信息"); logger.finest("最细微的信息"); } }
运行结果:
D:\Java_Test>java ysu.hxy.LoggingLevelDemo2
2009-4-7 16:02:10 ysu.hxy.LoggingLevelDemo2 main
严重: 严重信息
2009-4-7 16:02:10 ysu.hxy.LoggingLevelDemo2 main
严重: 严重信息
2009-4-7 16:02:10 ysu.hxy.LoggingLevelDemo2 main
警告: 警示信息
2009-4-7 16:02:10 ysu.hxy.LoggingLevelDemo2 main
警告: 警示信息
2009-4-7 16:02:10 ysu.hxy.LoggingLevelDemo2 main
信息: 一般信息
2009-4-7 16:02:10 ysu.hxy.LoggingLevelDemo2 main
信息: 一般信息
2009-4-7 16:02:10 ysu.hxy.LoggingLevelDemo2 main
配置: 设定方面的信息
2009-4-7 16:02:10 ysu.hxy.LoggingLevelDemo2 main
良好: 细微的信息
2009-4-7 16:02:10 ysu.hxy.LoggingLevelDemo2 main
较好: 更细微的信息
2009-4-7 16:02:10 ysu.hxy.LoggingLevelDemo2 main
最好: 最细微的信息
Level.ALL表示显示所有的信息,所有这一次的执行结果可显示所有等级的信息。如果要关闭所有的信息,可以设定为Level.OFF.Logger的Severe(),warning(),info()等方法,实际上是个便捷的方法。也可以直接使用log()方法并指定等级来执行相同的作用。
package onlyfun.caterpillar; import java.util.logging.*; public class LoggingLevelDemo3 { public static void main(String[] args) { Logger logger = Logger.getLogger("loggingLevelDemo3"); logger.setLevel(Level.ALL); ConsoleHandler consoleHandler = new ConsoleHandler(); consoleHandler.setLevel(Level.ALL); logger.addHandler(consoleHandler); logger.log(Level.SEVERE, "严重信息"); logger.log(Level.WARNING, "警示信息"); logger.log(Level.INFO, "一般信息"); logger.log(Level.CONFIG, "设定方面的信息"); logger.log(Level.FINE, "细微的信息"); logger.log(Level.FINER, "更细微的信息"); logger.log(Level.FINEST, "最细微的信息"); } }
3.Handler和Formatter
Logger默认的输出处理者是ConsoleHandler。ConsoleHandler的输出是使用System.err对象,而信息的默认等级是INFO,这可以在JRE安装目录下lib目录的logging.properties中看到:
handlers = java.util.logging.ConsoleHandler
java.util.logging.ConsoleHandler.level = INFO
J2SE提供了5个默认的Handler:
(1) java.util.logging.ConsoleHandler 以System.err输出日志。
(2) java.util.logging.FileHandler 将信息输出到文件。
(3) java.util.logging.StreamHandler 以指定的OutputStream实例输出日志。
(4) java.util.logging.SocketHandler 将信息通过Socket传送至远程主机。
(5) java.util.logging.MemoryHandler 将信息暂存在内存中。
以下代码将信息输出至文件中:
package ysu.hxy; import java.io.IOException; import java.util.logging.*; public class HandlerDemo { public static void main(String[] args) { Logger logger = Logger.getLogger("handlerDemo"); try { FileHandler fileHandler = new FileHandler("%h/myLogger.log"); logger.addHandler(fileHandler); logger.info("测试信息"); } catch (SecurityException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
执行的结果会在命令行模式显示信息,并将结果输出至文件中。%h表示使用者的根目录(c:\document and settings\hexinyu目录中)。%t可以取得系统的暂存目录,%g自动为文件编号。例如可以设定为%h/myLogger%g.log,表示将.log文件存储在使用者根目录中,并自动为每个文件增加编号。此范例输出的文件内容如下:
<?xml version="1.0" encoding="GBK" standalone="no"?> <!DOCTYPE log SYSTEM "logger.dtd"> <log> <record> <date>2009-04-07T16:31:02</date> <millis>1239093062781</millis> <sequence>0</sequence> <logger>handlerDemo</logger> <level>INFO</level> <class>ysu.hxy.HandlerDemo</class> <method>main</method> <thread>10</thread> <message>测试信息</message> </record> </log>
fileHandler默认的输出格式是XML格式,输出格式由java.util.logging.Formatter来控制。例如FileHandler的默认格式是java.util.logging.XMLFormatter, 而ConsolerHandler的默认格式是java.util.logging.SimpleFormatter,可以使用Handler实例的setFormatter()方法来设定信息的输出格式。例如:
fileHandler.setFormatter(new SimpleFormatter());
如果FileHandler的Formatter设定为SimpleFormatter,则输出的日志文件内容就是简单的文字信息,打开文件后会发现与命令行模式下看到的信息内容相同。
4. 自定义Formatter
除了XMLFormatter与SimpleFormatter之外,也可以自定义日志的输出格式,只要继承抽象类Formatter,并重新定义其format()方法即可。format()方法会传入一个java.util.logging.LogRecord对象作为参数,可以使用它来取得一些与程序执行有关的信息。如下示例中自定义了一个简单的TableFormatter。
package ysu.hxy; import java.util.logging.*; public class TableFormatter extends Formatter { public String format(LogRecord logRecord) { return "LogRecord info:" + logRecord.getSourceClassName()+"\n" + "Level\t|\tLoggerName\t|\tMessage\t|\n"+ logRecord.getLevel() +"\t|\t"+ logRecord.getLoggerName() + "\t|\t" + logRecord.getMessage() + "\t|\n\n"; } }
自定义好Formatter之后,就可以使用Handler实例的setFormatter()方法设定Formatter对象,如下列代码所示:
package ysu.hxy; import java.util.logging.*; public class TableFormatterDemo { public static void main(String[] args) { Logger logger = Logger.getLogger("tableFormatter"); try { for(Handler h : logger.getParent().getHandlers()) { if( h instanceof ConsoleHandler) { h.setFormatter(new TableFormatter()); } } logger.info("信息1"); logger.warning("信息2"); } catch (SecurityException e) { e.printStackTrace(); } } }
您取得默认的根(Root)Logger,并判断出其不意ConsoleHandler实例,之后设定ConsoleHandler实例的Formater为自定义的TableFormatter。执行结果如下所示:
D:\Java_Test>java ysu.hxy.TableFormatterDemo
LogRecord info:ysu.hxy.TableFormatterDemo
Level | LoggerName | Message |
INFO | tableFormatter | 信息1 |
LogRecord info:ysu.hxy.TableFormatterDemo
Level | LoggerName | Message |
WARNING | tableFormatter | 信息2 |
5. Logger层次关系
在使用Logger的静态getLogger()方法取得Logger实例时,给getLogger()方法的名称是有意义的。如果给定ysu,实际上将从根(Root)logger继承一些特性,像日志等级(Level)以及根logger的处理者。如果再取得一个Logger实例,并给定名称ysu.hxy,则这次取得的Logger将继承ysu这个Logger上的特性。从以下范例可以看出Logger在名称上的继承关系:
package ysu.hxy; import java.util.logging.*; public class LoggerHierarchyDemo { public static void main(String[] args) { Logger onlyfunLogger = Logger.getLogger("ysu"); Logger caterpillarLogger = Logger.getLogger("ysu.hxy"); System.out.println("root logger:"+onlyfunLogger.getParent()); System.out.println("onlyfun logger:" + caterpillarLogger.getParent().getName()); System.out.println("caterpillar Logger:" + caterpillarLogger.getName() + "\n"); onlyfunLogger.setLevel(Level.WARNING); caterpillarLogger.info("caterpillar ' info"); caterpillarLogger.setLevel(Level.INFO); caterpillarLogger.info("caterpillar ' info"); } }
getParent()方法可以取得Logger上的上层父Logger,根Logger并没有名称,所以直接调用它的toString()以取得字符串描述。当Logger没有设定等级时,则使用父Logger的等级设定,所以在上面的范例中,onlyfunLogger设定等级为WARNING时,caterpillarLogger调用info()方法时并不会有信息显示(因为WARNING等级比INFO高)。只有在caterpillarLoger 设定了自己的等级为INFO之后,才会显示信息。执行结果如下:
D:\Java_Test>java ysu.hxy.LoggerHierarchyDemo
root logger:java.util.logging.LogManager$RootLogger@757aef
onlyfun logger:ysu
caterpillar Logger:ysu.hxy
2009-4-7 17:19:20 ysu.hxy.LoggerHierarchyDemo main
信息: caterpillar ' info
在每个处理者方面,当每个Logger处理完自己的日志动作之后,它会向父Logger 传播,让父Logger的处理者也可以处理日志。例如root logger的处理者是ConsoleHandler,所以若子Logger加入了FileHandler来处理完日志之后,向上传播至父Logger,会再由ConsolerHandler来处理,故同样会在命令行模式上显示信息。之前的范例就是这样的例子。
发表评论
-
内部类总结
2009-11-27 14:28 1222一、方法及作用域内的内部类:1.在一个方法内定义的类2.在一个 ... -
finalize()方法终结条件验证 示例代码
2009-09-20 09:23 1348package Initialization; clas ... -
Proxy(代理)模式二
2009-05-15 21:16 15532. 重新思考图像代理: 现在需要思考设计模式是否 ... -
Junit简介
2009-04-08 17:46 16491. 单元测试(Unit Test) 一个单元(Un ... -
Ant简介
2009-04-08 13:10 18531. Ant可以自动完成的任务: (1)编译Java源代 ... -
专题制作--文字编辑器(文字编辑与保存)
2009-04-08 10:43 22151. 文字编辑与保存: (1). 打开文件的处理流 ... -
专题制作--文字编辑器(逻辑实现部分)
2009-04-07 22:35 19061. 事件处理: 在Java中事件以具体的对象来表 ... -
专题制作--文字编辑器(接口部分)
2009-04-07 20:28 21491. Swing入门: 若要使用J2SE来开发窗口应用 ... -
信息绑定(国际化处理)
2009-04-07 20:02 15841. 程序中的一些文字信息可以将之定义在一个属性文件中,而不定 ... -
Java中的日期和时间
2009-04-07 11:26 19581. 使用Date: 使用System.cu ... -
meta-annotation
2009-04-07 09:23 30811. 所谓meta-annotation就是Annotati ... -
Annotion
2009-04-06 23:05 16831. Annotation对程序运行没有影响,它的目的在于对编 ... -
使用反射生成与操作对象(二)
2009-04-06 17:04 17561. 修改成员值: 尽管直接存取类的域成员是不被鼓励的 ... -
使用反射生成与操作对象(一)
2009-04-06 15:16 21091. 使用反射机制,可以在运行时期动态加载类并生成对象,操作对 ... -
Java中的反射(二)
2009-04-06 10:42 20761. 当在命令行模式下执行java XXX.class 指令后 ... -
Java中的反射(一)
2009-04-06 09:43 13921. Java提供的反射机制允许您在运行时动态加载类、查看类信 ... -
容器类的线程安全及ThreadLocal类
2009-04-05 21:28 30571. 容器类默认没有考虑 ... -
wait()和notify()
2009-04-05 19:06 13711. wait()、notify()、notifyAll() ... -
Java线程之同步化(Synchronized)主题
2009-04-05 16:44 27141. 如果一个对象所持有的数据可以被多线程同时共享存取,必须 ... -
Java线程(三)
2009-04-05 15:37 18921. Java中的每个线程都 ...
相关推荐
一个完美控制日志输出的工具类
"MyBatis源码分析之日志logging详解" MyBatis源码分析之日志logging详解是MyBatis框架中一个非常重要的组件,它提供了日志记录功能,帮助开发者更好地了解系统的运行情况。在MyBatis源码中,日志logging是通过...
Python 的 `logging` 模块是用于记录程序运行过程中各种事件的重要工具,它提供了一种标准的方法来输出不同级别的日志信息,包括调试(debug)、信息(informational)、警告(warnings)、错误(error)和严重错误...
本文实例讲述了python日志logging模块使用方法。分享给大家供大家参考,具体如下: 一、从一个使用场景开始 开发一个日志系统, 既要把日志输出到控制台, 还要写入日志文件 import logging # 创建一个logger ...
本文实例讲述了Python同时向控制台和文件输出日志logging的方法。分享给大家供大家参考。具体如下: python提供了非常方便的日志模块,可实现同时向控制台和文件输出日志的功能。 #-*- coding:utf-8 -*- import ...
本文实例讲述了Python 日志logging模块用法。分享给大家供大家参考,具体如下: demo.py(日志,输出到控制台): import logging # 导入logging模块 # 日志级别默认是WARNING logging.basicConfig(level=logging....
### Python中日志logging模块的性能及多进程详解 #### 前言 在Python开发过程中,特别是编写后台任务或长时间运行的服务时,记录程序运行状态及错误信息变得尤为重要。Python标准库中的`logging`模块提供了强大的...
### Python日志输出——Logging模块浅析与使用 #### 概述 日志记录是软件开发中的重要组成部分,它能够帮助开发者追踪程序运行时的状态、调试错误以及进行性能分析等。在Python中,`logging`模块是进行日志管理的...
Python零基础速成班,适用于入门或初级学习人群,采用Jupyter Notebook原装教程,.ipynb格式拷贝到Jupyter Notebook目录下即可运行,网页交互式可视化Python编程,全中文注解,下载即用,对初学者非常友好,也可作为...
Python的logging模块是用于生成日志的标准库,它在软件开发中扮演着至关重要的角色,尤其是在大型项目中,因为这些项目往往需要详细记录程序运行时的状态以便于调试和故障排查。logging模块支持多种级别的日志记录,...
Python的logging模块是用于日志记录的标准库,其功能强大且灵活,适用于各种规模和类型的项目。logging模块提供了丰富的功能,包括定义不同的日志级别、处理日志输出、过滤不必要的日志信息以及自定义日志格式,使得...
通过合理地配置`logging`模块,可以将日志信息输出到控制台、文件或其他地方,对于调试、维护和优化软件具有重要意义。 #### 二、Python logging 的作用 1. **调试和跟踪**:在开发过程中,通过记录关键位置的日志...
实现了简单版本的logging.config,支持一般的通过config文件进行配置。感觉还有更好的方法,是直接利用logging.config.fileConfig(log_config_file)方式读进来之后,通过修改handler方式来进行修改。 复制代码 代码...
在Python编程中,logging模块是用于生成日志的标准库,它提供了灵活的日志记录功能,包括不同级别的日志(如DEBUG、INFO、WARNING、ERROR、CRITICAL)以及日志输出到控制台、文件或其他处理器的能力。然而,有时我们...
"Common Logging"是一个针对C#的开源日志接口,它的主要目的是提供一个统一的日志API,使得开发者能够在不改变代码基础的情况下,轻松切换不同的日志实现。这样可以避免在不同项目或组件中重复开发日志接口,提高...