使用pyinotify实现加强版的linux tail -f 命令,并且对日志类型的文本进行单独优化着色显示。
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 命令,并且对日志类型的文本进行单独优化着色显示。的更多相关文章
- windows下使用tail -f 命令查看实时日志
经常在linux后台进行日志分析的同学对tail -f 这个命令肯定不陌生了,监控实时系统日志简直不要太方便.但是作为一个自动化测试工程师,我们的代码实际上在本地跑就够了,不需要部署,但是window ...
- tail -f 实时跟踪一个日志文件的输出内容
tail -f 实时跟踪一个日志文件的输出内容 http://hittyt.iteye.com/blog/1927026 https://blog.csdn.net/mengxianhua/arti ...
- linux tail -f messages查看控制台失败
[root@localhost log]# tail -f /var/log/messages ......................... tail: cannot watch `/var/l ...
- linux tail -f 和 tail -F的区别 && tail 的断点续传
bash-1中启动如下进程while [ "true" ] ; do date >> test.log; sleep 1 ; done; bash-2中,tail -f ...
- linux之tail -F命令异常file truncated
使用tail -F收集日志时,经常报出file truncated, 导致日志又重新读取.tail: `test.out' has appeared; following end of new fi ...
- tail -f 命令暂停方法
Linux 下查看日志时,使用 tail -f 可以不断的刷新日志信息. 例如: tail -f logs.log 此时要想暂停刷新,使用ctrl+s暂停终端.若想继续终端,使用ctrl+q. 若想退 ...
- Linux下f命令配置
一.工具 f 的配置 使用 ========== ========== ========== ========== ========== ========== ==== 一.配置方法: 首先在lin ...
- 关于linux的一点好奇心(四):tail -f文件跟踪实现
关于文件跟踪,我们有很多的实际场景,比如查看某个系统日志的输出,当有变化时立即体现,以便进行问题排查:比如查看文件结尾的内容是啥,总之是刚需了. 1. 自己实现的文件跟踪 我们平时做功能开发时,也会遇 ...
- linux tail 命令详解
linux ---tail命令 linux中tail命令---用于查看文件内容 最基本的是cat.more和less. 1. 如果你只想看文件的前5行,可以使用head命令,如: head -5 /e ...
随机推荐
- linux异步IO--aio
简述 linux下异步方式有两种:异步通知和异步IO(AIO),异步通知请参考:linux异步通知 Linux的I/O机制经历了一下几个阶段的演进: 1. 同步阻塞I/O: 用户进程进行I/O操作,一 ...
- s9303这样的arp表是代表什么意思?
s9303这样的arp表是代表什么意思? 在s9303交换机下dis arp 看到了最末2条有这样的记录 那个Incomplete 是什么意思呢? 答: 如果该字段显示为“Incomplete”,表示 ...
- Extjs4 页面加载先白屏后显示的bug解决
通过Extjs MVC结构做好页面后,加载过程中发现,会瞬间白屏,然后呈现extjs界面的问题,当类似页面放置到iframe中时,会显得非常怪异. 可通过下图体验下. 当我单击“意见反馈”菜单,在右侧 ...
- sqoop 常见错误以及处理方式
Oracle: Connection Reset Errors 错误代码 // :: INFO mapred.JobClient: Task Id : attempt_201105261333_000 ...
- Android训练课程(Android Training) - 高效的显示图片
高效的显示图片(Displaying BitmapsEfficiently) 了解如何使用通用的技术来处理和读取位图对象,让您的用户界面(UI)组件是可响应的,并避免超过你的应用程序内存限制的方式.如 ...
- 轻量级ORM框架Dapper应用八:使用Dapper实现DTO
一.什么是DTO 先来看看百度百科的解释: 数据传输对象(DTO)(Data Transfer Object),是一种设计模式之间传输数据的软件应用系统.数据传输目标往往是数据访问对象从数据库中检索数 ...
- JavaScript系列文章:谈谈let和const
JavaScript系列文章:谈谈let和const 最近接触到ES6的一些相关新特性,想借let和const两个命令谈谈JavaScript在变量方面的改进. 由于let和const有很多相似之 ...
- Material Design 相关资源
Materialpalette -- Material配色工具 Materialup -- Material设计灵感: Material Design 相关好文: <超全面总结!深聊MATERI ...
- Netty实践
Netty是JBOSS针对网络开发的一套应用框架,它也是在NIO的基础上发展起来的.netty基于异步的事件驱动,具有高性能.高扩展性等特性,它提供了统一的底层协议接口,使得开发者从底层的网络协议(比 ...
- 记录第一次使用jni编译so包的入门操作
1.配置 下载自己相对应的ndk平台版本后配置到studio 在local.properties加入路径 在gradle.properties文件添加 2.创建工具类(注意方法都是native的) 3 ...