求!多线程日志的解决方案

209 views
Skip to first unread message

赵帅

unread,
Dec 28, 2009, 3:49:45 AM12/28/09
to pon...@googlegroups.com
最近一个项目遇到的了一个多线程日志的问题。
由于多个线程共享一个日志文件,当高并发,日志信息较大时,会导致日志读写文件成为
服务的瓶颈。
所以,最近在想办法如何解决这个问题。
目前有两个想法:
1.每个线程写一个日志文件。然后用一个专门的日志服务器定期将这些日志文件进行整理

2.多个工作线程共享一个缓冲区,然后由一个单独的写日志进程负责定期写缓冲区的内容


大家有什么好的想法,讨论一下。

jinhu wang

unread,
Dec 28, 2009, 4:03:43 AM12/28/09
to pon...@googlegroups.com
一般做法都是用2.

2009/12/28 赵帅 <rost...@gmail.com>

chuang

unread,
Dec 28, 2009, 4:05:38 AM12/28/09
to pon...@googlegroups.com
用2 吧,经典的生产者消费者模型.

2009/12/28 jinhu wang <wangji...@gmail.com>



--
好装B,求甚解.

豆瓣:http://www.douban.com/people/Lichuang/
blog:http://www.cppblog.com/converse/

Simon Liu

unread,
Dec 28, 2009, 4:05:57 AM12/28/09
to pon...@googlegroups.com
单独做个日志服务器,用异步的方式往那边丢日志。

2009/12/28 jinhu wang <wangji...@gmail.com>



--
刘金雨(云涛)
Email/MSN/GTalk: yuntao.liu(AT)gmail.com

techabc

unread,
Dec 28, 2009, 4:37:16 AM12/28/09
to pon...@googlegroups.com
日志库如log4cplus等也不能满足要求?

2009/12/28 Simon Liu <yunta...@gmail.com>:

up duan

unread,
Dec 28, 2009, 5:10:10 AM12/28/09
to pon...@googlegroups.com
2009/12/28 Simon Liu <yunta...@gmail.com>
单独做个日志服务器,用异步的方式往那边丢日志。

看来日志服务器还是有用武之地的。

jun lin

unread,
Dec 28, 2009, 7:15:09 AM12/28/09
to pon...@googlegroups.com
每个线程有单独的ID,然后根据ID创建日志文件。

2009/12/28 up duan <fix...@gmail.com>

XiongJia Le

unread,
Dec 28, 2009, 7:33:07 AM12/28/09
to pon...@googlegroups.com
对日志本身做级别过滤...
把日志分级别 error, info, warring, debug...
在实际运行是动态配置 error 级的 log....info, warring, debug的直接跳过...减少数量...
或者做过 log limit 每秒只可以写多少个...超出的失败


2009/12/28 赵帅 <rost...@gmail.com>

郑海涛

unread,
Dec 28, 2009, 9:22:55 AM12/28/09
to pon...@googlegroups.com
java提供的logger基本上具有楼上所说的这几条了,还有就是给log文件一个大小限制,log循环计数,这样的优化。因为在操作很大的日志文件是很费时的。


2009/12/28 XiongJia Le <lexio...@gmail.com>

Shuo Chen

unread,
Dec 28, 2009, 9:45:22 AM12/28/09
to TopLanguage
你都没说你用什么语言,什么平台。

wu9961

unread,
Dec 28, 2009, 12:11:21 PM12/28/09
to pongba
如果是linux的话是不是可以考虑消息队列
 
 
2009-12-29

                               顺祝工作愉快,天天开心
~~~~~~~~~~~~~~~~~~~~~~~~~~~
Name:吴晓磊
~~~~~~~~~~~~~~~~~~~~~~~~~~~
 

发件人: jinhu wang
发送时间: 2009-12-28  17:04:10
收件人: pongba
抄送:
主题: Re: [TL] 求!多线程日志的解决方案
14(04-13-23-45-49).gif

Fuzhou Chen

