首页 > 其他分享 >日志相关、全量字段校验

日志相关、全量字段校验

时间:2023-04-12 17:01:10浏览次数:43  
标签:logging type 校验 全量 日志 data schema

一、日志简介

  日志也叫 log,通常对应的 xxx.log 的日志文件。文件的作用是记录系统运行过程中,产生的信息。

  搜集日志的作用:

    查看系统运行是否正常。

    分析、定位 bug

 

二、日志级别

  logging.DEBUG:调试级别【高】,打印非常详细的日志信息。适用于代码调试。

  logging.INFO:信息级别【次高】,一般用于记录突出强调的运行过程步骤。   logging.WARNING:警告级别【中】,可能出现潜在错误的情况,一般不影响系统使用。   logging.ERROR:错误级别【低】,打印错误异常信息,出现Bug。   logging.CRITICAL:严重错误级别【极低】,系统可能无法运行。      特性:         日志级别设定后,只有比该级别低的日志会写入日志。   三、日志代码分析   1、日志步骤:
# 0. 导包 
# 1. 创建日志器对象 
# 2. 设置日志打印级别 
    # logging.DEBUG 调试级别 
    # logging.INFO 信息级别 
    # logging.WARNING 警告级别 
    # logging.ERROR 错误级别 
    # logging.CRITICAL 严重错误级别 
# 3. 创建处理器对象 
    # 创建 输出到控制台 处理器对象 
    # 创建 输出到日志文件 处理器对象 
# 4. 创建日志信息格式 
# 5. 将日志信息格式设置给处理器 
    #设置给 控制台处理器 
    # 设置给 日志文件处理器 
# 6. 给日志器添加处理器 
    # 给日志对象 添加 控制台处理器 
    # 给日志对象 添加 日志文件处理器 
# 7. 打印日志 """

  2、日志代码:

import logging.handlers
import logging
import time
# 1. 创建日志器对象
logger = logging.getLogger()

# 2. 设置日志打印级别
logger.setLevel(logging.DEBUG)
#logging.DEBUG #调试级别
# logging.INFO 信息级别
# logging.WARNING 警告级别
# logging.ERROR 错误级别
# logging.CRITICAL 严重错误级别

# 3.1 创建 输出到控制台 处理器对象
st = logging.StreamHandler()

# 3.2 创建 输出到日志文件 处理器对象
fh = logging.handlers.TimedRotatingFileHandler('a.log', when='midnight', interval=1, backupCount=3, encoding='utf-8')
#'a.log':表示生成日志文件的名字 # when 字符串,指定日志切分间隔时间的单位。midnight:凌晨:12点。 # interval 是间隔时间单位的个数,指等待多少个 when 后继续进行日志记录,1代表一天一个,3代表一天三个 # backupCount 是保留日志文件的个数 # 4. 创建日志信息格式 fmt = "%(asctime)s %(levelname)s [%(filename)s(%(funcName)s:%(lineno)d)] - %(message)s" formatter = logging.Formatter(fmt)
#%(asctime)s:时间
#%(levelname)s:打印该条信息的级别
#%(message)s:输出信息
# 5.1 日志信息格式 设置给 控制台处理器 st.setFormatter(formatter) # 5.2 日志信息格式 设置给 日志文件处理器 fh.setFormatter(formatter) # 6.1 给日志器对象 添加 控制台处理器 logger.addHandler(st) # 6.2 给日志器对象 添加 日志文件处理器 logger.addHandler(fh) #7. 打印日志 while True: # logging.debug('我是一个调试级别的日志') # logging.info('我是一个信息级别的日志') logging.warning('test log sh-26') # logging.error('我是一个错误级别的日志') # logging.critical('我是一个严重错误级别的日志')
   time.sleep(1)

 

四、日志的使用(将上面的日志代码封装到函数方法 def init_log_config()里面)记住在项目中去掉 第七步。

  1、可修改位置

    2、使用步骤     1. 调用 init_log_confifig() 函数,初始化日志信息。     2. 指定 日志级别,打印 日志信息。     3、代码实例
