⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 logger.java

📁 流量分析 可以对SNIFFER抓的包进行分析
💻 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 + -