自动提交日志脚本(2)状态机管理

news2024/11/18 9:49:11

使用状态机作为管理
在这里插入图片描述

"""
@filename:statusHandle.py
@author:LinXingNan
@time:2023-11-27
"""
import os
from enum import Enum

import configHandle
import emailReport
import logHandle
import timeHandle
import logging
from datetime import datetime

# 创建log文件夹(如果不存在)
log_folder = "log"
os.makedirs(log_folder, exist_ok=True)

# 配置日志格式
logging.basicConfig(
    filename=f"{log_folder}/{datetime.now().strftime('%Y-%m-%d')}.log",
    level=logging.DEBUG,
    format="%(asctime)s [%(levelname)s]: %(message)s",
    datefmt="%Y-%m-%d %H:%M:%S",
)


class Status(Enum):
    WAIT_LOGIN = 0
    IDLE = 1
    LOG = 2
    REPORT = 3
    ERROR = 4
    INIT_FILE = 5


# 状态
web_log_status = Status.WAIT_LOGIN
# 是否写日志成功
is_write_log_success = False
# 错误计数
fail_login_count = 0
fail_write_log_count = 0
# 日志内容
today_write_log = "今日休息"
# 日期和写日志成功标志
save_json_data = {
    "date": "1234",
    "is_write_log_success": False,
    "log_data": "日志内容",
    "write_time": "1234",
}


def web_log_status_change():
    global web_log_status, fail_login_count, fail_write_log_count, is_write_log_success
    if web_log_status == Status.WAIT_LOGIN:
        ret = logHandle.do_login()  # 登录账号
        if ret:
            web_log_status = Status.INIT_FILE
            logging.info("登录成功.")
        else:
            fail_login_count = fail_login_count + 1
            print("登录失败")
            logging.error("登录失败.")
            if fail_login_count >= configHandle.config_fail_login_count:
                web_log_status = Status.REPORT
    elif web_log_status == Status.INIT_FILE:  # 读取文件
        web_log_status = Status.IDLE
        is_write_log_success = False
        print("文件路径 " + configHandle.get_file_path())
        if os.path.exists(configHandle.get_file_path()):
            # 从文件中加载数据
            loaded_json_data = configHandle.load_json_from_file(
                configHandle.get_file_path()
            )
            # 获取 "is_write_log_success" 的值
            if loaded_json_data != {}:
                is_write_log_success = loaded_json_data.get("is_write_log_success")
                print("不是空的文件 " + str(is_write_log_success))
        else:
            print("文件不存在")
    elif web_log_status == Status.IDLE:  # 空闲状态
        save_json_data["date"] = timeHandle.get_midnight_timestamp()
        ret = False
        if not is_write_log_success:
            print("今天的日志还没写")
            logging.info("今天的日志还没写.")
            ret = timeHandle.is_time_reached(8, 30)  # 判断时间
        else:
            print("今天的日志已经写了")
            web_log_status = Status.INIT_FILE
        if ret:
            print("到点写日志了")
            logging.info("到点写日志了.")
            web_log_status = Status.LOG
    elif web_log_status == Status.LOG:  # 写日志
        ret = logHandle.do_write_log(today_write_log)
        if ret:
            web_log_status = Status.REPORT
            is_write_log_success = True
            logging.info("写日志成功.")
        else:
            print("写日志失败")
            logging.info("写日志失败.")
            web_log_status = Status.WAIT_LOGIN
            fail_write_log_count = fail_write_log_count + 1
            if fail_write_log_count >= configHandle.config_fail_write_count:
                web_log_status = Status.REPORT

    elif web_log_status == Status.REPORT:  # 给邮箱发邮件
        data = ""
        data = data + "登录错误次数:" + str(fail_login_count) + "\r\n"
        data = data + "写日志失败次数:" + str(fail_write_log_count) + "\r\n"
        data = data + "写日志是否成功:" + str(is_write_log_success) + "\r\n"
        data = data + "日期:" + timeHandle.get_current_date_string() + "\r\n"
        email_data = {"title": "写日志是否成功: " + str(is_write_log_success), "content": data}
        logging.info("发送邮件:" + str(email_data))
        emailReport.do_report(email_data)
        if is_write_log_success:
            save_json_data["is_write_log_success"] = True
            save_json_data["save_json_data"] = today_write_log
            save_json_data["write_time"] = timeHandle.get_current_date_string()
            print(save_json_data)
            configHandle.save_json_to_file(save_json_data, configHandle.get_file_path())
            fail_write_log_count = 0
            fail_write_log_count = 0
            is_write_log_success = False
            web_log_status = Status.INIT_FILE
            logging.info("写日志成功了")
        else:
            print("暂停写日志")
            logging.error("暂停写日志")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1270247.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

