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上快速搭建专属网站?

