tail -f命令不能自动切换切片文件,例如日志是每100M生成一个新文件,tail -f不能自动的切换文件,必须关闭然后重新运行tail -f

此篇使用pyinotify,检测文件更新,并实现tail -f以外,还能自动识别切换切片文件。而且针对日志类型的文件做了单独样式优化。

运行 ./tailf.py + 文件路径。

此文件够自动从普通文本中,对日志就行着色处理,如果不是日志类型的文件,将直接输出,不进行着色处理。

tailf.py文件的实现代码如下:

 
import os
import sys
import re
import pyinotify DIRMASK = pyinotify.IN_MODIFY \
| pyinotify.IN_ATTRIB \
| pyinotify.IN_MOVE_SELF \
| pyinotify.IN_CREATE class Handler(pyinotify.ProcessEvent): def __init__(self, filename):
self._fh = None
self._path = filename super(Handler, self).__init__() def my_init(self):
try:
self._fh = open(self._path, 'r')
except IOError as e:
sys.stderr.write('open file failed, %s' % e)
else:
self._fh.seek(0, 2) def process_IN_CREATE(self, event):
path = self._path if path in os.path.join(event.path, event.name):
if hasattr(self, 'fh'):
self._fh.close() try:
self._fh = open(self._path, 'r')
except IOError as e:
sys.stderr.write('open file failed, %s' % e)
else:
self._fh.seek(0, 2) for r in self._fh.readlines():
# sys.stdout.write(r)
process_line(r) def process_IN_MODIFY(self, event):
path = self._path if path not in os.path.join(event.path, event.name):
return if not self._fh.closed:
for r in self._fh.readlines():
# sys.stdout.write(r)
process_line(r) def process_IN_MOVE_SELF(self, event):
path = self._path if path in os.path.join(event.path, event.name):
sys.stderr.write('monitor file move') def process_IN_ATTRIB(self, event):
pass class Tailer(object): def __init__(self, filename):
super(Tailer, self).__init__()
self._path = filename
self._notifier = None self._init() def __del__(self):
self._notifier.stop() def _init(self):
path = self._path index = path.rfind('/')
wm = pyinotify.WatchManager()
wm.add_watch(path[:index], DIRMASK) handler = Handler(path)
self._notifier = pyinotify.Notifier(wm, handler) def run(self):
self.read_last_10240_word()
while True:
self._notifier.process_events() if self._notifier.check_events():
self._notifier.read_events() def read_last_10240_word(self):
with open(self._path,'rb') as f:
f.seek(-10240,2)
for l in f.readlines():
# print(l.decode())
process_line(l.decode()) def process_line(line_str):
pass
#matcher = re.search(r'\d{4}-\d{2}-\d{2}.*?- (DEBUG|INFO|WARNING|ERROR|CRITICAL) -[\s\S]*?(File ".*?.py", line \d*)', line_str)
matcher = re.search(r'^\d{4}-\d{2}-\d{2}.*?(DEBUG|INFO|WARNING|ERROR|CRITICAL)', line_str)
if not matcher:
print(line_str)
else:
log_level_str = matcher.group(1)
if log_level_str == 'DEBUG':
print('\033[0;32m%s\033[0m' % line_str)
elif log_level_str == 'INFO':
print('\033[0;96m%s\033[0m' % line_str)
elif log_level_str == 'WARNING':
print('\033[0;33m%s\033[0m' % line_str)
elif log_level_str == 'ERROR':
print('\033[0;35m%s\033[0m' % line_str)
elif log_level_str == 'CRITICAL':
print('\033[0;31m%s\033[0m' % line_str) if __name__ == '__main__':
if len(sys.argv[1:]) != 1:
print('Usage: python tail.py </path/to/filename>')
sys.exit(0) path = sys.argv[1]
Tailer(path).run()

