java异步写日志到文件中实现代码
程序员文章站
2024-02-29 10:29:16
java异步写日志到文件中详解
实现代码:
package com.tydic.esutil;
import java.io.file;
impo...
java异步写日志到文件中详解
实现代码:
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; /** * 默认构造函数 */ 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 = "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("开始执行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 { //打开一个写文件器,构造函数中的第二个参数true表示以追加形式写文件 filewriter writer = new filewriter(filename, true); writer.write(content); writer.close(); } catch (ioexception e) { e.printstacktrace(); } } /** *调用上面同步写方法 */ @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)); } /** * 异步调用写方法 * @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); //重要,如果主线程挂了,调用线程也停止了 system.out.println("main thread over"); } }
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
下一篇: .net输出重写压缩页面文件的小例子