问题描述
大家好,我现在在写一个日志系统,因为我需要在另外的项目中使用这个日志系统,在项目中调用日志系统的输出日志功能时,需要把日志写到一个文件里面,因为项目中可能启动几十上百个线程,这样的话,就会出现很多线程都是向同一个文件里面写日志,考虑的性能和资源的前提下,有没有一个好的方案解决多个线程写文件的问题。在下考虑到的方法有:1,每次每个线程读写文件的时候,打开输入流,写完了以后关闭输出流。这样做的话每次都要打开关闭输出流,会不会很耗资源2,程序中使用一个集合保存需要写文件的输出流,当哪个线程需要写文件的时候,从集合中获得输入流写文件,写完后,对输出流不关闭,供下次使用。这样的话多个线程使用同一个输出流,不需要频繁的进行打开关闭流,但是这样的话这些输入流就会在程序中一直打开,会不会出现内存的问题本人暂时就想到这两个方案,看来一下Log4j的源码,想看看他的思路,奈何本人菜鸟一个,没看懂,希望论坛各位前辈指点一二。
解决方案
解决方案二:
性能要求高的情况下,我觉得可以考虑这种方法开辟一个缓冲区,所有线程都往这个缓冲区写入然后有一个线程从这个缓冲区读取写入文件
解决方案三:
引用1楼rumlee的回复:
性能要求高的情况下,我觉得可以考虑这种方法开辟一个缓冲区,所有线程都往这个缓冲区写入然后有一个线程从这个缓冲区读取写入文件
如果设立缓冲区的话,如果出现宕机,断电,日志没来得及保存的话,就会丢失日志,这个问题如何处理
解决方案四:
一个文件一次性只能有一个句柄持有写锁,你搞个多线程来写文件一点意义都没有,除了让多线程抢CPU玩之外。这种设计一般都是一个缓冲区(可大可小),多个线程写缓冲区,一个线程写文件,句柄打开了不要关。如果怕丢数据,就把缓冲区变小,如果要吞吐量大,就把缓冲区变大。
解决方案五:
交给同一个线程去写就可以了。比方新建一个SynchronizedFileAppender类,所有输出都交给它,它保证用单个线程输出到文件,这样就不会错乱了。
解决方案六:
引用2楼liuzijue的回复:
Quote: 引用1楼rumlee的回复:
性能要求高的情况下,我觉得可以考虑这种方法开辟一个缓冲区,所有线程都往这个缓冲区写入然后有一个线程从这个缓冲区读取写入文件如果设立缓冲区的话,如果出现宕机,断电,日志没来得及保存的话,就会丢失日志,这个问题如何处理
对于你说的这些问题,没有完美的方案。你可以定时保存,把损失降低到最少。例如,你隔一段时间(<1秒)就保存一下。。。
解决方案七:
引用2楼liuzijue的回复:
Quote: 引用1楼rumlee的回复:
性能要求高的情况下,我觉得可以考虑这种方法开辟一个缓冲区,所有线程都往这个缓冲区写入然后有一个线程从这个缓冲区读取写入文件如果设立缓冲区的话,如果出现宕机,断电,日志没来得及保存的话,就会丢失日志,这个问题如何处理
萝卜快了不洗泥。性能和安全本身就是对立的,需要根据具体情况做平衡。
解决方案八:
怎么搞得这么复杂,你要避免多个线程写同一个文件,用sychronized(“你的日志文件对象实例")给日志加锁不就行了么?至于性能问题,上面的帖子已经分析得很清楚了,要高安全性性能就低,要高性能安全性就要打折扣,这个跟数据库的隔离级别一样的道理,没有最终解的
解决方案九:
一个文件一次性只能有一个句柄持有写锁,你搞个多线程来写文件一点意义都没有,除了让多线程抢CPU玩之外。这种设计一般都是一个缓冲区(可大可小),多个线程写缓冲区,一个线程写文件,句柄打开了不要关。如果怕丢数据,就把缓冲区变小,如果要吞吐量大,就把缓冲区变大。
解决方案十:
不存在多线程写文件问题,