import logging
import logging.handlers

def init_log_config(fileName, when = "midnight",interval=1, backupCount=3,):     #将参数设置为缺省参数,可以自己传参修改
    # 1. 创建日志器对象
    logger = logging.getLogger()

    # 2. 设置日志打印级别
    logger.setLevel(logging.DEBUG)

    # 3.1 创建 输出到控制台 处理器对象,控制台不需要向日志文件一样
    st = logging.StreamHandler()

    # 3.2 创建 输出到日志文件 处理器对象
    fh = logging.handlers.TimedRotatingFileHandler(filename=fileName, when=when, interval=interval, backupCount=backupCount,
                                                   encoding='utf-8')

    # 4. 创建日志信息格式
    fmt = "%(asctime)s %(levelname)s [%(filename)s(%(funcName)s:%(lineno)d)] - %(message)s"
    formatter = logging.Formatter(fmt)

    # 5.1 日志信息格式 设置给 控制台处理器
    st.setFormatter(formatter)

    # 5.2 日志信息格式 设置给 日志文件处理器
    fh.setFormatter(formatter)

    # 6.1 给日志器对象 添加 控制台处理器
    logger.addHandler(st)
    # 6.2 给日志器对象 添加 日志文件处理器
    logger.addHandler(fh)

if __name__ == "__main__":
    init_log_config("aaa.log")
    a = 10000
    logging.info(f"日志信息为:a={a}")

  4、项目使用

import logging
import unittest
# 导入添加员工接口
from api.ihrm_emp_curd import IhrmEmpCURD
# 导入断言方法
from common.assert_util import assert_util
# 导入数据库操作工具,解决手机号唯一问题
from common.db_util import DBUtil
# 导入全局手机号
from config import TEL
#导包解决参数化
from common.read_json_util import read_json_data
from parameterized import parameterized
#导入打印日志包
from logging_use import init_log_config

class TestEmpAdd(unittest.TestCase):
    #添加打印日志
    init_log_config("testempadd.log")
    # 解决手机号唯一问题
    def setUp(self) -> None:
        # 删除手机号
        delete_sql = f"delete from bs_user where mobile = '{TEL}'"  # 此时可以格式化
        DBUtil.uid_db(delete_sql)

    def tearDown(self) -> None:
        # 删除手机号
        delete_sql = f"delete from bs_user where mobile = '{TEL}'"  # 此时可以格式化
        DBUtil.uid_db(delete_sql)

    #通用测试方法添加员工
    @parameterized.expand(read_json_data())
    def test01_add(self,desc,json_data,status_code,success,code,message):
        # 准备数据
        header = {
            "Content-Type": "application/json",
            "Authorization": "Bearer b040daed-39c1-4302-8777-f950770c8a26"
        }
        # 调用自己封装的接口
        resp = IhrmEmpCURD.add_emp(header=header, json_data=json_data)
        #打印日志
        logging.info(f"res = {resp}")
        # 断言
        assert_util(self, resp, status_code, success, code, message)

 

五、全量字段校验

  校验接⼝返回响应结果的全部字段(更进一步的断言)

  校验内容:

      字段值       字段名 或 字段类型   校验流程:       定义json语法校验格式       ⽐对接口实际响应数据是否符合json校验格式   安装jsonschema:       pip install jsonschema   1、校验方式     1、在线工具校验      http://json-schema-validator.herokuapp.com      https://www.jsonschemavalidator.net 【推荐】       2、Python代码校验       步骤:         1 导包 import jsonschema         2 定义 jsonschema格式 数据校验规则         3 调⽤ jsonschema.validate(instance="json数据", schema="jsonshema规则")       查验校验结果:         校验通过:返回 None校验失败         schema 规则错误,返回 SchemaError         json 数据错误,返回 ValidationError       案例
# 1. 导包
import jsonschema

# 2. 创建 校验规则
schema = {
    "type": "object",
    "properties": {
        "success": {
            "type": "boolean"
        },
        "code": {
            "type": "integer"
        },
        "message": {
            "type": "string"
        }
    },
    "required": ["success", "code", "message"]
}

