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. [文件]Linux文本处理常用命令总结

    转自:https://www.cnblogs.com/sheeva/p/6406285.html 引子 作为一个偏爱windows的程序员,以前做文本处理的时候总是喜欢在windows下用notepa ...

  2. Android——Fragment过度动画分析一(转)

    Sliding Fragment 作者:小文字 出处:http://www.cnblogs.com/avenwu/   介绍:该案例为传统的Fragment增加了个性化的补间动画,其效果是原有frag ...

  3. 安装corel x8提示你已安装了另外一个版本

    如果之前安装了其他版本,提示安装不进去,需卸载visual c++ 2015 redistributable(x64)即可(测试环境是安装了x6后,x8安装不了) windows install cl ...

  4. android控制软键盘弹出方式

    android一把自带的软键盘弹出方式是会将布局顶上去,造成UI乱套的情况. 解决办法:方法一:在你的activity中的oncreate中setContentView之前写上这个代码getWindo ...

  5. Qt中如何根据类名来实例化对象

    对于Qt 来说,是可以做到运行时,根据对象的类名字(字符串)来获得对象的实例的,这点和一些语言的反射机制是一样的. 但是在Qt中,我们需要所额外的一步,就是注册.只要做到了注册,我们就可以 自由的创建 ...

  6. 自然语言交流系统 phxnet团队 创新实训 项目博客 (七)

    在本项目中使用到的“语音转文本”的技术总结: 语音转文本部分是调用的科大讯飞的在线语音,它的激发方式是按键,通过按钮触发开启安卓设备的录音,此部分需要在源码中写入关于安卓权限的要求,来调用安卓的录音权 ...

  7. Build 2016上一些令人兴奋的东西

    本来应该要更新Windows IOT开发入门的,但是由于Build 2016刚刚过去,不得不将一些令人兴奋的东西给大家进行分享. 首先对于错过这次直播的,可以在以下链接再次看到观看: https:// ...

  8. 2015年第六届蓝桥杯C/C++B组省赛题目解析

    一.奖券数目 有些人很迷信数字,比如带“4”的数字,认为和“死”谐音,就觉得不吉利.虽然这些说法纯属无稽之谈,但有时还要迎合大众的需求.某抽奖活动的奖券号码是5位数(10000-99999),要求其中 ...

  9. 查询sql server 表结构

    select column_name,data_type from information_schema.columns where table_name = '表名'

  10. 免费在线直播课,送给所有IT项目经理

     [免费在线直播课,送给所有IT项目经理]项目管理培训领域的老资格——光环国际,精心策划了一门一个半小时的在线直播课,送给所有辛苦的IT项目经理们.[直播主题]变化时代IT项目经理的成长要求[直播内容 ...