python看门狗(watchdog)、多线程、实现文件夹实时监听、日志输出、备份

python看门狗(watchdog)、多线程、实现文件夹实时监听、日志输出、备份

代码展示

import _thread
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
import time
import shutil
from xml.dom.minidom import parse
import datetime as dt
import os
import logging

# 第一步,创建一个logger
logger = logging.getLogger()
logger.setLevel(logging.INFO)  # Log等级总开关
# 第二步,创建一个handler,用于写入日志文件
rq = time.strftime('%Y%m%d%H%M', time.localtime(time.time()))
log_path = os.path.dirname(os.getcwd()) + '/dycktozslogs/'
log_name = log_path + rq + '.log'
logfile = log_name
fh = logging.FileHandler(logfile, mode='w')
fh.setLevel(logging.DEBUG)  # 输出到file的log等级的开关
# 第三步,定义handler的输出格式
formatter = logging.Formatter("%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s")
fh.setFormatter(formatter)
# 第四步,将logger添加到handler里面
logger.addHandler(fh)


class MyDirEventHandler(FileSystemEventHandler):

    def on_moved(self, event):
        print(event)

    def on_created(self, event):
        _thread.start_new_thread(copy_remove_file, (event,))

    def on_deleted(self, event):
        print(event)

    def on_modified(self, event):
        print("modified:", event)


# 移动、备份报文
def copy_remove_file(event):
    time.sleep(6)
    try:
        # 年
        year = dt.datetime.now().strftime('%G')
        # 月
        month = dt.datetime.now().strftime('%m')
        # 日
        day = dt.datetime.now().strftime('%d')
        # 配置备份目录路径
        path ="D:\\Backup"
        path = os.path.join(path, year)
        path = os.path.join(path, month)
        path = os.path.join(path, day)
        # 判断备份路径是否存在
        if os.path.exists(path):
            try:
                shutil.copy(event.src_path, path)
            except shutil.Error:
                logger.error("备份文件出错,文件被占用:" + event.src_path)
                return
        else:
            try:
                os.makedirs(path)
            except Exception:
                logger.error("当文件已存在,无法创建该文件:" + path+"--报文路径:"+event.src_path)
            finally:
                try:
                    shutil.copy(event.src_path, path)
                except shutil.Error:
                    logger.error("备份文件出错,文件被占用:" + event.src_path)
                    return
        try:
            # 将文件移动到部署文凭文件夹
            zspath = "D:\\test2"
            if os.path.exists(zspath):
                shutil.move(event.src_path, zspath)
            else:
                try:
                    os.makedirs(zspath)
                except Exception:
                    logger.error("当文件已存在,无法创建该文件:" + path+"--报文路径:"+event.src_path)
                finally:
                    shutil.move(event.src_path, zspath)
        except shutil.Error:
            logger.error("移动文件出错,文件已经存在:" + event.src_path)
            return
        logger.info("增加文件的文件夹路径:" + event.src_path)

    except Exception as err:
        logger.error("程序运行报错了:" + event.src_path+",报错内容:"+err)
        return


"""
使用watchdog 监控文件的变化
"""
if __name__ == '__main__':
    # 创建观察者对象
    observer = Observer()
    # 创建事件处理对象
    fileHandler = MyDirEventHandler()

    # 为观察者设置观察对象与处理事件对象
    observer.schedule(fileHandler, "D:\\test1", True)
    observer.start()
    try:
        while True:
            time.sleep(2)
    except KeyboardInterrupt:
        print("500程序错误,文移动失败。")
        pass
    observer.join()

效果展示

python看门狗(watchdog)、多线程、实现文件夹实时监听、日志输出、备份_第1张图片

你可能感兴趣的:(报错笔记,python,开发语言)