分檔規則是將log分年,月記錄,每天一個log檔,日子一久想查某一天的log也比較方便。
例如:2009年10月11月有log時,log分檔會像這樣。
- /2009/10/
- 1.log
- 2.log
- 3.log
- 5.log
- ......
- /2009/11/
- 1.log
- 2.log
- 3.log
- .....
Log class
/*
* Log.java with encode
* for logging
*
* Created on 2009年10月16日
*
* @author Iden
*
****<< Modification Note >>
* Date PTS/PBR/PCR Label Editor Description
* ========== =============== ========== ========== ============================================================
* 2009/10/16 0.0.0.1 Iden create
*/
package com.iden.util;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.nio.charset.Charset;
import java.nio.charset.CharsetEncoder;
import java.text.SimpleDateFormat;
public class Log {
private String filePath = ""; //directory path of Log
private String filePrefix = ""; //prefix name of log file
private String fileSubName = ""; //subname of log file
String curWorkingDir = System.getProperty("user.dir"); //User working directory
private String breakLine="\n";
private Object encoding;
private String encodingStr;
public Log(String path) {
this(path, "log", "UTF-8");
}
public Log(String path, String subname, Object encoding) {
this(path, "Log", subname, encoding);
}
public Log(String path, String prefix, String subname, Object encoding) {
if(encoding ==null)
new Exception("encoding is empth");
filePath = path;
filePrefix = prefix;
fileSubName = subname;
this.encoding = encoding;
}
/**
* Output the log file
* @param str
*/
public void write(String str) {
OutputStream stream = null;
Writer writer = null;
SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
try {
String folder = generateDirectory();
File file = new File(folder + filePrefix + "_" + getCurrYYYYMMDD() + "." + fileSubName);
StringBuffer sb = new StringBuffer("");
sb.append("[" + formatter.format(new java.util.Date()) + "] [start]" + breakLine)
.append(str)
.append(breakLine + "[end]" + breakLine);
stream = new FileOutputStream(file, true);
if (encoding instanceof Charset) {
writer = new OutputStreamWriter(stream, (Charset)encoding);
} else if (encoding instanceof CharsetEncoder) {
writer = new OutputStreamWriter(stream, (CharsetEncoder)encoding);
} else {
writer = new OutputStreamWriter(stream, (String)encoding);
}
OutputStreamWriter osw =(OutputStreamWriter)writer;
encodingStr = osw.getEncoding();
osw = null;
writer.write(sb.toString());
writer.flush();
writer.close();
} catch (java.io.FileNotFoundException efnf) {
writeException("FileNotFoundException at open log file: " + efnf.getMessage());
} catch (java.io.IOException exio) {
writeException("IOException at write log file: " + exio.getMessage());
} catch (java.lang.Exception e) {
writeException("Exception at write log file: " + e.getMessage());
} finally {
writer = null;
}
}
/**
* Output the log file with default encoding
* @param str
*/
public void writeDefaultEncode(String str) {
java.io.FileWriter fw = null;
SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
try {
String folder = generateDirectory();
fw = new java.io.FileWriter(folder + filePrefix + "_"
+ getCurrYYYYMMDD() + "." + fileSubName, true);
fw.write("[" + formatter.format(new java.util.Date()) + "] " + breakLine + "[start]" + breakLine);
fw.write(str);
fw.write(breakLine + "[end]" + breakLine);
fw.flush();
fw.close();
} catch (java.io.FileNotFoundException efnf) {
writeException("FileNotFoundException at open log file: " + efnf.getMessage());
} catch (java.io.IOException exio) {
writeException("IOException at write log file: " + exio.getMessage());
} catch (java.lang.Exception e) {
writeException("Exception at write log file: " + e.getMessage());
} finally {
fw = null;
}
}
/**
* Get the encoding string
*/
public String getEncoding(){
if(encodingStr != null)
return encodingStr;
return null;
}
/**
* Generate directory path
* @return
*/
private String generateDirectory() {
String folder = defineDirectoryName(filePath);
java.io.File file = new java.io.File(folder);
file.mkdirs();
return folder;
}
/**
* Define the directory path of Log. format is path\YYYY\MM
* @param path
* @return current directory path
*/
private String defineDirectoryName(String path) {
java.util.Calendar cal = java.util.Calendar.getInstance(java.util.Locale.TAIWAN);
String folder = path;
folder = folder + "\\" + String.valueOf(cal.get(java.util.Calendar.YEAR));
if (String.valueOf((cal.get(java.util.Calendar.MONTH) + 1)).length() == 1) {
folder = folder + "\\0" + String.valueOf((cal.get(java.util.Calendar.MONTH) + 1));
} else {
folder = folder + "\\" + String.valueOf((cal.get(java.util.Calendar.MONTH) + 1));
}
folder = folder + "\\";
return folder;
}
/**
* Get the current date. format is YYYYMMDD
* @return String of YYYYMMDD
*/
private String getCurrYYYYMMDD() {
SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd"); //yyyy/MM/dd HH:mm:ss
return formatter.format(new java.util.Date());
}
/**
* Output Exception message from this object
* @param msg
*/
private void writeException(String msg){
new Log(this.curWorkingDir).write(msg);
}
}
沒有留言:
張貼留言