溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

使用java如何實現(xiàn)異步將日志寫到文件中

發(fā)布時間:2020-11-17 16:31:56 來源:億速云 閱讀:715 作者:Leah 欄目:編程語言

本篇文章給大家分享的是有關使用java如何實現(xiàn)異步將日志寫到文件中,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

java異步寫日志到文件中詳解

實現(xiàn)代碼:

package com.tydic.ESUtil; 
 
import java.io.File; 
import java.io.FileWriter; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.PrintWriter; 
import java.util.Properties; 
 
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;  
  /** 
   * 默認構(gòu)造函數(shù) 
   */ 
  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{ 
    //如果用戶沒有在參數(shù)中指定日志文件名,則從配置文件中獲取。 
    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()中的第二個參數(shù)的含義是:是否在文件中追加內(nèi)容 
      // PrintWriter()中的第二個參數(shù)的含義是:自動將數(shù)據(jù)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 = "d:/temp/logger.log"; 
      logger = LogWriter.getLogWriter(fileName); 
//     logger.log("First log!"); 
//     logger.log("第二個日志信息"); 
//     logger.log("Third log"); 
//     logger.log("第四個日志信息"); 
      String content="tableaA|device_number|13701010"; 
      StringBuffer sb=new StringBuffer(); 
      for(int i=0;i<1000000;i++){ 
        sb.append(content).append(i).append(";\n"); 
      } 
      content=sb.toString(); 
      long startTime=System.currentTimeMillis(); 
      logger.log(content); 
      long endTime=System.currentTimeMillis(); 
      System.out.println("總消耗時間:"+(endTime-startTime)); 
      logger.close(); 
//     ReadFromFile.readFileByLines(fileName); 
    } catch (LogException e) { 
      e.printStackTrace(); 
    } 
  } 
} 

package com.tydic.ESUtil; 
 
public class AychWriter extends Thread { 
  private String content; 
  public AychWriter(String content){ 
    this.content=content; 
  } 
  @Override 
  public void run(){ 
    System.out.println("開始執(zhí)行run()"); 
    LogWriter logger = null; 
    String fileName = "d:/temp/logger.log"; 
    long startTime=System.currentTimeMillis(); 
    try { 
      logger = LogWriter.getLogWriter(fileName); 
      logger.log(this.content); 
    } catch (LogException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
    } 
 
    long endTime=System.currentTimeMillis(); 
    System.out.println("總消耗時間:"+(endTime-startTime)); 
  } 
} 

測試類:

package com.tydic.ESUtil; 
 
import java.io.FileWriter; 
import java.io.IOException; 
 
import org.junit.Test; 
 
public class test_test { 
  /** 
   * 同步向指定文件尾部寫入字符串 
   */ 
public void testAppendMethodB(String fileName,String content) throws IOException{ 
    try { 
      //打開一個寫文件器,構(gòu)造函數(shù)中的第二個參數(shù)true表示以追加形式寫文件 
      FileWriter writer = new FileWriter(fileName, true); 
      writer.write(content); 
      writer.close(); 
    } catch (IOException e) { 
      e.printStackTrace(); 
    } 
    } 
 
/** 
 *調(diào)用上面同步寫方法 
 */ 
  @Test 
  public void testWriteTOFile() throws IOException{ 
    String fileName = "d:\\test.txt"; 
    String content="tableaA|device_number|13701010"; 
    StringBuffer sb=new StringBuffer(); 
    for(int i=0;i<100000;i++){ 
      sb.append(content).append(i).append(";\n"); 
    } 
    content=sb.toString(); 
    long startTime=System.currentTimeMillis(); 
    testAppendMethodB(fileName,content); 
    long endTime=System.currentTimeMillis(); 
    System.out.println("總消耗時間:"+(endTime-startTime)); 
  } 
  /** 
   * 異步調(diào)用寫方法 
   * @throws IOException 
   * @throws InterruptedException 
   */ 
  @Test 
  public void testAsyncWriteTOFile() throws IOException, InterruptedException{ 
    String fileName = "d:\\test.txt"; 
    String content="tableaA|device_number|13701010"; 
    StringBuffer sb=new StringBuffer(); 
    for(int i=0;i<100000;i++){ 
      sb.append(content).append(i).append(";\n"); 
    } 
    content=sb.toString(); 
    System.out.println("start write..."); 
    new AychWriter(content).start(); 
    System.out.println("write over..."); 
    Thread.sleep(30000); //重要,如果主線程掛了,調(diào)用線程也停止了 
    System.out.println("main Thread over"); 
  } 
   
} 

以上就是使用java如何實現(xiàn)異步將日志寫到文件中,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降?。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI