日志系统中多线程写文件的问题

问题描述

大家好,我现在在写一个日志系统,因为我需要在另外的项目中使用这个日志系统,在项目中调用日志系统的输出日志功能时,需要把日志写到一个文件里面,因为项目中可能启动几十上百个线程,这样的话,就会出现很多线程都是向同一个文件里面写日志,考虑的性能和资源的前提下,有没有一个好的方案解决多个线程写文件的问题。在下考虑到的方法有:1,每次每个线程读写文件的时候,打开输入流,写完了以后关闭输出流。这样做的话每次都要打开关闭输出流,会不会很耗资源2,程序中使用一个集合保存需要写文件的输出流,当哪个线程需要写文件的时候,从集合中获得输入流写文件,写完后,对输出流不关闭,供下次使用。这样的话多个线程使用同一个输出流,不需要频繁的进行打开关闭流,但是这样的话这些输入流就会在程序中一直打开,会不会出现内存的问题本人暂时就想到这两个方案,看来一下Log4j的源码,想看看他的思路,奈何本人菜鸟一个,没看懂,希望论坛各位前辈指点一二。

解决方案

解决方案二:
性能要求高的情况下,我觉得可以考虑这种方法开辟一个缓冲区,所有线程都往这个缓冲区写入然后有一个线程从这个缓冲区读取写入文件
解决方案三:
引用1楼rumlee的回复:

性能要求高的情况下,我觉得可以考虑这种方法开辟一个缓冲区,所有线程都往这个缓冲区写入然后有一个线程从这个缓冲区读取写入文件

如果设立缓冲区的话,如果出现宕机,断电,日志没来得及保存的话,就会丢失日志,这个问题如何处理
解决方案四:
一个文件一次性只能有一个句柄持有写锁,你搞个多线程来写文件一点意义都没有,除了让多线程抢CPU玩之外。这种设计一般都是一个缓冲区(可大可小),多个线程写缓冲区,一个线程写文件,句柄打开了不要关。如果怕丢数据,就把缓冲区变小,如果要吞吐量大,就把缓冲区变大。
解决方案五:
交给同一个线程去写就可以了。比方新建一个SynchronizedFileAppender类,所有输出都交给它,它保证用单个线程输出到文件,这样就不会错乱了。
解决方案六:
引用2楼liuzijue的回复:

Quote: 引用1楼rumlee的回复:
性能要求高的情况下,我觉得可以考虑这种方法开辟一个缓冲区,所有线程都往这个缓冲区写入然后有一个线程从这个缓冲区读取写入文件

如果设立缓冲区的话,如果出现宕机,断电,日志没来得及保存的话,就会丢失日志,这个问题如何处理

对于你说的这些问题,没有完美的方案。你可以定时保存,把损失降低到最少。例如,你隔一段时间(<1秒)就保存一下。。。
解决方案七:
引用2楼liuzijue的回复:

Quote: 引用1楼rumlee的回复:
性能要求高的情况下,我觉得可以考虑这种方法开辟一个缓冲区,所有线程都往这个缓冲区写入然后有一个线程从这个缓冲区读取写入文件

如果设立缓冲区的话,如果出现宕机,断电,日志没来得及保存的话,就会丢失日志,这个问题如何处理

