国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

編寫一個隨處可調(diào)用的靜態(tài)日志操作類

2019-11-18 15:12:11
字體:
供稿:網(wǎng)友

  日志文件是一個隨處都在使用的文件,它可以很好的記錄程序的運(yùn)行狀態(tài)和出錯信息,幾乎每一個安裝程序都有它的安裝文件..在我們用java開發(fā)web項目中,會經(jīng)常需要記錄用戶的一些登陸,訪問,操作信息.如:一個辦公系統(tǒng),它的日志文件需要記錄:
………
Wed May 19 13:35:50 CST 2004:張三登陸了該系統(tǒng)
Wed May 19 13:35:53 CST 2004:張三插入了一條"下周計劃"記錄 id:1048
Wed May 19 13:35:54 CST 2004:李四登陸了該系統(tǒng)
Wed May 19 13:35:55 CST 2004:張三刪除了一條"上周總結(jié)"記錄, d:1024
Wed May 19 13:35:59 CST 2004:張三退出了該系統(tǒng)
................
實現(xiàn)思路:
1. 為了很好的實現(xiàn)這個記錄類,必須要使用”單態(tài)”模式,這樣該類不必每次調(diào)用的時候都需要生成它的實例,初始化i/o.(這在一定程度上是很耗費(fèi)時間的).
2. 為了防止多線程同時操作(寫)日志文件,造成文件”死鎖”,必須考慮同步,使用synchronized要害字.
3. 為了不必關(guān)心該類唯一實例的生成,而直接使用該類的靜態(tài)方法實現(xiàn)日志的記錄
4. 為了更方便的配置日志文件的路徑,使用屬性文件配置.

廢話太多了,不像搞程序的了,直接看代碼,所有的注釋在代碼中說明:
import java.io.*;
import java.util.*;
public class LogWriter {
PRivate static final String DefalutLogFilePathName="c:/logtext.log";//默認(rèn)的日志文件的路徑和文件名稱
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 對象.
}
/**保存你想保存在日志文件中的信息,實現(xiàn)同步
* 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);
}
}
/**把異常信息保存在日志文件中,實現(xiàn)同步
* 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()中的第二個參數(shù)的含義是:是否在文件中追加內(nèi)容
}
}
catch (IOException ex) {
System.out.println("無法打開日志文件:"+logFileName);
ex.printStackTrace();
out = null;
}
}
/**
*根據(jù)配置文件.來獲得日志文件的位置
*
* @return logFileName
*/
private String getlogFileName() {
try {
if (pro == null) {
pro = new java.util.Properties();
fin = getClass().getResourceAsStream("log.properties"); //在類的當(dāng)前位置,查找屬性配置文件log.properties
pro.load(fin);//載入配置文件
fin.close();
}
}
catch (IOException ex) {
System.err.println("無法打開屬性配置文件: log.properties" );
ex.printStackTrace();
}
return pro.getProperty("logfile",DefalutLogFilePathName);
//根據(jù)屬性值獲得日志文件路徑,第二個參數(shù)是:假如找不到"logfile"標(biāo)志,就返回的默認(rèn)值
}
/**你也可以在所有的日志都記錄完成的時候,調(diào)用該方法,釋放資源.
* 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,并確保把它放倒你的這個編譯好的類所在的位置
文件內(nèi)容如下:當(dāng)然你可以把路徑修改為你想要的路徑
logfile=e:/logtext.log
2.. 使用舉例:
使用1:
LogWriter.log("張三登陸了該系統(tǒng)");
logWriter.log("張三刪除了xxx條記錄:記錄id:");
使用2:
try{
}
catch (Exception ex) {
LogWriter.log(ex);
}
● 幾點說明:
一.其中的 getClass().getResourceAsStream("文件名稱")不支持static的調(diào)用,
所以要把該類換為非static,但是它的調(diào)用僅僅在于outinit()中調(diào)用,而outinit()
也僅僅在私有的構(gòu)造函數(shù)中調(diào)用,而私有構(gòu)造函數(shù)可以在靜態(tài)的static 中被調(diào)用,
這樣就達(dá)到了可以利用靜態(tài)方法來調(diào)用隨時輸入日志,并保證了僅僅有一個實例

二.假如你了解log4J的話,可以使用該類似方法,把log4j封裝一下,實現(xiàn)靜態(tài)方便的調(diào)用.

三.我同時使用多個線程測試過該類.沒有發(fā)現(xiàn)問題.因為對java才研究了一年.假如高手們看出其中的錯誤或者不足之處,也請多多賜教.謝謝.具體問題可聯(lián):QQ:29189725

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 龙陵县| 鄂托克旗| 三穗县| 华阴市| 大竹县| 崇文区| 巴中市| 墨玉县| 石家庄市| 长岛县| 封开县| 普安县| 平顶山市| 罗定市| 娱乐| 若羌县| 灵山县| 宣威市| 册亨县| 望谟县| 西贡区| 安图县| 广宁县| 雷州市| 石泉县| 中超| 尚志市| 土默特右旗| 托克托县| 新密市| 资溪县| 彩票| 龙口市| 砚山县| 新密市| 密山市| 秭归县| 三穗县| 潢川县| 桃源县| 乐平市|