使用pyinotify实现加强版的linux tail -f 命令,并且对日志类型的文本进行单独优化着色显示。的更多相关文章

  1. windows下使用tail -f 命令查看实时日志

    经常在linux后台进行日志分析的同学对tail -f 这个命令肯定不陌生了,监控实时系统日志简直不要太方便.但是作为一个自动化测试工程师,我们的代码实际上在本地跑就够了,不需要部署,但是window ...

  2. tail -f 实时跟踪一个日志文件的输出内容

    tail -f  实时跟踪一个日志文件的输出内容 http://hittyt.iteye.com/blog/1927026 https://blog.csdn.net/mengxianhua/arti ...

  3. linux tail -f messages查看控制台失败

    [root@localhost log]# tail -f /var/log/messages ......................... tail: cannot watch `/var/l ...

  4. linux tail -f 和 tail -F的区别 && tail 的断点续传

    bash-1中启动如下进程while [ "true" ] ; do date >> test.log; sleep 1 ; done; bash-2中,tail -f ...

  5. linux之tail -F命令异常file truncated

    使用tail -F收集日志时,经常报出file truncated, 导致日志又重新读取.tail: `test.out' has appeared;  following end of new fi ...

  6. tail -f 命令暂停方法

    Linux 下查看日志时,使用 tail -f 可以不断的刷新日志信息. 例如: tail -f logs.log 此时要想暂停刷新,使用ctrl+s暂停终端.若想继续终端,使用ctrl+q. 若想退 ...

  7. Linux下f命令配置

    一.工具 f 的配置 使用 ========== ========== ========== ========== ========== ==========  ==== 一.配置方法: 首先在lin ...

  8. 关于linux的一点好奇心(四):tail -f文件跟踪实现

    关于文件跟踪,我们有很多的实际场景,比如查看某个系统日志的输出,当有变化时立即体现,以便进行问题排查:比如查看文件结尾的内容是啥,总之是刚需了. 1. 自己实现的文件跟踪 我们平时做功能开发时,也会遇 ...

  9. linux tail 命令详解

    linux ---tail命令 linux中tail命令---用于查看文件内容 最基本的是cat.more和less. 1. 如果你只想看文件的前5行,可以使用head命令,如: head -5 /e ...

随机推荐

  1. Jackson学习笔记(三)<转>

    概述 使用jackson annotations简化和增强的json解析与生成. Jackson-2.x通用annotations列表:https://github.com/FasterXML/jac ...

  2. 【进阶修炼】——改善C#程序质量(4)

    46, 显示释放资源,需要实现IDisposable接口. 最好按照微软建议的Dispose模式实现.实现了IDisposable接口后,在Using代码块中,垃圾会得到自动清理. 47, 即使提供了 ...

  3. DRUPAL8模版命名规则

    DRUPAL8模版命名规则   xiaopang 星期一, 04/08/2013 - 20:04 发布 我想了半个小时,想怎么清楚简单的为大家解释drupal8的模版命名规则,但是很显然,我失败了,但 ...

  4. Matlab——plot polyfit polyval

    p=polyfit(x,y,m) 其中, x, y为已知数据点向量, 分别表示横,纵坐标, m为拟合多项式的次数, 结果返回m次拟合多项式系数, 从高次到低次存放在向量p中. y0=polyval(p ...

  5. 8大排序算法总结 JS 实现

    //bubble sort ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 fun ...

  6. QTcpSocket的连续发送数据和连续接收数据

    关于这个问题折腾了我好久,以前做些小练习的时候,用QTcpSocket的write()一数据,然后接收方只要emit一个readyread()信号然后就用QTcpSocket的read()去读.本以为 ...

  7. JAVA中如何用接口实现多继承和多态 (非常好)

    ---------------------------------------------------------------多态1.JAVA里没有多继承,一个类之能有一个父类.而继承的表现就是多态. ...

  8. 关于Unity中的刚体和碰撞器的相关用法(二)

    在关于Unity中的刚体和碰撞器的相关用法(一)的基础上 有一个plane平面,一个ball球体,都挂了碰撞器,ball挂了刚体Rigidbody,写了一个脚本ball挂载在球体上,球体从空中落下装机 ...

  9. (笔记)Linux下C语言实现静态IP地址,掩码,网关的设置

    #include <sys/ioctl.h> #include <sys/types.h> #include <sys/socket.h> #include < ...

  10. JDBC删除数据实例

    在本教程将演示如何在JDBC应用程序中,删除数据库表中数据记录. 在执行以下示例之前,请确保您已经准备好以下操作: 具有数据库管理员权限,以在给定模式的数据库表中删除数据记录. 要执行以下示例,需要用 ...