当前位置: 技术问答>linux和unix
对多线程的输出有重定向的方法吗?
来源: 互联网 发布时间:2016-03-20
本文导语: 最近开发了多线程的程序,由于想观察一下多线程各线程的工作情况。所以想把各个线程里的输出打印到各自的文件,以便观察各线程当时在处理什么.但是由于原来低层的函数是把各个线程的输出都打印到一个日志...
最近开发了多线程的程序,由于想观察一下多线程各线程的工作情况。所以想把各个线程里的输出打印到各自的文件,以便观察各线程当时在处理什么.但是由于原来低层的函数是把各个线程的输出都打印到一个日志的文件里的。所以现在想把日志都分开,不晓得如何能分开..不知道有什么重定向的函数不?再有一个疑问,由于日志打印出来会很大,所以再想搞一个控制台的程序..当运行这个控制台的时候,可以选择观察哪个线程的运行情况,并把信息打印到控制台上面,而不用生成日志文件..这是我的想法,大家有什么意见和好的想法尽管可以提出来。.
|
几个疑问。
1、你在考虑重定向函数?当然可以重定向,那要看你的log文件的处理方式是什么了。从你介绍的情况来看,你使用了底层的lib来实现。那么,这个底层的lib有多复杂呢?它提供了多少接口?你打算简单修改底层lib的文件出力处理么?如果只是打算这样,应该不算困难。
你可以先设定一个文件名的多线程对应的命名规则,然后考虑下述方法:A、每次输出一条记录到文件都打开指定文件,这样不同线程的出力文件都肯定不同了;B、建立文件索引表,每次输出一条记录到文件之前,都到索引表中查询,看是否存在本进程/本线程的输出文件,如果已存在,那么直接使用已打开的该文件描述符,如果未找到匹配文件描述符,那就打开新文件,并更新到索引表中。注意在线程结束的时候需要清除索引表中的对应信息。另外,需要注意索引表的查询/存储方式,这直接影响到你的响应速度。
2、关于控制台程序,也是可行的。这取决于你采用何种方法来写一个巨大的或者多个文件。如果是一个巨大的文件,简单的监视文件状态就行了。如果是多个文件,那就监视按规则命名的指定文件是否存在。
总结:事情就那么多,看你每天几十/几百兆的log文件数量,总归是花时间的。问题就是你是把时间花在输出端呢(采用多文件的处理方式,可以简化显示端的处理)?还是把时间花在显示端(采用解析现有的巨大文件的方法)?另外,管道操作(grep)应该是比较花时间的一种处理方式。可能会有更好的方法?这方面我没有研究过。再另外,如果你是想在执行进程的时候做到动态重定向,个人认为很困难,貌似shell的计算单位是进程而不是线程,你可以在shell里面得到指定线程的id号么?貌似不行的罢。
就那么多,供参考。
|
日志量大的情况可以修改打印函数,会很麻烦么?
比如你原来用event_log(...)
我现在#define event_log event_log_2 ,然后重写个event_log_2,想怎么写就怎么写,想写到哪就写到哪。
另外,我不觉得打印到一个文件里就难以整理,比如你叫full,你有test1,test2,test3等几个文件
cat full | grep test1 就可以得到你test1中输出的文件,如果你的log中有__FILE__的话。
比如你原来用event_log(...)
我现在#define event_log event_log_2 ,然后重写个event_log_2,想怎么写就怎么写,想写到哪就写到哪。
另外,我不觉得打印到一个文件里就难以整理,比如你叫full,你有test1,test2,test3等几个文件
cat full | grep test1 就可以得到你test1中输出的文件,如果你的log中有__FILE__的话。
|
如果所有的线程输出都是通过一个函数写入log文件中的,那么你直接改写这个函数让它直接输出到屏幕上不就可以了吗
|
用信号试试,本人菜鸟,仅供参考.
|
你可以这么写log
线程id,时间,"log内容"
这样任何可以读csv的程序都可以读你的log
线程id,时间,"log内容"
这样任何可以读csv的程序都可以读你的log
|
|
我觉得这说明你们的底层lib设计时没有考虑到这种问题,应该没有解决办法