flask中路由route根据字典ID展示部分内容,字典名展示全部内容

from flask import Flask, jsonify , request,render_template,app Flask(__name__)app.config[JSON_AS_ASCII] Falsebooks [{"id": 1, "name": 三国演义},{"id": 2, "name": 水浒传},{"id": 3, "name": 西游记…

【UE】热成像效果

效果 步骤 1. 新建一个空白项目,勾选“光线追踪”选项 2. 添加一个第一人称游戏内容包到项目 3. 打开第一人称角色蓝图“BP_FirstPersonCharacter”,添加一个后期处理组件 在事件图表中设置通过按键N来切换不同的后期处理效果 将后期处理设置引脚提升为…

后端Long型数据传到前端js后精度丢失的问题

假设一个场景,MybatisPlus的雪花算法生成long类型主键ID,存入数据库,前端获取到数据后,要执行一个更新操作(updateById),但这时会出现无法成功更新的情况!这是因为前端在长度大于17位…

TCP/IP封装

数据如何通过网络发送?为什么 OSI 模型需要这么多层? 下图显示了数据在网络传输时如何封装和解封装。 步骤1:当设备A通过HTTP协议通过网络向设备B发送数据时,首先在应用层添加HTTP头。 步骤2:然后将TCP或UDP标头添加…

Python数据清洗--运用3δ准则检测异常值

1.3δ准则检测异常值的基本原理 当数据为连续型变量、服从或近似服从正态分布时,可运用3δ准则检测异常值。在该准则条件下,数据值与均值的偏差如果超过标准差的3倍,那么该数据值就会被视为异常值。即针对样本xi,如果满足&#x…

【Linux--进程】

目录 一、基本概念1.1描述进程-PCB1.2task_struct中内容分类 二、了解进程2.1查看进程2.2通过系统调用获取进程标识符 三、fork创建进程3.1fork()函数3.2写时拷贝 四、进程的状态4.1操作系统学科里的进程状态(运行、阻塞、挂起)4.具体的Linux状态是如何维…

MySQL之undo日志

聊聊undo log 什么是undo log undo log(回滚事务),在事务没有提交前,MySQL将记录更新操作的反向操作到undo log日志中,以便进行回退保证事务的原子性 undo log的作用 1.提供回滚操作 我们在进行数据更新操作的时候…

【Android Jetpack】Lifecycle 感知生命周期

文章目录 背景示例LifeCycle的原理LifecycleOwner自定义LifecycleOwnerLifecycleObserver 示例改进使用LifecycleService解耦Service与组件整个应用进程的生命周期ProcessLifecycleOwner 背景 在Android应用程序开发中,解耦很大程度上表现为系统组件的生命周期与普…

C++学习之路(十三)C++ 用Qt5实现一个工具箱(增加一个Base64加解密功能)- 示例代码拆分讲解

上篇文章,我们用 Qt5 实现了在小工具箱中添加了《XML文本格式化功能》功能。为了继续丰富我们的工具箱,今天我们就再增加一个平时经常用到的功能吧,就是「 Base64加解密 」功能。下面我们就来看看如何来规划开发一个这样的小功能并且添加到我…

改造http.server为简单的文件下载服务

改造 修改http.server.SimpleHTTPRequestHandler,实现简单的文件上传下载服务 simple_http_file_server.py: # !/usr/bin/env python3import datetime import email import html import http.server import io import mimetypes import os import posi…

hql面试题之字符串使用split分割,并选择其中的一部分字段的问题

版本:20231109 1.题目: 有两张表,a表有id和abstringr两个字段,b表也有id和bstr两个字段,具体如下 A表: 1abc,bcd,cdf2123,456,789 B表: 1acddef2123456 在a表的abstring字段中用‘,’分割,并取出前两…

万宾科技水环境综合治理监测系统的融合与应用

随着社会经济的快速发展,我国的水环境污染问题日益凸显,这不仅对生态环境造成了严重破坏,也严重威胁到人民群众的健康和生活质量。为了解决这一问题,城市生命线与水环境综合治理监测系统应运而生,二者的结合将为水环境…

TA-Lib学习研究笔记——Overlap Studies(二)下

TA-Lib学习研究笔记——Overlap Studies(二)下 (11)SAR - Parabolic SAR 抛物线指标 函数名:SAR 名称: 抛物线指标 简介:抛物线转向也称停损点转向,是利用抛物线方式,随…

在Springboot中将数据渲染到前端页面1.0

前端数据代码&#xff1a; <?xml version"1.0" encoding"UTF-8" ?> <emps><emp><name>金毛狮王</name><age>55</age><image>https://web-framework.oss-cn-hangzhou.aliyuncs.com/web/1.jpg</image…

《异常检测——从经典算法到深度学习》24 用于单变量时间序列异常检测的端到端基准套件

《异常检测——从经典算法到深度学习》 0 概论1 基于隔离森林的异常检测算法 2 基于LOF的异常检测算法3 基于One-Class SVM的异常检测算法4 基于高斯概率密度异常检测算法5 Opprentice——异常检测经典算法最终篇6 基于重构概率的 VAE 异常检测7 基于条件VAE异常检测8 Donut: …

Flutter加固原理及加密处理

​ 引言 为了保护Flutter应用免受潜在的漏洞和攻击威胁&#xff0c;加固是必不可少的措施之一。Flutter加固原理主要包括代码混淆、数据加密、安全存储、反调试与反分析、动态加载和安全通信等多个方面。通过综合运用这些措施&#xff0c;可以提高Flutter应用的安全性&#xf…

android开发:用IDEA建立你的第一个APP

主要是记录一下各种小坑。 IDEA目前是第一流行的java开发工具&#xff0c;同时也支持android开发&#xff0c;可以替代安卓官方的andriod studio&#xff0c;不过仍然要依赖android sdk。 本例指导你完成第一个app&#xff0c;需要一台Windows PC和一部android手机。 目录 一…

「Verilog学习笔记」状态机-非重叠的序列检测

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 根据题意 定义一个五位的中间变量lock 每次始终上升沿来临时 判断当前寄存器的低四位新数据是否等于10111 如果等于 则下一时刻lock应被清空 否则lock等于当前的lock的低四…

【刷题笔记】两数之和II_二分法||二分查找||边界||符合思维方式

两数之和II_二分法||二分查找 1 题目描述 https://leetcode.cn/problems/two-sum-ii-input-array-is-sorted/ 给你一个下标从 1 开始的整数数组 numbers &#xff0c;该数组已按 非递减顺序排列 &#xff0c;请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设…

相机标定张正友、opencv和halcon对比(1)

本文将从基本标定开始&#xff0c;结合实际工作经验&#xff0c;分析张正友、opencv和halcon三者相机标定的深层原理与不同之处&#xff0c;内容比较多&#xff0c;如果出现错误请指正。 相机光学模型 我们使用的镜头都是由多组镜片组成&#xff0c;它实际上是一种厚透镜模型…