# 准备待校验数据
data = {
    "success": True,
    "code": 10000,
    "message": "操作成功"
}

# 3. 调用 validate 方法,实现校验
result = jsonschema.validate(instance=data, schema=schema)
print("result =", result)

# None: 代表校验通过
# ValidationError:数据 与 校验规则不符
# SchemaError: 校验规则 语法有误

 

  2、json schema 语法       type 关键字:约束数据类型

  

    例子

      properties关键字:是 type关键字的辅助。用于 type 的值为 object 的场景。指定 对象中 每个字段的校验规则。 可以嵌套使用     例子:
import jsonschema

# 准备校验规则
schema = {
    "type": "object",
    "properties": {
        "success": {"type": "boolean"},
        "code": {"type:": "integer"},
        "message": {"type": "string"},
        "money": {"type": "number"},
        "address": {"type": "null"},
        "data": {
            "type": "object",
            "properties": {
                "name": {"type": "string"},
                "age": {"type": "integer"},
                "height": {"type": "number"}
            }
        },
        "luckyNumber": {"type": "array"}
    }
}

# 准备测试数据
data = {
    "success": True,
    "code": 10000,
    "message": "操作成功",
    "money": 6.66,
    "address": None,
    "data": {
        "name": "tom",
        "age": 18,
        "height": 1.78
    },
    "luckyNumber": [6, 8, 9]
}

# 调用方法进行校验
res = jsonschema.validate(instance=data, schema=schema)
print(res)

   

  required关键字     作用:校验对象中必须存在的字段。字段名必须是字符串,且唯⼀
import jsonschema

# 测试数据
data = {
    "success": True,
    "code": 10000,
    "message": "操作成功",
    "data": None,
}

# 校验规则
schema = {
    "type": "object",
    "required": ["success", "code", "message", "data"]
}

# 调用方法校验
res = jsonschema.validate(instance=data, schema=schema)
print(res)

 

    const关键字

      作用:校验字段值是⼀个固定值。
import jsonschema

# 测试数据
data = {
    "success": True,
    "code": 10000,
    "message": "操作成功",
    "data": None,
}

# 校验规则
schema = {
    "type": "object",
    "properties": {
        "success": {"const": True},
        "code": {"const": 10000},
        "message": {"const": "操作成功"},
        "data": {"const": None}
    },
    "required": ["success", "code", "message", "data"]
}

# 调用方法校验
res = jsonschema.validate(instance=data, schema=schema)
print(res)

  

  pattern关键字     作用:指定正则表达式,对字符串进行模糊匹配
import jsonschema

# 测试数据
data = {
    "message": "!jeklff37294操作成功43289hke",
    "mobile": "15900000002"
}

# 校验规则
schema = {
    "type": "object",
    "properties": {
        "message": {"pattern": "操作成功"},
        "mobile": {"pattern": "^[0-9]{11}$"}
    }
}

# 调用方法校验
res = jsonschema.validate(instance=data, schema=schema)
print(res)

 

综合案例:

"""
综合案例
"""
# 测试数据
import jsonschema

data = {
    "success": False,
    "code": 10000,
    "message": "xxx登录成功",
    "data": {
        "age": 20,
        "name": "lily"
    }
}

# 校验规则
schema = {
    "type": "object",
    "properties": {
        "success": {"type": "boolean"},
        "code": {"type": "integer"},
        "message": {"pattern": "登录成功$"},
        "data": {
            "type": "object",
            "properties": {
                "name": {"const": "lily"},
                "age": {"const": 20}
            },
            "required": ["name", "age"]
        }
    },
    "required": ["success", "code", "message", "data"]
}

# 调用测试方法
res = jsonschema.validate(instance=data, schema=schema)
print(res)

 

              

标签:logging,type,校验,全量,日志,data,schema
From: https://www.cnblogs.com/wmtly/p/17310400.html

