使用java如何实现异步将日志写到文件中

  介绍

本篇文章给大家分享的是有关使用java如何实现异步将日志写到文件中,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

<强> java异步写日志到文件中详解

<强>实现代码:

包com.tydic.ESUtil;
  
  进口java.io.File;
  进口java.io.FileWriter;
  进口java.io.IOException;
  进口java.io.InputStream;
  进口java.io.PrintWriter;
  进口java.util.Properties;
  
  公开课LogWriter {//日志的配置文件
  公共静态最终字符串LOG_CONFIGFILE_NAME=發og.properties";//日志文件名在配置文件中的标签
  公共静态最终字符串LOGFILE_TAG_NAME=發ogfile";//默认的日志文件的路径和文件名称
  私人最终字符串DEFAULT_LOG_FILE_NAME=啊?logtext.log";//该类的唯一的实例
  私有静态LogWriter LogWriter;//文件输出流
  私人PrintWriter作家;//日志文件名
  私人字符串logFileName;/* *
  *默认构造函数
  */私人LogWriter()抛出LogException {
  this.init ();
  }
  私人LogWriter(字符串文件名)抛出LogException {
  这一点。logFileName=文件名;
  this.init ();
  }/* *
  *获取LogWriter的唯一实例。
  * @return
  * @throws LogException
  */公共静态同步LogWriter getLogWriter()抛出LogException {
  如果(logWriter==null) {
  logWriter=new logWriter ();
  }
  返回logWriter;
  }
  公共静态同步LogWriter getLogWriter(字符串logFileName)抛出LogException {
  如果(logWriter==null) {
  logWriter=new logWriter (logFileName);
  }
  返回logWriter;
  }/* *
  *往日志文件中写一条日志信息
  *为了防止多线程同时操作(写)日志文件,造成文件“死锁”。使用同步关键字
  * @param logMsg日志消息
  */公共同步无效日志(字符串logMsg) {
  this.writer。println(新java.util.Date () +“:“+ logMsg);
  }/* *
  *往日志文件中写一条异常信息
  *使用同步关键字。
  * @param交货待写入的异常
  */公共同步空白日志(例外的前女友){
  作家。println(新java.util.Date () +“:”);
  ex.printStackTrace(作家);
  }/* *
  *初始化LogWriter
  * @throws LogException
  */私人空间init()抛出LogException {//如果用户没有在参数中指定日志文件名,则从配置文件中获取。
  如果这一点。logFileName==null) {
  这一点。logFileName=this.getLogFileNameFromConfigFile ();//如果配置文件不存在或者也没有指定日志文件名,则用默认的日志文件名。
  如果这一点。logFileName==null) {
  这一点。logFileName=DEFAULT_LOG_FILE_NAME;
  }
  }
  文件日志文件=新文件(this.logFileName);
  尝试{//其中的FileWriter()中的第二个参数的含义是:是否在文件中追加内容//PrintWriter()中的第二个参数的含义是:自动将数据冲到文件中
  作家=new PrintWriter(新FileWriter(日志文件,真的),真的);
  System.out.println(“日志文件的位置:“+ logFile.getAbsolutePath ());
  }捕捉(IOException ex) {
  字符串errmsg=拔薹ù蚩罩疚募?“+ logFile.getAbsolutePath ();//System.out.println (errmsg);
  把新的LogException (errmsg、交货);
  }
  }/* *
  *从配置文件中取日志文件名
  * @return
  */私人字符串getLogFileNameFromConfigFile () {
  尝试{
  箴=new属性();//在类的当前位置,查找属性配置文件log.properties
  InputStream鳍=getClass () .getResourceAsStream (LOG_CONFIGFILE_NAME);
  如果(鳍!=null) {
  pro.load(鳍);//载入配置文件
  fin.close ();
  返回pro.getProperty (LOGFILE_TAG_NAME);
  其他}{
  System.err.println(“无法打开属性配置文件:log.properties");
  }
  }捕捉(IOException ex) {
  System.err.println(“无法打开属性配置文件:log.properties");
  }
  返回null;
  }//关闭LogWriter
  公共空间close () {
  logWriter=零;
  如果(作家!=null) {
  writer.close ();
  }
  }
  
  公共静态void main (String [] args) {
  LogWriter记录器=零;
  尝试{
  字符串文件名=癲:/temp/logger.log";
  记录器=LogWriter.getLogWriter(文件名);//logger.log(“第一个日志!“);//logger.log(“第二个日志信息“);//logger.log(“第三log");//logger.log(“第四个日志信息“);
  字符串内容=皌ableaA | device_number | 13701010“;
  StringBuffer某人=new StringBuffer ();
  for (int i=0; i<1000000;我+ +){
  sb.append(内容).append (i) .append (“; \ n");
  }
  内容=sb.toString ();
  长时间的开始时间=System.currentTimeMillis ();
  logger.log(内容);
  长endTime=System.currentTimeMillis ();
  System.out.println(“总消耗时间:“+ (endTime-startTime));
  logger.close ();//ReadFromFile.readFileByLines(文件名);
  }捕捉(LogException e) {
  e.printStackTrace ();
  }
  }
  }
  
  

使用java如何实现异步将日志写到文件中