Python pyinotify日志监控系统处理日志的方法


Posted in Python onMarch 08, 2018

前言

最近项目中遇到一个用于监控日志文件的Python包pyinotify,结合自己的项目经验和网上的一些资料总结一下,总的原理是利用pyinotify模块监控日志文件夹,当日志到来的情况下,触发相应的函数进行处理,处理完毕后删除日志文件的过程,下面就着重介绍下pyinotify

pyinotify

Pyinotify是一个Python模块,用来监测文件系统的变化。 Pyinotify依赖于Linux内核的功能—inotify(内核2.6.13合并)。 inotify的是一个事件驱动的通知器,其通知接口通过三个系统调用从内核空间到用户空间。pyinotify结合这些系统调用,并提供一个顶级的抽象和一个通用的方式来处理这些功能。

  1. pyinotify 说百了就是通过 调用系统的inotify来实现通知的
  2. inotify 既可以监视文件,也可以监视目录
  3. Inotify 使用系统调用而非 SIGIO 来通知文件系统事件。

Inotify 可以监视的文件系统事件包括:

Event Name Is an Event Description
IN_ACCESS Yes file was accessed.
IN_ATTRIB Yes metadata changed.
IN_CLOSE_NOWRITE Yes unwrittable file was closed.
IN_CLOSE_WRITE Yes writtable file was closed.
IN_CREATE Yes file/dir was created in watched directory.
IN_DELETE Yes file/dir was deleted in watched directory.
IN_DELETE_SELF Yes 自删除,即一个可执行文件在执行时删除自己
IN_DONT_FOLLOW No don't follow a symlink (lk 2.6.15).
IN_IGNORED Yes raised on watched item removing. Probably useless for you, prefer instead IN_DELETE*.
IN_ISDIR No event occurred against directory. It is always piggybacked to an event. The Event structure automatically provide this information (via .is_dir)
IN_MASK_ADD No to update a mask without overwriting the previous value (lk 2.6.14). Useful when updating a watch.
IN_MODIFY Yes file was modified.
IN_MOVE_SELF Yes 自移动,即一个可执行文件在执行时移动自己
IN_MOVED_FROM Yes file/dir in a watched dir was moved from X. Can trace the full move of an item when IN_MOVED_TO is available too, in this case if the moved item is itself watched, its path will be updated (see IN_MOVE_SELF).
IN_MOVED_TO Yes file/dir was moved to Y in a watched dir (see IN_MOVE_FROM).
IN_ONLYDIR No only watch the path if it is a directory (lk 2.6.15). Usable when calling .add_watch.
IN_OPEN Yes file was opened.
IN_Q_OVERFLOW Yes event queued overflowed. This event doesn't belongs to any particular watch.
IN_UNMOUNT Yes 宿主文件系统被 umount

IN_ACCESS,即文件被访问

IN_MODIFY,文件被write

IN_ATTRIB,文件属性被修改,如chmod、chown、touch等

IN_CLOSE_WRITE,可写文件被close

IN_CLOSE_NOWRITE,不可写文件被close

IN_OPEN,文件被open

IN_MOVED_FROM,文件被移走,如mv

IN_MOVED_TO,文件被移来,如mv、cp

IN_CREATE,创建新文件

IN_DELETE,文件被删除,如rm

IN_DELETE_SELF,自删除,即一个可执行文件在执行时删除自己

IN_MOVE_SELF,自移动,即一个可执行文件在执行时移动自己

IN_UNMOUNT,宿主文件系统被umount

IN_CLOSE,文件被关闭,等同于(IN_CLOSE_WRITE | IN_CLOSE_NOWRITE)

IN_MOVE,文件被移动,等同于(IN_MOVED_FROM | IN_MOVED_TO)

pyinotify使用例子

#!/usr/bin/python
# coding:utf-8
import os
from pyinotify import WatchManager, Notifier,ProcessEvent,IN_DELETE, IN_CREATE,IN_MODIFY
class EventHandler(ProcessEvent):

 """事件处理"""
 def process_IN_CREATE(self, event):
 print "Create file: %s " % os.path.join(event.path,event.name)

 def process_IN_DELETE(self, event):
 print "Delete file: %s " % os.path.join(event.path,event.name)

 def process_IN_MODIFY(self, event):
 print "Modify file: %s " % os.path.join(event.path,event.name)
 