萝卜快了不洗泥。性能和安全本身就是对立的,需要根据具体情况做平衡。
解决方案八:
怎么搞得这么复杂,你要避免多个线程写同一个文件,用sychronized(“你的日志文件对象实例")给日志加锁不就行了么?至于性能问题,上面的帖子已经分析得很清楚了,要高安全性性能就低,要高性能安全性就要打折扣,这个跟数据库的隔离级别一样的道理,没有最终解的
解决方案九:
一个文件一次性只能有一个句柄持有写锁,你搞个多线程来写文件一点意义都没有,除了让多线程抢CPU玩之外。这种设计一般都是一个缓冲区(可大可小),多个线程写缓冲区,一个线程写文件,句柄打开了不要关。如果怕丢数据,就把缓冲区变小,如果要吞吐量大,就把缓冲区变大。
解决方案十:
不存在多线程写文件问题,

时间: 2025-01-01 06:14:20

日志系统中多线程写文件的问题的相关文章

Hhadoop-2.7.0中HDFS写文件源码分析(二):客户端实现(1)

一.综述       HDFS写文件是整个Hadoop中最为复杂的流程之一,它涉及到HDFS中NameNode.DataNode.DFSClient等众多角色的分工与合作.       首先上一段代码,客户端是如何写文件的: Configuration conf = new Configuration(); FileSystem fs = FileSystem.get(conf); Path file = new Path("demo.txt"); FSDataOutputStream

如何在win10系统中禁止PDF文件以斯巴达浏览器的方式打开

  1.首先,咱们需要返回到win10系统的传统桌面位置,然后找到win10系统中的PDF文件,然后右键点击这个PDF文件,然后在出现的下滑菜单中选中属性选项. 2.接下来咱们就可以看到如下图中所示的窗口了,窗口中会有一个打开方式,咱们直接点击打开方式后面的更改按钮. 3.接下来会出现一个"从现在开始,你希望以什么方式打开此.pdf文件?"的窗口,其中有阅读器,也就是使用斯巴达浏览器直接打开的方式,如果win10系统中安装了其他可以打开PDF文件的程序的话,也会出现其他的选项,咱们直接

如何在win8系统中获取删除文件的最高权限?

  在以前的winXP系统和win7 64位旗舰版系统中,咱们默认使用的就是管理员账户登陆,因此咱们在操作Windows系统的时候遇到权限的问题也比较少,但是在进入到win8系统之后,为了更好的保护用户的隐私,Windows系统默认了不再使用管理员账户登陆,因此,咱们在进行一些操作的时候,就会收到诸如权限不足的提示,那么遇到这样的情况咱们要如何处理呢?今天,小编就来具体介绍一下,如何在win8系统中获取删除文件的最高权限? 1.首先,咱们需要返回到win8系统的传统桌面位置,然后在win8系统中

如何将深度win7系统中的$360Section文件夹删除掉?

  可以说,现在的360软件是比较受用户欢迎的一款软件,360旗下的软件比较多,他们所经营的范围也是比较广的,例如360浏览器,360手机助手,360杀毒软件,360安全卫士等等,这些都是大家比较熟悉的吧?特别是在最新win7系统下载中杀毒软件配合安全卫士的使用,更是大部分用户的首选,那么各位在深度win7系统中安装了360杀毒软件的用户是否有发现,自己的C盘或者是D盘中有出现一个$360Section文件夹?这个文件夹似乎是无法删除的,即便是卸载了360杀毒软件也是无法删除的,那么它到底要如何

文件下载-同一个文件在Linux系统中下载,文件比较小

问题描述 同一个文件在Linux系统中下载,文件比较小 在www.samba.org下载Samba源码samba-latest.tar.gz,在Linux系统下下载大小只有19.4M,而在win7系统下载大小确是97.1M,解压后里面内容一样(其实就是同一个下载路径https://download.samba.org/pub/samba/samba-latest.tar.gz),,,为什么大小不同 19.4M的是从Linux系统中拖出来的 win7用的是360浏览器,Linux用的是Firefo

Linux系统中三类重要文件的作用与区别

Linux系统中,有三种文件类型出现的非常频繁,那就是profile.bash_profile.bashrc文件. 因为名称的缘故,很多人会把这三类文件的作用记混,因此我们今天就来详细盘点一下这三类文件的作用及区别. 1. profile文件 1.1 profile文件的作用 profile(/etc/profile),用于设置系统级的环境变量和启动程序,在这个文件下配置会对所有用户生效. 当用户登录(login)时,文件会被执行,并从/etc/profile.d目录的配置文件中查找shell设

拷贝文件-嵌入式系统中拷贝图片文件和拷贝txt文件操作相同吗?

问题描述 嵌入式系统中拷贝图片文件和拷贝txt文件操作相同吗? 在嵌入式系统中实现不同目录间的文件拷贝,现在想拷贝图片,能用标准io进行拷贝吗,会不会有什么问题? 解决方案 没有问题,都是文件,一样的拷贝.

Windows 7系统使用多线程加快文件复制?

  为什么没办法在 Windows 7 下加快 Windows 7 中文件复制/传输功能呢?可以用 robocopy 实现多线程文件复制实现. 经常进行文件管理操作的朋友们,提到复制/粘贴操作,深度系统下载想必很多人还会回想起当初 Vista 奇慢的复制速度,不满意于 Windows 系统内置的复制功能,因为它太龟速了.于是大家就使用 FastCopy.TeraCopy 之类的软件来加速复制,Windows 7 随后则是修复了这一问题,但效果似乎也不理想,但是你是否知道 Windows 7 已经

系统上传图片提示写文件失败,可以读取查看图片。请高手帮忙分析原因。

问题描述 系统是用2台服务器做的was集群,其中有一台服务器上的应用会不间断的会出现上传图片失败,写文件不行.但是系统可以读取查看图片.这个现象出现大概持续10分钟左右,自动恢复,又可以上传图片了.服务器配置也没改过,以前也没出现过这样的问题,最近一直出现这样的问题.请高手帮忙分析下原因,或者遇到过类似情况的朋友提供下解决方案,不胜感激.出现错误日志如下:com.ibm.wsspi.webcontainer.ClosedConnectionException:OutputStreamencoun