zoukankan      html  css  js  c++  java
  • logging hashlib 模块

    一 logging

    1.日志的级别

    logging。debug("这是一个调试信息")#10

    logging.info("常规信息“”#20

    logging.warning("警告信息")#30

    logging.error("错误信息")  #40

    logging.critical("严重错误")#50

    在logging模块中有对应的常量来识别级别

    默认情况下  默认的级别30 WARNING  日志输出位置是控制台

    2.自定义日志的配置

    logging.basicConfig(

      filename="a.log",

      filemode="a.log",

      filemode="at",

      level=10,

      level=10

      format="%(asctime)s %(levelname)s %(funcName)s %(lineno)s %(message)s",

      datefmt="%Y-%m-%d  %X   %p"

    )

    logging.debut("这是又是调试信息“”)

    日志模块的四个核心角色

      1.logger 日志生成器

      2.filter 过滤器

      3.handler 处理器

      4.formatter格式处理器

    1 创建一个日志生成器

    mylog = logging.getLogger("mylog")

    设置生成器级别

    mylog.setLevel(logging.DEBUG)

    2.搞一个日志处理器

    fh = logging.FileHandler("b.log",encoding = "utf-9")

    3.搞一个格式处理器

    fm = logging.Formatter(
    "%(asctime)s %(levelname)s %(funcName)s %(lineno)s %(message)s",
    datefmt="%Y-%m-%d %X %p")

    4 将三个对象进行关联

    mylog.addHandler(fh)

    fh.setFormatter(fm)

    #测试

    mylog.debug("mylog的测试!")日志的继承

    log1 = logging.getLogger("father")
    log2 = logging.getLogger("father.son")
    log3 = logging.getLogger("father.son.grandson")

    默认值True 标识 有继承关系 当子的日志产生日志时 给他父级以及父级以上都发一份
    如果不需要就设置False
    log3.propagate = False

    fh = logging.FileHandler("c.log",encoding="utf-8")

     fm = logging.Formatter(
    "%(asctime)s %(levelname)s %(funcName)s %(lineno)s %(message)s",
    datefmt="%Y-%m-%d %X %p")


    log1.addHandler(fh)
    log2.addHandler(fh)
    log3.addHandler(fh)

    fh.setFormatter(fm)


    log1.warning("father log")
    log2.warning("father.son log")
    log3.warning("father.son.grandson log")

    import logging.config
    # 以字典来配置日志 传入一个字典对象  就不需要在编写上面那一堆代码
    #logging.config.dictConfig()

    # 流处理器
    log1 = logging.getLogger("a")
    # 输出到文件
    fh = logging.FileHandler("c.log",encoding="utf-8")
    # 输出到控制台
    sh = logging.StreamHandler()

    log1.addHandler(sh)
    log1.addHandler(fh)
    fm = logging.Formatter(
      "%(asctime)s %(levelname)s %(funcName)s %(lineno)s %(message)s",
      datefmt="%Y-%m-%d %X %p")
    sh.setFormatter(fm)

    log1.warning("测试2!")


    import lib.common
    logger = lib.common.get_logger()

    def login():
      logger.debug("测试 测试!")

    login()

    logging的配置文件与项目配合使用

    /bin/start,py

    import os,sys
    sys.path.append(os.path.dirname(os.path.dirname(__file__)))
    import core.shop
    def run():
        print("welcome to oldboy")
        core.shop.shopping()
    
    run()

    loggingconf

    standard_format = "%(name)s %(asctime)s %(levelname)s %(module)s %(funcName)s %(lineno)s %(message)s"
    simple_format = "%(name)s %(asctime)s  %(module)s  %(message)s"
    complete_format = "%(asctime)s %(levelname)s %(funcName)s %(lineno)s %(thread)s %(process)s %(message)s"
    logfile_path = r"E:上海python全栈4期day22代码1.logging模块logd.log"
    
    LOGGING_DIC = {
        'version': 1,
        'formatters': {
            'standard': {
                'format': standard_format
            },
            'simple': {
                'format': simple_format
            },
            "complete":{
                "format": complete_format
            }
        },
        'filters': {},
        'handlers': {
            'console': {
                'level': 'DEBUG',
                'class': 'logging.StreamHandler',
                'formatter': 'simple'
            },
            'default': {
                'level': 'DEBUG',
                'class': 'logging.handlers.RotatingFileHandler',
                'formatter': 'standard',
                'filename': logfile_path,  #
                'maxBytes': 1024 * 1024 * 5,  # 日志文件的最大大小为5M 超出后 换文件
                'backupCount': 5, # 最多留五个日志文件
                'encoding': 'utf-8',
            },
        },
        'loggers': {
            # 在getLogger的时候  如果指定的名称 不存在 或者不给名称 用的就是默认的
            # 在这里如果key为空 它就是默认的
            # 你可以自己定义生成器的名称 并且他们还能使用相同的默认配置
            '': {
                'handlers': ['default', 'console'],
                'level': 'DEBUG',
                'propagate': False,
            },
        },
    }

    coreshop.py

    import lib.common
    logger = lib.common.get_logger()
    
    def shopping():
        print("大爷  开始剁手吧!")
        logger.debug("大爷剁手成功 从此与代码绝缘!")

    libcommon

    import lib.common
    logger = lib.common.get_logger()
    
    def shopping():
        print("大爷  开始剁手吧!")
        logger.debug("大爷剁手成功 从此与代码绝缘!")

    二 hash

      hash lib

      hash是一种算法 是将一个任意长度的数据 根据计算 得到一个固定长度特征码

      特征:不同输入  可能会有相同的结果  几率特小

        相同的输入  必然得到相同的结果

        由于散列(特征)的性质  从原理来看是不可能  反解

      用来 验证  两个输入的数据是否一致

      使用场景

      1 密码验证

            123321    jahsajasajhsajahjas

              client    加密后结果     server   拿到加密后

      2.验证数据是否被篡改  比如游戏安装包   有没有被改过

      为防止别人撞库成功  可用提升密码的复杂度   其次可以为密码加盐(加内容

    import hashlib

    m = hashlib.md5("aaa",encode("utf-8"))

    print(len(m.hexdigest()))

    #撞库的破解的原理 有人事先 把常见的  明文和密文的对应关系  存到了数据库中

    运气好就能查询到

    pwds = {"aaa":"47bce5c74f589f4867dbd57e9ca9f808"}


    h1 = hashlib.sha512("123".encode("utf-8"))
    h2 = hashlib.sha3_512("123".encode("utf-8"))

    # print(len(h.hexdigest()))
    print(h1.hexdigest())
    print(h2.hexdigest())

    # 2b70683ef3fa64572aa50775acc84855

    # 加盐
    m = hashlib.md5("321".encode("utf-8"))
    #加
    m.update("abcdefplkjoujhh".encode("utf-8"))

    print(m.hexdigest())

    import hmac
    # 没啥区别 只是在创建的时候必须加盐
    h = hmac.new("abcdefjjjj".encode("utf-8"))

    h.update("123".encode("utf-8"))

    print(h.hexdigest())

  • 相关阅读:
    [kuangbin带你飞]专题十二 基础DP1 E
    hdu 1203 I NEED A OFFER! (01背包)
    hdu 2602 Bone Collector (01背包)
    hdu 4513 吉哥系列故事——完美队形II (manacher)
    hdu 2203 亲和串 (KMP)
    hdu 1686 Oulipo (KMP)
    hdu 1251 统计难题 (字典树)
    hdu 2846 Repository (字典树)
    hdu 1711 Number Sequence (KMP)
    poj 3461 Oulipo(KMP)
  • 原文地址:https://www.cnblogs.com/gongcheng-/p/9813234.html
Copyright © 2011-2022 走看看