<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Cyh的博客

    Email:kissyan4916@163.com
    posts - 26, comments - 19, trackbacks - 0, articles - 220

    自定義日志文件類

    Posted on 2009-05-30 23:42 啥都寫點 閱讀(487) 評論(0)  編輯  收藏 所屬分類: J2SE
    關鍵技術:
    • 使用Singleton單例模式,使得整個程序中只存在一個日志類的實例。
    • 寫日志文件使用java.io.PrintWriter,是因為它能對文本進行格式化的寫入。
    • 通過配置文件的方式,允許用戶修改日志文件的路徑。使用java.util.Properties類解析配置文件。
    • 為了避免多線程同時寫文件造成的日志紊亂,在寫日志消息時,使用同步機制。

    package book.io.log;

    import java.io.File;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.PrintWriter;
    import java.util.Properties;

    import book.io.ReadFromFile;

    /**
     * 日志工具類
     * 使用了單例模式,保證只有一個實例。
     * 為了更方便的配置日志文件名,使用屬性文件配置。
     * 也可以在程序中指定日志文件名。
     
    */
    public class LogWriter {
        
    //  日志的配置文件
        public static final String LOG_CONFIGFILE_NAME = "log.properties";
        
    //  日志文件名在配置文件中的標簽
        public static final String LOGFILE_TAG_NAME = "logfile";
        
        
    //    默認的日志文件的路徑和文件名稱
        private final String DEFAULT_LOG_FILE_NAME = "./logtext.log";
        
    //    該類的唯一的實例
        private static LogWriter logWriter;
        
    //  文件輸出流
        private PrintWriter writer;  
        
    //  日志文件名
        private String logFileName; 
        
    /**
         * 默認構造函數
         
    */
        
    private LogWriter() throws LogException{
            
    this.init();
        }
        
    private LogWriter(String fileName) throws LogException{
            
    this.logFileName = fileName;
            
    this.init();
        }
        
    /**
         * 獲取LogWriter的唯一實例。
         * 
    @return
         * 
    @throws LogException
         
    */
        
    public synchronized static LogWriter getLogWriter()throws LogException{
            
    if (logWriter == null){
                logWriter 
    = new LogWriter();
            }
            
    return logWriter;
        }
        
    public synchronized static LogWriter getLogWriter(String logFileName)throws LogException{
            
    if (logWriter == null){
                logWriter 
    = new LogWriter(logFileName);
            }
            
    return logWriter;
        }

        
    /**
         * 往日志文件中寫一條日志信息
         * 為了防止多線程同時操作(寫)日志文件,造成文件”死鎖”。使用synchronized關鍵字
         * 
    @param logMsg    日志消息
         
    */
        
    public synchronized void log(String logMsg) {
            
    this.writer.println(new java.util.Date() + "" + logMsg);
        }
        
    /**
         * 往日志文件中寫一條異常信息
         * 使用synchronized關鍵字。
         * 
    @param ex    待寫入的異常
         
    */
        
    public synchronized void log(Exception ex) {
            writer.println(
    new java.util.Date() + "");
            ex.printStackTrace(writer);
        }

        
    /**
         * 初始化LogWriter
         * 
    @throws LogException
         
    */
        
    private void init() throws LogException{
            
    //如果用戶沒有在參數中指定日志文件名,則從配置文件中獲取。
            if (this.logFileName == null){
                
    this.logFileName = this.getLogFileNameFromConfigFile();
                
    //如果配置文件不存在或者也沒有指定日志文件名,則用默認的日志文件名。
                if (this.logFileName == null){
                    
    this.logFileName = DEFAULT_LOG_FILE_NAME;
                }
            }
            File logFile 
    = new File(this.logFileName);
            
    try {
                
    //    其中的FileWriter()中的第二個參數的含義是:是否在文件中追加內容
                
    //  PrintWriter()中的第二個參數的含義是:自動將數據flush到文件中
                writer = new PrintWriter(new FileWriter(logFile, true), true);
                System.out.println(
    "日志文件的位置:" + logFile.getAbsolutePath());
            } 
    catch (IOException ex) {
                String errmsg 
    = "無法打開日志文件:" + logFile.getAbsolutePath();
                
    //  System.out.println(errmsg);
                throw new LogException(errmsg, ex);
            }
        }
        
    /**
         * 從配置文件中取日志文件名
         * 
    @return
         
    */
        
    private String getLogFileNameFromConfigFile() { 
            
    try { 
                Properties pro 
    = new Properties(); 
                
    //在類的當前位置,查找屬性配置文件log.properties 
                InputStream fin = getClass().getResourceAsStream(LOG_CONFIGFILE_NAME); 
                
    if (fin != null){
                    pro.load(fin);
    //載入配置文件
                    fin.close(); 
                    
    return pro.getProperty(LOGFILE_TAG_NAME);
                } 
    else {
                    System.err.println(
    "無法打開屬性配置文件: log.properties" ); 
                }
            }
    catch (IOException ex) { 
                System.err.println(
    "無法打開屬性配置文件: log.properties" ); 
            }
            
    return null;
        }
        
    //關閉LogWriter
        public void close() {
            logWriter 
    = null;
            
    if (writer != null){
                writer.close();
            }
        }

        
    public static void main(String[] args) {
            LogWriter logger 
    = null;
            
    try {
                String fileName 
    = "C:/temp/temp0/logger.log";
                logger 
    = LogWriter.getLogWriter(fileName);
                logger.log(
    "First log!");
                logger.log(
    "第二個日志信息");
                logger.log(
    "Third log");
                logger.log(
    "第四個日志信息");
                logger.close();
                ReadFromFile.readFileByLines(fileName);
            } 
    catch (LogException e) {
                e.printStackTrace();
            }
        }
    }



    /**
     *Log操作過程中的異常
     */
    package book.io.log;

    /**
     * Log操作過程中的異常
     */
    public class LogException extends Exception {
        public LogException() {
            super();
        }

        public LogException(String msg) {
            super(msg);
        }

        public LogException(String msg, Throwable cause) {
            super(msg, cause);
        }

        public LogException(Throwable cause) {
            super(cause);
        }
    }




                                                                                                           --    學海無涯
            

    主站蜘蛛池模板: 在线观看亚洲免费视频| 亚洲男人天堂影院| 黄色网址在线免费观看| 最近中文字幕免费mv视频7| 亚洲欧洲国产精品久久| 51视频精品全部免费最新| 亚洲国产综合精品中文第一区| 中文字幕免费在线视频| 亚洲熟妇无码乱子AV电影| 国色精品va在线观看免费视频| 亚洲精品无码午夜福利中文字幕| 久久久久久久久久久免费精品| 亚洲色无码专区在线观看| a级在线免费观看| 久久久久亚洲av无码尤物| 91视频免费网址| ww亚洲ww在线观看国产| 午夜免费福利在线| 中美日韩在线网免费毛片视频| 亚洲精品无码AV人在线播放| 国产猛男猛女超爽免费视频| 久久综合九九亚洲一区| 希望影院高清免费观看视频| 亚洲AV色欲色欲WWW| 亚洲欧洲日本在线| 无码国产精品一区二区免费模式| 亚洲视频一区在线| 妞干网在线免费观看| 人成午夜免费大片在线观看| 亚洲大尺度无码无码专区| 18禁免费无码无遮挡不卡网站| 亚洲精品V天堂中文字幕| 国产亚洲成人久久| 国产成人免费高清激情明星| 亚洲人成色777777精品| 亚洲真人日本在线| 18禁网站免费无遮挡无码中文| 美女黄频a美女大全免费皮| 亚洲狠狠综合久久| 在线观看国产情趣免费视频| a视频免费在线观看|