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. jQuery.countdown倒计时插件

    https://github.com/hilios/jQuery.countdown 文档:http://hilios.github.io/jQuery.countdown/documentation ...

  2. docker监控

    [编者的话]这篇文章作者是Usman,他是服务器和基础架构工程师,有非常丰富的分布式构建经验.该篇文章主要分析评估了五种Docker监控工具,包括免费的和不免费的:Docker Stats.CAdvi ...

  3. 解决Linux里面未启用网卡的问题

    在Linux中可以使用ifconfig命令查询ip,如下图所示: 这时你会发现会提示command not found,说明安装的CentOS是简易版本的,其中一些命名没有,需要我们手动进行安装.安装 ...

  4. NetBeans Support Weblog

    https://blogs.oracle.com/NetBeansSupport/entry/tomcat_log_files ———————————————————————————————————— ...

  5. NetBeans Lookups Explained!

    https://dzone.com/articles/netbeans-lookups-explained —————————————————————————————————————————————— ...

  6. python2 python3 字符串 编码格式 处理

    使用python的ctypes调用c语言中的函数,传入字符串,打印输出异常.解决方法记录于此. 参考连接: http://blog.csdn.net/u011546806/article/detail ...

  7. SpringMVC小结

    一放下就生疏,所以要温故,所以要笔记. Tip,多数情况下,SpringMVC建议单例执行,Struts2建议多例执行. 原因就在于Struts2使用属性驱动或模型驱动,而SpringMVC则使用方法 ...

  8. Mac eclipse 编译、调试c++ 程序

    可以先安装个CDT插件: eclipse菜单 -> Help -> Install New Software... -> Work with (Add..) Name:CDT Loc ...

  9. 发现eclipse红叉,查看markers发现Target runtime Apache Tomcat 6.0 is not defined

    1.导入以前的项目(Markers中注意查看,就在console选项卡旁边),报以下错误,但不影响操作: Description Resource Path Location TypeTarget r ...

  10. wapp HTTP Error 404. The requested resource is not found.

    原因: 本地80端口被占用,需要修改WAMP的默认端口 修改设置: 找到 bin/apache/apache***/conf/httpd.conf文件 将文件中的80修改为8088 修改这两个地方端口 ...