unread,
Dec 28, 2009, 2:06:44 PM12/28/09
to pon...@googlegroups.com
一般这种情况下可有两个思路:
 
a) 找到你的log框架的性能瓶颈,修改代码。
b) 换一个性能合理的log框架。
 
对于b) 如果是Linux下的C/C++项目,我推荐syslog-ng。如果你们项目不允许替换框架,能给个
大概的描述解释一下你的框架是怎么设计的么?

2009/12/28 wu9961 <wu9...@gmail.com>



--
《采莲》·江南

为卿采莲兮涉水,为卿夺旗兮长战。为卿遥望兮辞宫阙,为卿白发兮缓缓歌。

另抄自蒜头的评论:http://www.douban.com/review/1573456/

  且祭一束紫琳秋,为一段落花流水的传说
  且饮一杯青花酒,为一场几多擦肩的错过
  且焚一卷旖旎念,为一腔抛付虚无的惜怜
  且歌一曲罢箜篌,为一刻良辰春宵的寂寞
14(04-13-23-45-49).gif

赵帅

unread,
Dec 28, 2009, 8:14:46 PM12/28/09
to pon...@googlegroups.com
我们现在只是考虑会有这种问题存在的可能性。
具体我们现在要做的是:
我们原来有一个本地的文件转换程序,现在想通过http 提供对外服务。
打算用java servlet,来一个服务请求,即有一个线程去完成这个服务,在这个线程里会调用这个文本转换程序(启动进程,命令行传参的方式)。
这个文件转换程序里原来是没有记录日志的,现在打算在这个程序里添加日志信息。

不管是日志,对这个做法有什么其他的意见,大家都可以随便提。
谢啦。
2009/12/29 Fuzhou Chen <cppo...@gmail.com>
14(04-13-23-45-49).gif

sagasw

unread,
Dec 28, 2009, 8:15:34 PM12/28/09
to pon...@googlegroups.com
Linux下可以参考DBus这种消息总线。

------------------------------------
C++, Lua, living in Dalian
http://sunxiunan.com/
http://twitter.com/sagasw
------------------------------------


2009/12/29 Fuzhou Chen <cppo...@gmail.com>
14(04-13-23-45-49).gif

Fuzhou Chen

unread,
Jan 3, 2010, 5:36:52 AM1/3/10
to pon...@googlegroups.com
如果要我给建议的话,得先回答几个问题,否则我们很难给出什么有意义的建议。

a) 这个文件转换器是什么语言写的?
b) 运行文件转换器的是什么操作系统?
c) 日志文件怎么存的?是所有转换器写入同一个文件,还是每个转换器写不同
    的日志文件?


如果是UNIX环境下的C程序,我比较倾向于syslog。相对而言这是成熟的log
协议,很多操作系统都支持,包括Windows,而且它本身支持多机多进程log
写入,省去了自己写log服务器的问题,最后它的配置资料网上也比较多。如果
是Java的话,可以通过protomatter访问syslog:
http://protomatter.sourceforge.net/latest/javadoc/com/protomatter/syslog/syslog-whitepaper.html

Windows上比较麻烦。首先它至少有两个不同的log体系(下面两个连接),其次
两套API写起来都非常麻烦,而且我没找到ava兼容的API,最后一点是我
印象里它们都喜欢存成二进制文件或XML,在我的环境里处理非常不方便。不
过好处是它们似乎都支持本地和远程session。
http://msdn.microsoft.com/en-us/library/bb540361%28VS.85%29.aspx
http://msdn.microsoft.com/en-us/library/aa385780%28VS.85%29.aspx

顺便说一句,DBus我认为不可取。虽然我知道它确实支持tcp,不过现在大部分
dbus应用还是单机应用,就我所知,暂时还没有实例表明它的多机环境性能可以
胜任日志这种特定的应用。虽然试试看无妨,但产品开发时我持谨慎态度。


2009/12/28 赵帅 <rost...@gmail.com>
14(04-13-23-45-49).gif

Shuo Chen

unread,
Jan 3, 2010, 6:07:43 AM1/3/10
to TopLanguage
Java 就用 logback 好啦。

