快捷搜索:

编写一个随处可调用的静态日志操作类

日志文件是一个随处都在应用的文件,它可以很好的记录法度榜样的运行状态和掉足信息,险些每一个安装法度榜样都有它的安装文件..在我们用java开拓web项目中,会常常必要记任命户的一些登岸,造访,操作信息.如:一个办公系统,它的日志文件必要记录:

………

Wed May 19 13:35:50 CST 2004:张三登岸了该系统

Wed May 19 13:35:53 CST 2004:张三插入了一条"下周计划"记录 id:1048

Wed May 19 13:35:54 CST 2004:李四登岸了该系统

Wed May 19 13:35:55 CST 2004:张三删除了一条"上周总结"记录, d:1024

Wed May 19 13:35:59 CST 2004:张三退出了该系统

................

实现思路:

1. 为了很好的实现这个记录类,必须要应用”单态”模式,这样该类不必每次调用的时刻都必要天生它的实例,初始化i/o.(这在必然程度上是很消费光阴的).

2. 为了防止多线程同时操作(写)日志文件,造成文件”逝世锁”,必须斟酌同步,应用synchronized关键字.

3. 为了不必关心该类独一实例的天生,而直接应用该类的静态措施实现日志的记录

4. 为了更方便的设置设置设备摆设摆设日志文件的路径,应用属性文件设置设置设备摆设摆设.

废话太多了,不像搞法度榜样的了,直接看代码,所有的注释在代码中阐明:

import java.io.*;

import java.util.*;

public class LogWriter {

private static final String DefalutLogFilePathName="c:logtext.log";//默认的日志文件的路径和文件名称

private static LogWriter logwriter; //该类的独一的实例

private static InputStream fin; //属性设置设置设备摆设摆设文件的输入流

private static Properties pro; //class Properties´s supper is Hashtable class

private static PrintWriter out; //output stream

private static String logFileName; //output file name

private LogWriter() {

outInit();//init out put stream,实例化PrintWriter out 工具.

}

/**保存你想保存在日志文件中的信息,实现同步

* out put the message infomation

* @param message infomation

*/

public static synchronized void log(String message) {

if (logwriter == null || (out == null)){

logwriter = new LogWriter();

}

if (out != null) {

out.println(new java.util.Date() + ":" + message);

}

}

/**把非常信息保存在日志文件中,实现同步

* out put the Excetion infomation

* @param message infomation

*/

public static synchronized void log(Exception ex) {

if (logwriter == null || (out == null))

logwriter = new LogWriter();

if (out != null) {

out.println(new java.util.Date() + ":" );

ex.printStackTrace(out);

}

}

/**

*输出文件流的init

*/

private void outInit() {

if (logFileName == null)

logFileName = getlogFileName(); //从属性文件中类得到日志文件的路径

try {

if (out == null) {//假如输出i/o没有实例,则天生一个信的

out = new PrintWriter(new FileWriter(logFileName, true), true); ; //

//此中的FileWriter()中的第二个参数的含义是:是否在文件中追加内容

}

}

catch (IOException ex) {

System.out.println("无法打开日志文件:"+logFileName);

ex.printStackTrace();

out = null;

}

}

/**

*根据设置设置设备摆设摆设文件.来得到日志文件的位置

*

* @return logFileName

*/

private String getlogFileName() {

try {

if (pro == null) {

pro = new java.util.Properties();

fin = getClass().getResourceAsStream("log.properties"); //在类确当前位置,查找属性设置设置设备摆设摆设文件log.properties

pro.load(fin);//载入设置设置设备摆设摆设文件

fin.close();

}

}

catch (IOException ex) {

System.err.println("无法打开属性设置设置设备摆设摆设文件: log.properties" );

ex.printStackTrace();

}

return pro.getProperty("logfile",DefalutLogFilePathName);

//根据属性值得到日志文件路径,第二个参数是:假如找不到"logfile"标志,就返回的默认值

}

/**你也可以在所有的日志都记录完成的时刻,调用该措施,开释资本.

* free all the resouce,this is secuty method

*/

public void free() {

try {

this.logwriter = null;

if (out != null)

this.out.close();

if (fin != null)

this.fin.close();

}

catch (IOException ex) {

ex.printStackTrace();

}

}

}

●类的详细应用::

1.,把该类编译好, 新建立属性设置设置设备摆设摆设文件:log.properties,并确保把它放倒你的这个编译好的类所在的位置

文件内容如下:当然你可以把路径改动为你想要的路径

logfile=e:logtext.log

2.. 应用举例:

应用1:

LogWriter.log("张三登岸了该系统");

logWriter.log("张三删除了xxx笔记录:记录id:");

应用2:

try{

}

catch (Exception ex) {

LogWriter.log(ex);

}

● 几点阐明:

一.此中的 getClass().getResourceAsStream("文件名称")不支持static的调用,

以是要把该类换为非static,然则它的调用仅仅在于outinit()中调用,而outinit()

也仅仅在私有的构造函数中调用,而私有构造函数可以在静态的static 中被调用,

这样就达到了可以使用静态措施来调用随时输入日志,并包管了仅仅有一个实例

二.假如你懂得log4J的话,可以应用该类似措施,把log4j封装一下,实现静态方便的调用.

三.我同时应用多个线程测试过该类.没有发明问题.由于对java才钻研了一年.假如高手们看出此中的差错或者不够之处,也请多多见示.感谢.详细问题可联:qq:29189725

您可能还会对下面的文章感兴趣: