java异步写日志到文件中实现代码

发布时间 - 2026-01-11 00:48:17    点击率:

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"); 
  } 
   
} 

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# java异步写日志到文件中  # java实现异步写日志到文件中详解  # java实现异步导出数据  # 简述JAVA同步、异步、阻塞和非阻塞之间的区别  # Java并发 CompletableFuture异步编程的实现  # 处理java异步事件的阻塞和非阻塞方法分析  # Java8新的异步编程方式CompletableFuture实现  # 详解java 三种调用机制(同步、回调、异步)  # Java异步处理机制实例详解  # java 中同步、异步、阻塞和非阻塞区别详解  # 解析Java异步之call future  # 配置文件  # 第二个  # 无法打开  # 死锁  # 往日  # 志文  # 希望能  # 不存在  # 谢谢大家  # 挂了  # 为了防止  # 多线程  # 者也  # 中取  # 则用  # 停止了  # pre  # null  # java  # return 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 公司门户网站制作流程,华为官网怎么做?  Python文本处理实践_日志清洗解析【指导】  宙斯浏览器怎么屏蔽图片浏览 节省手机流量使用设置方法  Laravel如何实现一对一模型关联?(Eloquent示例)  米侠浏览器网页背景异常怎么办 米侠显示修复  php在windows下怎么调试_phpwindows环境调试操作说明【操作】  香港服务器建站指南:外贸独立站搭建与跨境电商配置流程  如何在阿里云完成域名注册与建站?  Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南  如何用JavaScript实现文本编辑器_光标和选区怎么处理  PHP 实现电台节目表的智能时间匹配与今日/明日轮播逻辑  如何在橙子建站上传落地页?操作指南详解  Laravel Admin后台管理框架推荐_Laravel快速开发后台工具  如何快速打造个性化非模板自助建站?  标题:Vue + Vuex + JWT 身份认证的正确实践与常见误区解析  网站制作软件免费下载安装,有哪些免费下载的软件网站?  Laravel用户密码怎么加密_Laravel Hash门面使用教程  合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?  Laravel如何生成和使用数据填充?(Seeder和Factory示例)  使用PHP下载CSS文件中的所有图片【几行代码即可实现】  微信小程序 wx.uploadFile无法上传解决办法  Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】  Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性  Laravel如何实现多语言支持_Laravel本地化与国际化(i18n)配置教程  中山网站推广排名,中山信息港登录入口?  软银砸40亿美元收购DigitalBridge 强化AI资料中心布局  简历没回改:利用AI润色让你的文字更专业  Laravel怎么自定义错误页面_Laravel修改404和500页面模板  品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?  手机软键盘弹出时影响布局的解决方法  悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤  如何用美橙互联一键搭建多站合一网站?  如何挑选最适合建站的高性能VPS主机?  html如何与html链接_实现多个HTML页面互相链接【互相】  Laravel中间件如何使用_Laravel自定义中间件实现权限控制  Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】  java ZXing生成二维码及条码实例分享  Win11怎么开启自动HDR画质_Windows11显示设置HDR选项  DeepSeek是免费使用的吗 DeepSeek收费模式与Pro版本功能详解  如何快速上传建站程序避免常见错误?  韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南  如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体  Linux系统命令中screen命令详解  百度输入法ai组件怎么删除 百度输入法ai组件移除工具  如何用已有域名快速搭建网站?  简单实现jsp分页  免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?  C++用Dijkstra(迪杰斯特拉)算法求最短路径  制作企业网站建设方案,怎样建设一个公司网站?  如何在万网ECS上快速搭建专属网站?