📄 logger.java
字号:
package com.tianxun.NEI.sniffer.util;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.StringTokenizer;
/**
* The GscDiag write the diagnosis message to a log file, because it does a lot
* of I/O operation, it will effect the performance of process.
*/
public class Logger implements java.io.Serializable {
/** Kernel Level */
public static final int KERNEL_LEVEL = 0;
/** LOW Level */
public static final int LOW_LEVEL = KERNEL_LEVEL + 1;
/** Function Level */
public static final int FUNCTION_LEVEL = LOW_LEVEL + 1;
/** Sanity Level */
public static final int SANITY_LEVEL = FUNCTION_LEVEL + 1;
/** Program Level */
public static final int PROGRAM_LEVEL = SANITY_LEVEL + 1;
/** Fatal Level */
public static final int FATAL_LEVEL = PROGRAM_LEVEL + 1;
private static final String LOG_LEVEL_CODES[] = {"KERNEL", "LOW", "FUNCTION", "SANITY",
"PROGRAM", "FATAL" };
private SimpleDateFormat formatter = new SimpleDateFormat("MM/dd/yy HH:mm:ss.SSS");
private SimpleDateFormat fileformatter = new SimpleDateFormat("yyMMdd-HHmmss");
private String filebaseName = "Logger"; // the default logfile name
private String GSC_LOG_DIR;
private String LOG_DIR;
private File file = null;
private long MAX_FILE_SIZE = 2048000; // the maximum size of each log file
private long CUR_DATE;
private PrintWriter WRITER;
private int LOG_LEVEL = SANITY_LEVEL; // default loglevel
/**
* Loger Constructor.
* @param logdir save log directory
* @param logName log file name
* @param logLevel log level
*/
public Logger(String logdir, String logName, int logLevel) {
GSC_LOG_DIR = logdir;
if (GSC_LOG_DIR == null) {
GSC_LOG_DIR = System.getProperty("java.io.tmpdir");
if (GSC_LOG_DIR == null) {
GSC_LOG_DIR = System.getProperty("user.dir");
}
}
filebaseName = logName;
LOG_LEVEL = logLevel;
setWriter();
}
/**
* Loger Constructor.
* @param logName log file name
* @param logLevel log level
*/
public Logger(String logName, int logLevel) {
GSC_LOG_DIR = System.getProperty("java.io.tmpdir");
if (GSC_LOG_DIR == null || GSC_LOG_DIR.length() == 0) {
GSC_LOG_DIR = System.getProperty("user.dir");
}
filebaseName = logName;
LOG_LEVEL = logLevel;
setWriter();
}
/**
* Loger Constructor.
* @param logName log file name
*/
public Logger(String logName) {
GSC_LOG_DIR = System.getProperty("java.io.tmpdir");
if (GSC_LOG_DIR == null || GSC_LOG_DIR.length() == 0) {
GSC_LOG_DIR = System.getProperty("user.dir");
}
filebaseName = logName;
setWriter();
}
/**
* Loger Constructor. use default logname ="Loger" and loglevel=SANITY
*/
public Logger() {
GSC_LOG_DIR = System.getProperty("java.io.tmpdir");
if (GSC_LOG_DIR == null || GSC_LOG_DIR.length() == 0) {
GSC_LOG_DIR = System.getProperty("user.dir");
}
setWriter();
}
public String getLogName() {
return filebaseName;
}
public int getLogLevel() {
return LOG_LEVEL;
}
public String getLogDir() {
return GSC_LOG_DIR;
}
/**
* Shuts down Diagnosis facility.
*/
public synchronized void shutDown() {
if (WRITER == null) {
return;
}
WRITER.flush();
WRITER.println("###############################################################");
WRITER.println("#");
WRITER.println("#\t Server Shut Down");
WRITER.println("#");
WRITER.println("###############################################################");
WRITER.println("");
WRITER.close();
}
/**
* Logs this message.
* @param logLevel log level that controls if this message will be logged.
* When this log level is equal or greater than the defined log
* level, this message is logged.
* @param title text title to be put into the log.
* @param message text message to be logged.
*/
public synchronized void log(int logLevel, String title, String message) {
if (WRITER == null || logLevel < LOG_LEVEL) {
return;
}
if (isNewWriterRequired()) {
setWriter();
}
String date = formatter.format(Calendar.getInstance().getTime());
WRITER.println(">> " + date + "; " + "Thr:" + Thread.currentThread().getName() + "; "
+ "LogLvl:" + LOG_LEVEL_CODES[logLevel] + "; " + getWhere() + "; ");
WRITER.println(message);
WRITER.flush();
}
/**
* Logs this message.
* @param logLevel log level that controls if this message will be logged.
* When this log level is equal or greater than the definedlog level,
* this message is logged.
* @param message text message to be logged.
*/
public synchronized void log(int logLevel, String message) {
if (logLevel < LOG_LEVEL || WRITER == null) {
return;
}
if (isNewWriterRequired()) {
setWriter();
}
String date = formatter.format(Calendar.getInstance().getTime());
WRITER.println(">> " + date + "; " + "Thr:" + Thread.currentThread().getName()
+ "; LogLvl:" + LOG_LEVEL_CODES[logLevel] + "; Where:" + getWhere() + "; ");
WRITER.println(message);
WRITER.flush();
}
/**
* Logs the stack trace of an exception.
* @param logLevel log level that controls if this message will be logged.
* When this log level is equal or greater than the defined log
* level, this message is logged.
* @param title text title to be put into the log.
* @param throwable exception to be logged.
*/
public void printStackTrace(int logLevel, String title, Throwable throwable) {
if (WRITER == null || logLevel < LOG_LEVEL) {
return;
}
if (isNewWriterRequired()) {
setWriter();
}
String date = formatter.format(Calendar.getInstance().getTime());
WRITER.println(">> " + date + "; " + title + "; " + "Thr:"
+ Thread.currentThread().getName() + "; " + "LogLvl:" + LOG_LEVEL_CODES[logLevel]
+ "; " + getWhere() + "; ");
throwable.printStackTrace(WRITER);
WRITER.flush();
}
/**
* Writes the configurations of this running program.
*/
public void writeConfigurations() {
if (WRITER == null) {
return;
}
WRITER.println("###############################################################");
WRITER.println("#");
WRITER.println("#\t LOG_LEVEL = " + LOG_LEVEL_CODES[LOG_LEVEL]);
// more configuration can be added here
WRITER.println("#");
WRITER.println("###############################################################");
WRITER.flush();
}
/**
* Get current data in the format of yyyymmdd
* @return the current date in the format of yyyymmdd.
*/
private long getCurDate() {
SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd");
String date = df.format(Calendar.getInstance().getTime());
long curDate = 0;
try {
curDate = Long.parseLong(date);
} catch (NumberFormatException ex) {
// eat it
}
return curDate;
}
/**
* A new writer is required when today's date is greater than the date that
* the log file was created, or the file size limit is reached.
* @return if a new writer is required.
*/
private boolean isNewWriterRequired() {
return (getCurDate() > CUR_DATE) || (file.length() > MAX_FILE_SIZE);
}
/**
* Sets writer to be used to write logs.
*/
private synchronized void setWriter() {
if (WRITER != null) {
WRITER.println("###############################################################");
WRITER.println("\t End Of the DiagFile:" + filebaseName + ".log");
WRITER.println("###############################################################");
WRITER.flush();
WRITER.close();
}
// create log dir and file.
if (getCurDate() > CUR_DATE) {
CUR_DATE = getCurDate();
LOG_DIR = GSC_LOG_DIR + File.separator + CUR_DATE;
new File(LOG_DIR).mkdirs();
} else {
String nfile = LOG_DIR + File.separator + filebaseName
+ fileformatter.format(Calendar.getInstance().getTime()) + ".log";
file.renameTo(new File(nfile));
}
String logFile = LOG_DIR + File.separator + filebaseName + ".log";
// create a file writer to write to the log file
try {
WRITER = new PrintWriter(new FileWriter(logFile, true));
file = new File(logFile);
} catch (IOException ex) {
System.err.println("Fatal Error [" + ex.toString() + "]!"
+ "Diagnosis cannot write to the log file [" + logFile + "].");
System.err.println("System.out is used.");
WRITER = new PrintWriter(System.out);
}
}
/**
* Gets the latest method of the thread stack.
*/
private String getWhere() {
String where = "";
Thread currentThread = Thread.currentThread();
ByteArrayOutputStream os = new ByteArrayOutputStream();
PrintStream pw = new PrintStream(os);
System.setErr(pw);
currentThread.dumpStack();
System.setErr(System.err);
pw.flush();
String text = os.toString();
// Find the last method called before Debug's static methods.
StringTokenizer st = new StringTokenizer(text, "\n");
while (st.hasMoreTokens()) {
String s = st.nextToken();
if (s.indexOf("com.gluonsoft.util.GscDiag") == -1
&& s.indexOf("com.gluonsoft.util.Logger") == -1
&& s.indexOf("java.lang.Thread") == -1 && s.indexOf("at ") > -1)
{
where = s.trim();
break;
}
}
pw.close();
return where;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -