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())

  • 相关阅读:
    Android平台Qt开发入门教程 狼人:
    PySide教程:第一个PySide应用 狼人:
    MeeGo系统1.2版本新组件 狼人:
    讨论:.NET 4各项技术的应用前景,徐汇区网站设计 狼人:
    为 NokiaQt SDK增加新的Symbian SDK开发平台 狼人:
    Skia引擎API整理介绍(skia in Android 2.3 trunk) 狼人:
    Windows Phone 7 开发之:工具栏 狼人:
    Google Adsense(Google网站联盟)广告申请指南 狼人:
    PySide教程:一个简单的点击按钮示例 狼人:
    内部类类4线程两加两减
  • 原文地址:https://www.cnblogs.com/gongcheng-/p/9813234.html
Copyright © 2011-2022 走看看