Python论坛  - 讨论区

标题:[python-chinese] 如何用python高效率的实现tail -f的功能?

2007年03月22日 星期四 09:58

马踏飞燕 honeyday.mj在gmail.com
星期四 三月 22 09:58:56 HKT 2007

*nix下面都有一个tail的命令,用来从尾部查看文件的。
我现在需要开多个log文件对象来动态的监控log文件的最新变化,考虑过用timer,但是每个log文件更新的时间是不一定的,这样一直打开关闭的会不会造成效率低下呢?
而且,每个log文件可能大到几十M的。

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年03月22日 星期四 10:11

Bruce Wang number5在gmail.com
星期四 三月 22 10:11:31 HKT 2007

On 3/22/07, 马踏飞燕 <honeyday.mj在gmail.com> wrote:
>
> *nix下面都有一个tail的命令,用来从尾部查看文件的。
>
> 我现在需要开多个log文件对象来动态的监控log文件的最新变化,考虑过用timer,但是每个log文件更新的时间是不一定的,这样一直打开关闭的会不会造成效率低下呢?
> 而且,每个log文件可能大到几十M的。
>

不可以先看一下所有log文件的timestamp,有更新的再打开么?

还有打开文件应该可以用memory map的方式,只读最后一段


-- 
simple is good
http://brucewang.net
skype: number5
-------------- 下一部分 --------------
一个HTML附件被移除...
URL: http://python.cn/pipermail/python-chinese/attachments/20070322/b51a00ce/attachment.html 

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年03月22日 星期四 10:35

BiFF qq274980在gmail.com
星期四 三月 22 10:35:10 HKT 2007

tail ÃüÁîÓÐÒ»¸ö tail -f ²ÎÊý£¬µ±Îļþ±ä»¯µÄʱºò×Ô¶¯×·¼ÓÏÔʾ£¬¿´¿´Ô´ÂëÊÇÔõôʵÏÖµÄ
       -f, --follow[={name|descriptor}]
              output appended data as the file grows; -f, --follow, and
--fol-
              low=descriptor are equivalent


ÔÚ07-3-22£¬Bruce Wang <number5在gmail.com> дµÀ£º
>
>
>
> On 3/22/07, Âí̤·ÉÑà <honeyday.mj在gmail.com> wrote:
> >
> > *nixÏÂÃ涼ÓÐÒ»¸ötailµÄÃüÁÓÃÀ´´Óβ²¿²é¿´ÎļþµÄ¡£
> >
> > ÎÒÏÖÔÚÐèÒª¿ª¶à¸ölogÎļþ¶ÔÏóÀ´¶¯Ì¬µÄ¼à¿ØlogÎļþµÄ×îб仯£¬¿¼ÂǹýÓÃtimer£¬µ«ÊÇÿ¸ölogÎļþ¸üеÄʱ¼äÊDz»Ò»¶¨µÄ£¬ÕâÑùÒ»Ö±´ò¿ª¹Ø±ÕµÄ»á²»»áÔì³ÉЧÂʵÍÏÂÄØ£¿
> > ¶øÇÒ£¬Ã¿¸ölogÎļþ¿ÉÄÜ´óµ½¼¸Ê®MµÄ¡£
> >
>
> ²»¿ÉÒÔÏÈ¿´Ò»ÏÂËùÓÐlogÎļþµÄtimestamp£¬ÓиüеÄÔÙ´ò¿ªÃ´£¿
>
> »¹Óдò¿ªÎļþÓ¦¸Ã¿ÉÒÔÓÃmemory mapµÄ·½Ê½£¬Ö»¶Á×îºóÒ»¶Î
>
>
> --
> simple is good
> http://brucewang.net
> skype: number5
> _______________________________________________
> python-chinese
> Post: send python-chinese在lists.python.cn
> Subscribe: send subscribe to python-chinese-request在lists.python.cn
> Unsubscribe: send unsubscribe to  python-chinese-request在lists.python.cn
> Detail Info: http://python.cn/mailman/listinfo/python-chinese
>
-------------- 下一部分 --------------
Ò»¸öHTML¸½¼þ±»ÒƳý...
URL: http://python.cn/pipermail/python-chinese/attachments/20070322/64f20c2c/attachment.htm 

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年03月22日 星期四 10:48

sy5tem open8sd在gmail.com
星期四 三月 22 10:48:17 HKT 2007

http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/414771
http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/414771/index_txt

'''Does tail -f on log files in a given directory.
The display is in chronological order of the logged lines,
given that the first column of log files is timestamp.
It can be altered to fit other formats too'''