def FSMonitor(path='.'):
 wm = WatchManager() 
 mask = IN_DELETE | IN_CREATE |IN_MODIFY
 notifier = Notifier(wm, EventHandler())
 wm.add_watch(path, mask,auto_add=True,rec=True)
 print 'now starting monitor %s'%(path)
 while True:
 try:
  notifier.process_events()
  if notifier.check_events():
  notifier.read_events()
 except KeyboardInterrupt:
  notifier.stop()
  break
if __name__ == "__main__":
 FSMonitor('/root/softpython/apk_url')

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python学习笔记(二)基础语法
Jun 06 Python
Python 爬虫多线程详解及实例代码
Oct 08 Python
python 专题九 Mysql数据库编程基础知识
Mar 16 Python
Tensorflow实现神经网络拟合线性回归
Jul 19 Python
Pytest框架之fixture的详细使用教程
Apr 07 Python
通过Python实现Payload分离免杀过程详解
Jul 13 Python
几款Python编译器比较与推荐(小结)
Oct 15 Python
Python中使用aiohttp模拟服务器出现错误问题及解决方法
Oct 31 Python
Python+Appium新手教程
Apr 17 Python
Python 中的 copy()和deepcopy()
Nov 07 Python
Appium中scroll和drag_and_drop根据元素位置滑动
Feb 15 Python
如何利用python实现Simhash算法
Jun 28 Python
TensorFlow模型保存和提取的方法
Mar 08 #Python
火车票抢票python代码公开揭秘!
Mar 08 #Python
Python实现定时备份mysql数据库并把备份数据库邮件发送
Mar 08 #Python
python实现12306抢票及自动邮件发送提醒付款功能
Mar 08 #Python
TensorFlow模型保存/载入的两种方法
Mar 08 #Python
python2.7 json 转换日期的处理的示例
Mar 07 #Python
教你用Python创建微信聊天机器人
Mar 31 #Python
You might like
一个经典的PHP验证码类分享
2014/11/18 PHP
PHP+Ajax无刷新带进度条图片上传示例
2017/02/08 PHP
浅析PHP中json_encode与json_decode的区别
2020/07/15 PHP
jquery插件jbox使用iframe关闭问题
2009/02/09 Javascript
javascript 密码强弱度检测万能插件
2009/02/25 Javascript
更换select下拉菜单背景样式的实现代码
2011/12/20 Javascript
firefox下jquery iframe刷新页面提示会导致重复之前动作
2012/12/17 Javascript
枚举的实现求得1-1000所有出现1的数字并计算出现1的个数
2013/09/10 Javascript
JS对文本框值的判断示例
2014/03/10 Javascript
JavaScript生成的动态下雨背景效果实现方法
2015/02/25 Javascript
使用nodejs下载风景壁纸
2017/02/05 NodeJs
详解node.js搭建代理服务器请求数据
2017/04/08 Javascript
JS实现基于拖拽改变物体大小的方法
2018/01/23 Javascript
深入理解vue中slot与slot-scope的具体使用
2018/01/26 Javascript
vue鼠标移入添加class样式,鼠标移出去除样式(active)实现方法
2018/08/22 Javascript
vue2 拖动排序 vuedraggable组件的实现
2019/08/08 Javascript
JS实现audio音频剪裁剪切复制播放与上传(步骤详解)
2020/07/28 Javascript
零基础写python爬虫之使用urllib2组件抓取网页内容
2014/11/04 Python
Python操作MySQL简单实现方法
2015/01/26 Python
python中字典dict常用操作方法实例总结
2015/04/04 Python
在Python中操作字典之fromkeys()方法的使用
2015/05/21 Python
Python的Twisted框架上手前所必须了解的异步编程思想
2016/05/25 Python
用python找出那些被“标记”的照片
2017/04/20 Python
Python判断两个对象相等的原理
2017/12/12 Python
python实现教务管理系统
2018/03/12 Python
使用python绘制二元函数图像的实例
2019/02/12 Python
python基于socket实现的UDP及TCP通讯功能示例
2019/11/01 Python
python中数字是否为可变类型
2020/07/08 Python
详解CSS3中使用gradient实现渐变效果的方法
2015/08/18 HTML / CSS
乐高官方旗舰店:LEGO积木玩具
2019/04/06 全球购物
牵手50新加坡:专为黄金岁月的单身人士而设的交友网站
2020/08/16 全球购物
你对IPv6了解程度
2016/02/09 面试题
幼儿园六一活动总结
2014/08/27 职场文书
县政府办公室领导班子个人对照检查材料
2014/09/16 职场文书
2019员工保密协议书(3篇)
2019/09/23 职场文书
解决vue自定义组件@click点击失效问题
2022/04/30 Vue.js