相关文章

  • 服务日志快速查询命令
    一、cat|grep命令的使用1.单个关键字查询日志cat日志文件名.log|grep'关键字' //单行显示cat日志文件名.log|grep'关键字'-B5//之前5行B的释义:Beforecat日志文件名.log|grep'关键字'-A5//之后5行A的释义:Aftercat日志文件名.log|......
  • 【工具类】-日志、项目启动
    项目启动-Dspring.profiles.active=dev日志log.error("[滴滴取消订单]-leecancelDidiOrder-订单编号:{},异常信息:{}",orderNo,Throwables.getStackTraceAsString(e));<dependency><groupId>com.google.guava</groupId><a......
  • Linux创建定时删除日志任务
    1、例:脚本对应的要删除的目录为/home/logs在home目录创建文件clearLogFiles.sh:Linux下自动删除2小时之前的日志文件(或者清空日志)find/home/log/-mmin+120-name"*.log"-execrm-rf{}\;# >catalina.out2、为脚本增加可执行权限chmod+xclearLogFiles.sh3、编......
  • iis 7.5 下站点日志开启以及默认位置设置方法
       一直用iis6的日志管理,最近升级了2008所以打算启用一下iis7.5的日志,这里就为大家分享一下方法,需要的朋友可以参考下  在iis6时,通过iis管理器的日志配置可以找到站点日志存储的位置。但是在iis7下,iis管理器下的日志配置只能找到iis日志配置的主目录,......
  • 日志管理系统EFK部署
    1. EFK简介Elasticsearch 是一个实时的、分布式的可扩展的搜索引擎,允许进行全文、结构化搜索,它通常用于索引和搜索大量日志数据,也可用于搜索许多不同类型的文档。Beats 是数据采集的得力工具。将 Beats 和您的容器一起置于服务器上,或者将 Beats 作为函数加以部署,然后便可......
  • API 网关日志的价值,你了解多少?
    本文介绍了API网关日志的价值,并以知名网关ApacheAPISIX为例,展示如何集成API网关日志。作者钱勇,API7.ai技术工程师,ApacheAPISIXCommitter。原文链接网关日志的价值在数字化时代,软件架构随着业务成长而变得越来越复杂,这给故障的发现和排查都带来了非常大的挑战,进一......
  • ELK、ELFK企业级日志分析系统
    一、ELK简介1、什么是ELKELK日志分析系统:由3个组件组成Elasticesearch、Kiabana、Logstash完成更强大的用户对日志的查询排序和统计需求日志服务器作用:提高安全性、集中存放日志、缺陷:对日志分析困难2、ELK工作原理及过程①、将日志进行集中化管理,从消息队列进入logstash......
  • WiredTiger的日志和检查点机制
    1.日志·对于每个写操作,mongodb将改变写入日志文件,即事务日志文件。写入的频率收到storage.journal.commitIntervalMs参数的控制。默认是100毫秒,可取值的范围是1--500毫秒。·WT缓存中的页数据也会被标记为脏数据日志文件的格式示例:$wtprintlog-u-x{"lsn":[15,256],......
  • 用Java写一段中国身份证的正则表达式,要求验证身份证中的日期,且大于1900年,以及校验码验
    以下是一个Java正则表达式,可用于验证中国身份证中的日期,并要求日期在1900年及之后:Stringregex="(?:(?:19[0-9]\\d)|(?:[2-9]\\d{3}))(?:0[1-9]|1[012])(?:0[1-9]|[12]\\d|3[01])\\d{3}[\\dXx]";这个正则表达式的含义如下:(?:(?:19[0-9]\\d)|(?:[2-9]\\d{3})):匹配1900年......
  • [golang]使用logrus自定义日志模块
    简介logrus是一个第三方日志库,性能虽不如zap和zerolog,但方便易用灵活。logrus完全兼容标准的log库,还支持文本、JSON两种日志输出格式。特点相较于标准库,logrus有更细致的日志级别,从高到低分别是:trace>debug>info>warn>error>fatal>panic支持自定义日志格式,内置支......