不知这个资料有不有帮助,我太菜了,只看得懂基本的,讨论得太深奥了,还要向大家多学习.
-------------- 下一部分 --------------
一个HTML附件被移除...
URL: http://python.cn/pipermail/python-chinese/attachments/20070322/b9141d93/attachment.html 

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年03月22日 星期四 10:58

IQDoctor huanghao.c在gmail.com
星期四 三月 22 10:58:17 HKT 2007

please see http://blog.chinaunix.net/u/22178/showart_148016.html

tail.c


马踏飞燕 写道:
> *nix下面都有一个tail的命令,用来从尾部查看文件的。
> 我现在需要开多个log文件对象来动态的监控log文件的最新变化,考虑过用timer,但是每个log文件更新的时间是不一定的,这样一直打开关闭的会不会造成效率低下呢?
> 而且,每个log文件可能大到几十M的。
> _______________________________________________
> python-chinese
> Post: send python-chinese at lists.python.cn
> Subscribe: send subscribe to python-chinese-request at lists.python.cn
> Unsubscribe: send unsubscribe to  python-chinese-request at lists.python.cn
> Detail Info: http://python.cn/mailman/listinfo/python-chinese


[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年03月22日 星期四 11:33

weizi nmweizi在163.com
星期四 三月 22 11:33:34 HKT 2007

以前写过一个,不知道能否帮到你。


#!/usr/bin/env python
#--*-- coding: utf-8 --*--
import os
import sys
import time

"""
查看文件最后一行。
Author: weizi <nmweizi在gmail.com>, 2006   
Usage:
    tailtest.py [file]  


"""

class Tail:
    def __init__(self,inputstream):
        self.inputstream=inputstream
        self.inputstream.seek(0,2)
        
    def tail(self):
        #self.tell = self.inputstream.tell()
        line=self.inputstream.readline().strip()
        while line:
            print line
            line=self.inputstream.readline().strip()
        
if __name__=="__main__":
    if len(sys.argv)<=1:
        print "You must type a log file name"
        sys.exit()
    arg=file(sys.argv[1])
    t = Tail(arg)
    while(arg):
        try:
            time.sleep(2)
            t.tail()
        except KeyboardInterrupt:
            arg.close()
            print "File closed"
            sys.exit(1)



-----邮件原件-----
发件人: python-chinese-bounces在lists.python.cn [mailto:python-chinese-bounces在lists.python.cn] 代表 IQDoctor
发送时间: 2007年3月22日 10:58
收件人: python-chinese在lists.python.cn
主题: Re: [python-chinese] 如何用python高效率的实现tail -f的功能?

please see http://blog.chinaunix.net/u/22178/showart_148016.html

tail.c


马踏飞燕 写道:
> *nix下面都有一个tail的命令,用来从尾部查看文件的。
> 我现在需要开多个log文件对象来动态的监控log文件的最新变化,考虑过用timer,但是每个log文件更新的时间是不一定的,这样一直打开关闭的会不会造成效率低下呢?
> 而且,每个log文件可能大到几十M的。
> _______________________________________________
> python-chinese
> Post: send python-chinese在lists.python.cn
> Subscribe: send subscribe to python-chinese-request在lists.python.cn
> Unsubscribe: send unsubscribe to  python-chinese-request在lists.python.cn
> Detail Info: http://python.cn/mailman/listinfo/python-chinese

_______________________________________________
python-chinese
Post: send python-chinese在lists.python.cn
Subscribe: send subscribe to python-chinese-request在lists.python.cn
Unsubscribe: send unsubscribe to  python-chinese-request在lists.python.cn
Detail Info: http://python.cn/mailman/listinfo/python-chinese

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年03月22日 星期四 13:23

LI Xin delphij在delphij.net
星期四 三月 22 13:23:45 HKT 2007

马踏飞燕 wrote:
> *nix下面都有一个tail的命令,用来从尾部查看文件的。
> 我现在需要开多个log文件对象来动态的监控log文件的最新变化,考虑过用timer,但是每个log文件更新的时间是不一定的,这样一直打开关闭的会不会造成效率低下呢?
> 而且,每个log文件可能大到几十M的。

FreeBSD中,可以使用kevent ("kqueue")机制来监测vnode的变化(可以同时看着多
个打开的vnode)。

具体的C实现可以参考:

http://www.freebsd.org/cgi/cvsweb.cgi/src/usr.bin/tail/forward.c?annotate=1.41

Python可以借助 py-kqueue (devel/py-kqueue) 调用 FreeBSD 的 kqueue 支持。

Cheers,
-- 
Xin LI <delphij在delphij.net>	http://www.delphij.net/
FreeBSD - The Power to Serve!

-------------- 下一部分 --------------
一个非文本附件被清除...
发信人: %(who)s
主题: %(subject)s
日期: %(date)s
大小: 249
Url: http://python.cn/pipermail/python-chinese/attachments/20070322/87f2f296/attachment.pgp 

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年03月22日 星期四 19:52

Marco marco在waven.com
星期四 三月 22 19:52:54 HKT 2007

Linux很久就有了, 叫inotify

python也有支持:
python-pyinotify

On 3/22/07, LI Xin <delphij在delphij.net> wrote:
> 马踏飞燕 wrote:
> > *nix下面都有一个tail的命令,用来从尾部查看文件的。
> >
> 我现在需要开多个log文件对象来动态的监控log文件的最新变化,考虑过用timer,但是每个log文件更新的时间是不一定的,这样一直打开关闭的会不会造成效率低下呢?
> > 而且,每个log文件可能大到几十M的。
>
> FreeBSD中,可以使用kevent ("kqueue")机制来监测vnode的变化(可以同时看着多
> 个打开的vnode)。
>
> 具体的C实现可以参考:
>
> http://www.freebsd.org/cgi/cvsweb.cgi/src/usr.bin/tail/forward.c?annotate=1.41
>
> Python可以借助 py-kqueue (devel/py-kqueue) 调用 FreeBSD 的 kqueue 支持。
>
> Cheers,
> --
> Xin LI <delphij在delphij.net>	http://www.delphij.net/
> FreeBSD - The Power to Serve!
>
>


-- 
LinuX Power

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年03月22日 星期四 23:33

LI Xin delphij在delphij.net
星期四 三月 22 23:33:56 HKT 2007

Marco wrote:
> Linux很久就有了, 叫inotify
> 
> python也有支持:
> python-pyinotify

如果没记错,inotify这个接口应该是2004年出现的。晚了整整4年重新设计了一个
轮子,接口居然还只能支持"i"的操作(题外话,作为一个VFS层次的东西,它的名
字显然应该是"v"),我相信以他们的个性,这个KPI迟早还会再推倒重写,建议大
家等Linux Kernel 2.8的时候这个接口没人提出反对再决定是否使用。

Cheers,
-- 
Xin LI <delphij在delphij.net>	http://www.delphij.net/
FreeBSD - The Power to Serve!

-------------- 下一部分 --------------
一个非文本附件被清除...
发信人: %(who)s
主题: %(subject)s
日期: %(date)s
大小: 249
Url: http://python.cn/pipermail/python-chinese/attachments/20070322/52c37ee2/attachment.pgp 

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年03月23日 星期五 01:02

Davies Liu davies.liu在gmail.com
星期五 三月 23 01:02:01 HKT 2007

µÈµ½ÄÇʱºò½Ó¿Ú±äÁË, ÔÙ¸Ä×Ô¼ºµÄ´úÂëÒ²ÐÐѽ

On 3/22/07, LI Xin <delphij在delphij.net> wrote:
>
> Marco wrote:
> > LinuxºÜ¾Ã¾ÍÓÐÁË£¬ ½Ðinotify
> >
> > pythonÒ²ÓÐÖ§³Ö£º
> > python-pyinotify
>
> Èç¹ûû¼Ç´í£¬inotifyÕâ¸ö½Ó¿ÚÓ¦¸ÃÊÇ2004Äê³öÏֵġ£ÍíÁËÕûÕû4ÄêÖØÐÂÉè¼ÆÁËÒ»¸ö
> ÂÖ×Ó£¬½Ó¿Ú¾ÓÈ»»¹Ö»ÄÜÖ§³Ö"i"µÄ²Ù×÷£¨ÌâÍâ»°£¬×÷Ϊһ¸öVFS²ã´ÎµÄ¶«Î÷£¬ËüµÄÃû
> ×ÖÏÔȻӦ¸ÃÊÇ"v"£©£¬ÎÒÏàÐÅÒÔËûÃǵĸöÐÔ£¬Õâ¸öKPI³ÙÔ绹»áÔÙÍƵ¹ÖØд£¬½¨Òé´ó
> ¼ÒµÈLinux Kernel 2.8µÄʱºòÕâ¸ö½Ó¿ÚûÈËÌá³ö·´¶ÔÔÙ¾ö¶¨ÊÇ·ñʹÓá£
>
> Cheers,
> --
> Xin LI <delphij在delphij.net>    http://www.delphij.net/
> FreeBSD - The Power to Serve!
>
>
> _______________________________________________
> python-chinese
> Post: send python-chinese在lists.python.cn
> Subscribe: send subscribe to python-chinese-request在lists.python.cn
> Unsubscribe: send unsubscribe to  python-chinese-request在lists.python.cn
> Detail Info: http://python.cn/mailman/listinfo/python-chinese
>
>


-- 
Davies Liu
My Blog: http://blog.daviesliu.net/
-------------- 下一部分 --------------
Ò»¸öHTML¸½¼þ±»ÒƳý...
URL: http://python.cn/pipermail/python-chinese/attachments/20070323/da182316/attachment.html 

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年03月24日 星期六 00:24

马踏飞燕 honeyday.mj在gmail.com
星期六 三月 24 00:24:37 HKT 2007

在 07-3-22,weizi<nmweizi在163.com> 写道:
>
> 以前写过一个,不知道能否帮到你。
>
>
> #!/usr/bin/env python
> #--*-- coding: utf-8 --*--
> import os
> import sys
> import time
>
> """
> 查看文件最后一行。
> Author: weizi <nmweizi在gmail.com>, 2006
> Usage:
>    tailtest.py [file]
>
>
> """
>
> class Tail:
>    def __init__(self,inputstream):
>        self.inputstream=inputstream
>        self.inputstream.seek(0,2)
>
>    def tail(self):
>        #self.tell = self.inputstream.tell()
>        line=self.inputstream.readline().strip()
>        while line:
>            print line
>            line=self.inputstream.readline().strip()
>
> if __name__=="__main__":
>    if len(sys.argv)<=1:
>        print "You must type a log file name"
>        sys.exit()
>    arg=file(sys.argv[1])
>    t = Tail(arg)
>    while(arg):
>        try:
>            time.sleep(2)
>            t.tail()
>        except KeyboardInterrupt:
>            arg.close()
>            print "File closed"
>            sys.exit(1)
>
>

谢谢!
不过我现在要分析的log文件可能一下子写入几十行的,如果只用计时器和最后以行的方式来读取的话很容易漏掉很多的行的。

我的想法是能否接获操作系统的事件,比如对该log文件的打开和写入的操作,接下来就用python来把它读出来。

再不行的话我就只能用一个外部的指针来标识当前读的行数,然后定时的从指针的位置读到尾部了。

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年03月26日 星期一 09:41

weizi nmweizi在163.com
星期一 三月 26 09:41:27 HKT 2007

这个程序可以支持多行。不会遗漏。

-----邮件原件-----
发件人: python-chinese-bounces在lists.python.cn [mailto:python-chinese-bounces在lists.python.cn] 代表 马踏飞燕
发送时间: 2007年3月24日 0:25
收件人: python-chinese在lists.python.cn
主题: Re: [python-chinese]答复: 如何用python高效率的实现tail -f的功能?

在 07-3-22,weizi<nmweizi在163.com> 写道:
>
> 以前写过一个,不知道能否帮到你。
>
>
> #!/usr/bin/env python
> #--*-- coding: utf-8 --*--
> import os
> import sys
> import time
>
> """
> 查看文件最后一行。
> Author: weizi <nmweizi在gmail.com>, 2006
> Usage:
>    tailtest.py [file]
>
>
> """
>
> class Tail:
>    def __init__(self,inputstream):
>        self.inputstream=inputstream
>        self.inputstream.seek(0,2)
>
>    def tail(self):
>        #self.tell = self.inputstream.tell()
>        line=self.inputstream.readline().strip()
>        while line:
>            print line
>            line=self.inputstream.readline().strip()
>
> if __name__=="__main__":
>    if len(sys.argv)<=1:
>        print "You must type a log file name"
>        sys.exit()
>    arg=file(sys.argv[1])
>    t = Tail(arg)
>    while(arg):
>        try:
>            time.sleep(2)
>            t.tail()
>        except KeyboardInterrupt:
>            arg.close()
>            print "File closed"
>            sys.exit(1)
>
>

谢谢!
不过我现在要分析的log文件可能一下子写入几十行的,如果只用计时器和最后以行的方式来读取的话很容易漏掉很多的行的。

我的想法是能否接获操作系统的事件,比如对该log文件的打开和写入的操作,接下来就用python来把它读出来。

再不行的话我就只能用一个外部的指针来标识当前读的行数,然后定时的从指针的位置读到尾部了。
_______________________________________________
python-chinese
Post: send python-chinese在lists.python.cn
Subscribe: send subscribe to python-chinese-request在lists.python.cn
Unsubscribe: send unsubscribe to  python-chinese-request在lists.python.cn
Detail Info: http://python.cn/mailman/listinfo/python-chinese

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

如下红色区域有误,请重新填写。

    你的回复:

    请 登录 后回复。还没有在Zeuux哲思注册吗?现在 注册 !

    Zeuux © 2025

    京ICP备05028076号