On Dec 29 2009, 9:14 am, 赵帅 <rostin...@gmail.com> wrote:
> 我们现在只是考虑会有这种问题存在的可能性。
> 具体我们现在要做的是:
> 我们原来有一个本地的文件转换程序,现在想通过http 提供对外服务。
> 打算用java servlet,来一个服务请求,即有一个线程去完成这个服务,在这个线程里会调用这个文本转换程序(启动进程,命令行传参的方式)。
> 这个文件转换程序里原来是没有记录日志的,现在打算在这个程序里添加日志信息。
>
> 不管是日志,对这个做法有什么其他的意见,大家都可以随便提。
> 谢啦。

> 2009/12/29 Fuzhou Chen <cppof...@gmail.com>


>
> > 一般这种情况下可有两个思路:
>
> > a) 找到你的log框架的性能瓶颈,修改代码。
> > b) 换一个性能合理的log框架。
>
> > 对于b) 如果是Linux下的C/C++项目,我推荐syslog-ng。如果你们项目不允许替换框架,能给个
> > 大概的描述解释一下你的框架是怎么设计的么?
>
> > 2009/12/28 wu9961 <wu9...@gmail.com>
>
> > 如果是linux的话是不是可以考虑消息队列
>
> >> 2009-12-29

> >> ------------------------------
> >> 顺祝工作愉快,天天开心!


> >> ~~~~~~~~~~~~~~~~~~~~~~~~~~~
> >> Name:吴晓磊
> >> Email:wu9...@gmail.com
> >> Tel:13466558646
> >> ~~~~~~~~~~~~~~~~~~~~~~~~~~~
>

> >> ------------------------------
> >> *发件人:* jinhu wang
> >> *发送时间:* 2009-12-28 17:04:10
> >> *收件人:* pongba
> >> *抄送:*
> >> *主题:* Re: [TL] 求!多线程日志的解决方案
> >> 一般做法都是用2.
>
> >> 2009/12/28 赵帅 <rostin...@gmail.com>


>
> >>> 最近一个项目遇到的了一个多线程日志的问题。
> >>> 由于多个线程共享一个日志文件,当高并发,日志信息较大时,会导致日志读写文件成为
> >>> 服务的瓶颈。
> >>> 所以,最近在想办法如何解决这个问题。
> >>> 目前有两个想法:
> >>> 1.每个线程写一个日志文件。然后用一个专门的日志服务器定期将这些日志文件进行整理
> >>> 。
> >>> 2.多个工作线程共享一个缓冲区,然后由一个单独的写日志进程负责定期写缓冲区的内容
> >>> 。
>
> >>> 大家有什么好的想法,讨论一下。
>
> > --
> > 《采莲》·江南
>
> > 为卿采莲兮涉水,为卿夺旗兮长战。为卿遥望兮辞宫阙,为卿白发兮缓缓歌。
>
> > 另抄自蒜头的评论:http://www.douban.com/review/1573456/
>
> > 且祭一束紫琳秋,为一段落花流水的传说
> > 且饮一杯青花酒,为一场几多擦肩的错过
> > 且焚一卷旖旎念,为一腔抛付虚无的惜怜
> > 且歌一曲罢箜篌,为一刻良辰春宵的寂寞
>
>
>

> 14(04-13-23-45-49).gif
> 2KViewDownload

XingChao Wang

unread,
Jan 3, 2010, 9:05:53 PM1/3/10
to pon...@googlegroups.com
試試RCU 鎖. 寫進程copy-update,更新日志指針,并擇時釋放舊的副本。
thanks
--wang xingchao


2009/12/28 赵帅 <rost...@gmail.com>

Vince Jia

unread,
Jan 4, 2010, 11:04:59 PM1/4/10
to pon...@googlegroups.com
加个中间层(日志独立服务器),由各线程发送线程ID、日志信息至,与2中缓冲区方法也类似

2009/12/28 赵帅 <rost...@gmail.com>
Reply all
Reply to author
Forward
0 new messages