您的位置:首页 > 大数据 > 人工智能

tail 实现 +注释

2016-03-15 21:07 489 查看
自己平时工作经常需要tail日志实时入库,近期学python,发现没有系统模块是实现tail功能的。
偶然在在github 上看到一份代码,有人自己写了 python-tail模块实现tail功能。
介绍如下: 先跳到文件末尾,然后不断的打印出新行,直到文件结束,然后再更新指针位置,最后再死循环重复上述过程 。

模块代码:
#!/usr/bin/env python

'''
Python-Tail - Unix tail follow implementation in Python.

python-tail can be used to monitor changes to a file.

Example:
import tail

# Create a tail instance
t = tail.Tail('file-to-be-followed')

# Register a callback function to be called when a new line is found in the followed file.
# If no callback function is registerd, new lines would be printed to standard out.
t.register_callback(callback_function)

# Follow the file with 5 seconds as sleep time between iterations.
# If sleep time is not provided 1 second is used as the default time.
t.follow(s=5) '''

# Author - Kasun Herath <kasunh01 at gmail.com>
# Source - https://github.com/kasun/python-tail 
import os
import sys
import time

class Tail(object):
''' Represents a tail command. '''
def __init__(self, tailed_file):
''' Initiate a Tail instance.
Check for file validity, assigns callback function to standard out.
Arguments:
tailed_file - File to be followed. '''

self.check_file_validity(tailed_file)
self.tailed_file = tailed_file
self.callback = sys.stdout.write

def follow(self, s=1):
''' Do a tail follow. If a callback function is registered it is called with every new line.
Else printed to standard out.
Arguments:
s - Number of seconds to wait between each iteration; Defaults to 1. '''

with open(self.tailed_file) as file_:
# Go to the end of file
file_.seek(0,2)
while True:
curr_position = file_.tell()
line = file_.readline()
if not line:
file_.seek(curr_position)
else:
self.callback(line)
time.sleep(s)

def register_callback(self, func):
''' Overrides default callback function to provided function. '''
self.callback = func

def check_file_validity(self, file_):
''' Check whether the a given file exists, readable and is a file '''
if not os.access(file_, os.F_OK):
raise TailError("File '%s' does not exist" % (file_))
if not os.access(file_, os.R_OK):
raise TailError("File '%s' not readable" % (file_))
if os.path.isdir(file_):
raise TailError("File '%s' is a directory" % (file_))

class TailError(Exception):
def __init__(self, msg):
self.message = msg
def __str__(self):
return self.message

使用模块案例:

#!/usr/bin/env python

'''
python-tail example.
Does a tail follow against /var/log/syslog with a time interval of 5 seconds.
Prints recieved new lines to standard out '''

import tail

def print_line(txt):
''' Prints received text '''
print(txt)

t = tail.Tail('/var/log/syslog')
t.register_callback(print_line)
t.follow(s=5)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: