靜態日誌操作類

 

import java.io.*;
import java.util.*;

/**
 * 類的具體使用:
 *
 * 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封裝一下,實現靜態方便的調用.
 *
 * <p>Title: 靜態日誌操作類</p>
 * <p>Description: </p>
 * <p>Copyright: Copyright (c) 2004</p>
 * <p>Company: </p>
 * @author Hanic
 * @version 1.0
 */

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 ex
   */

  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();
    }
  }
}

發佈了5 篇原創文章 · 獲贊 0 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章