java异步写日志到文件中实现代码
java异步写日志到文件中详解
实现代码:
packagecom.tydic.ESUtil; importjava.io.File; importjava.io.FileWriter; importjava.io.IOException; importjava.io.InputStream; importjava.io.PrintWriter; importjava.util.Properties; publicclassLogWriter{ //日志的配置文件 publicstaticfinalStringLOG_CONFIGFILE_NAME="log.properties"; //日志文件名在配置文件中的标签 publicstaticfinalStringLOGFILE_TAG_NAME="logfile"; //默认的日志文件的路径和文件名称 privatefinalStringDEFAULT_LOG_FILE_NAME="./logtext.log"; //该类的唯一的实例 privatestaticLogWriterlogWriter; //文件输出流 privatePrintWriterwriter; //日志文件名 privateStringlogFileName; /** *默认构造函数 */ privateLogWriter()throwsLogException{ this.init(); } privateLogWriter(StringfileName)throwsLogException{ this.logFileName=fileName; this.init(); } /** *获取LogWriter的唯一实例。 *@return *@throwsLogException */ publicsynchronizedstaticLogWritergetLogWriter()throwsLogException{ if(logWriter==null){ logWriter=newLogWriter(); } returnlogWriter; } publicsynchronizedstaticLogWritergetLogWriter(StringlogFileName)throwsLogException{ if(logWriter==null){ logWriter=newLogWriter(logFileName); } returnlogWriter; } /** *往日志文件中写一条日志信息 *为了防止多线程同时操作(写)日志文件,造成文件”死锁”。使用synchronized关键字 *@paramlogMsg日志消息 */ publicsynchronizedvoidlog(StringlogMsg){ this.writer.println(newjava.util.Date()+":"+logMsg); } /** *往日志文件中写一条异常信息 *使用synchronized关键字。 *@paramex待写入的异常 */ publicsynchronizedvoidlog(Exceptionex){ writer.println(newjava.util.Date()+":"); ex.printStackTrace(writer); } /** *初始化LogWriter *@throwsLogException */ privatevoidinit()throwsLogException{ //如果用户没有在参数中指定日志文件名,则从配置文件中获取。 if(this.logFileName==null){ this.logFileName=this.getLogFileNameFromConfigFile(); //如果配置文件不存在或者也没有指定日志文件名,则用默认的日志文件名。 if(this.logFileName==null){ this.logFileName=DEFAULT_LOG_FILE_NAME; } } FilelogFile=newFile(this.logFileName); try{ //其中的FileWriter()中的第二个参数的含义是:是否在文件中追加内容 //PrintWriter()中的第二个参数的含义是:自动将数据flush到文件中 writer=newPrintWriter(newFileWriter(logFile,true),true); System.out.println("日志文件的位置:"+logFile.getAbsolutePath()); }catch(IOExceptionex){ Stringerrmsg="无法打开日志文件:"+logFile.getAbsolutePath(); //System.out.println(errmsg); thrownewLogException(errmsg,ex); } } /** *从配置文件中取日志文件名 *@return */ privateStringgetLogFileNameFromConfigFile(){ try{ Propertiespro=newProperties(); //在类的当前位置,查找属性配置文件log.properties InputStreamfin=getClass().getResourceAsStream(LOG_CONFIGFILE_NAME); if(fin!=null){ pro.load(fin);//载入配置文件 fin.close(); returnpro.getProperty(LOGFILE_TAG_NAME); }else{ System.err.println("无法打开属性配置文件:log.properties"); } }catch(IOExceptionex){ System.err.println("无法打开属性配置文件:log.properties"); } returnnull; } //关闭LogWriter publicvoidclose(){ logWriter=null; if(writer!=null){ writer.close(); } } publicstaticvoidmain(String[]args){ LogWriterlogger=null; try{ StringfileName="d:/temp/logger.log"; logger=LogWriter.getLogWriter(fileName); //logger.log("Firstlog!"); //logger.log("第二个日志信息"); //logger.log("Thirdlog"); //logger.log("第四个日志信息"); Stringcontent="tableaA|device_number|13701010"; StringBuffersb=newStringBuffer(); for(inti=0;i<1000000;i++){ sb.append(content).append(i).append(";\n"); } content=sb.toString(); longstartTime=System.currentTimeMillis(); logger.log(content); longendTime=System.currentTimeMillis(); System.out.println("总消耗时间:"+(endTime-startTime)); logger.close(); //ReadFromFile.readFileByLines(fileName); }catch(LogExceptione){ e.printStackTrace(); } } }
packagecom.tydic.ESUtil; publicclassAychWriterextendsThread{ privateStringcontent; publicAychWriter(Stringcontent){ this.content=content; } @Override publicvoidrun(){ System.out.println("开始执行run()"); LogWriterlogger=null; StringfileName="d:/temp/logger.log"; longstartTime=System.currentTimeMillis(); try{ logger=LogWriter.getLogWriter(fileName); logger.log(this.content); }catch(LogExceptione1){ //TODOAuto-generatedcatchblock e1.printStackTrace(); } longendTime=System.currentTimeMillis(); System.out.println("总消耗时间:"+(endTime-startTime)); } }
测试类:
packagecom.tydic.ESUtil; importjava.io.FileWriter; importjava.io.IOException; importorg.junit.Test; publicclasstest_test{ /** *同步向指定文件尾部写入字符串 */ publicvoidtestAppendMethodB(StringfileName,Stringcontent)throwsIOException{ try{ //打开一个写文件器,构造函数中的第二个参数true表示以追加形式写文件 FileWriterwriter=newFileWriter(fileName,true); writer.write(content); writer.close(); }catch(IOExceptione){ e.printStackTrace(); } } /** *调用上面同步写方法 */ @Test publicvoidtestWriteTOFile()throwsIOException{ StringfileName="d:\\test.txt"; Stringcontent="tableaA|device_number|13701010"; StringBuffersb=newStringBuffer(); for(inti=0;i<100000;i++){ sb.append(content).append(i).append(";\n"); } content=sb.toString(); longstartTime=System.currentTimeMillis(); testAppendMethodB(fileName,content); longendTime=System.currentTimeMillis(); System.out.println("总消耗时间:"+(endTime-startTime)); } /** *异步调用写方法 *@throwsIOException *@throwsInterruptedException */ @Test publicvoidtestAsyncWriteTOFile()throwsIOException,InterruptedException{ StringfileName="d:\\test.txt"; Stringcontent="tableaA|device_number|13701010"; StringBuffersb=newStringBuffer(); for(inti=0;i<100000;i++){ sb.append(content).append(i).append(";\n"); } content=sb.toString(); System.out.println("startwrite..."); newAychWriter(content).start(); System.out.println("writeover..."); Thread.sleep(30000);//重要,如果主线程挂了,调用线程也停止了 System.out.println("mainThreadover"); } }
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!