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");
}
}
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!