zoukankan      html  css  js  c++  java
  • python3-基础9

    常用模块 

    # logging 日志模块
    # configparser 模块

    用于便捷记录日志且线程安全的模块
    ##级别 (自下而上)
    CRITICAL = 50 #FATAL = CRITICAL
    ERROR = 40
    WARNING = 30 #WARN = WARNING
    INFO = 20
    DEBUG = 10 #最低级别
    NOTSET = 0 #不设置

    ##

    可在logging.basicConfig()函数中通过具体参数来更改logging模块默认行为,可用参数有
    filename:用指定的文件名创建FiledHandler(后边会具体讲解handler的概念),这样日志会被存储在指定的文件中。
    filemode:文件打开方式,在指定了filename时使用这个参数,默认值为“a”还可指定为“w”。
    format:指定handler使用的日志显示格式。 
    datefmt:指定日期时间格式。 
    level:设置rootlogger(后边会讲解具体概念)的日志级别 
    stream:用指定的stream创建StreamHandler。可以指定输出到sys.stderr,sys.stdout或者文件,默认为sys.stderr。若同时列出了filename和stream两个参数,则stream参数会被忽略。
    
    
    
    #格式
    %(name)s:Logger的名字,并非用户名,详细查看
    
    %(levelno)s:数字形式的日志级别
    
    %(levelname)s:文本形式的日志级别
    
    %(pathname)s:调用日志输出函数的模块的完整路径名,可能没有
    
    %(filename)s:调用日志输出函数的模块的文件名
    
    %(module)s:调用日志输出函数的模块名
    
    %(funcName)s:调用日志输出函数的函数名
    
    %(lineno)d:调用日志输出函数的语句所在的代码行
    
    %(created)f:当前时间,用UNIX标准的表示时间的浮 点数表示
    
    %(relativeCreated)d:输出日志信息时的,自Logger创建以 来的毫秒数
    
    %(asctime)s:字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒
    
    %(thread)d:线程ID。可能没有
    
    %(threadName)s:线程名。可能没有
    
    %(process)d:进程ID。可能没有
    
    %(message)s:用户输出的消息
    
     
    
    logging.basicConfig()
    View Code

     

      1 #===============>star.py
      2 import sys,os
      3 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
      4 sys.path.append(BASE_DIR)
      5 
      6 from core import src
      7 
      8 if __name__ == '__main__':
      9     src.run()
     10 #===============>settings.py
     11 import os
     12 
     13 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
     14 DB_PATH=os.path.join(BASE_DIR,'db','db.json')
     15 LOG_PATH=os.path.join(BASE_DIR,'log','access.log')
     16 LOGIN_TIMEOUT=5
     17 
     18 """
     19 logging配置
     20 """
     21 # 定义三种日志输出格式
     22 standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' 
     23                   '[%(levelname)s][%(message)s]' #其中name为getlogger指定的名字
     24 simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
     25 id_simple_format = '[%(levelname)s][%(asctime)s] %(message)s'
     26 
     27 # log配置字典
     28 LOGGING_DIC = {
     29     'version': 1,
     30     'disable_existing_loggers': False,
     31     'formatters': {
     32         'standard': {
     33             'format': standard_format
     34         },
     35         'simple': {
     36             'format': simple_format
     37         },
     38     },
     39     'filters': {},
     40     'handlers': {
     41         #打印到终端的日志
     42         'console': {
     43             'level': 'DEBUG',
     44             'class': 'logging.StreamHandler',  # 打印到屏幕
     45             'formatter': 'simple'
     46         },
     47         #打印到文件的日志,收集info及以上的日志
     48         'default': {
     49             'level': 'DEBUG',
     50             'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件
     51             'formatter': 'standard',
     52             'filename': LOG_PATH,  # 日志文件
     53             'maxBytes': 1024*1024*5,  # 日志大小 5M
     54             'backupCount': 5,
     55             'encoding': 'utf-8',  # 日志文件的编码,再也不用担心中文log乱码了
     56         },
     57     },
     58     'loggers': {
     59         #logging.getLogger(__name__)拿到的logger配置
     60         '': {
     61             'handlers': ['default', 'console'],  # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
     62             'level': 'DEBUG',
     63             'propagate': True,  # 向上(更高level的logger)传递
     64         },
     65     },
     66 }
     67 
     68 
     69 #===============>src.py
     70 from conf import settings
     71 from lib import common
     72 import time
     73 
     74 logger=common.get_logger(__name__)
     75 
     76 current_user={'user':None,'login_time':None,'timeout':int(settings.LOGIN_TIMEOUT)}
     77 def auth(func):
     78     def wrapper(*args,**kwargs):
     79         if current_user['user']:
     80             interval=time.time()-current_user['login_time']
     81             if interval < current_user['timeout']:
     82                 return func(*args,**kwargs)
     83         name = input('name>>: ')
     84         password = input('password>>: ')
     85         db=common.conn_db()
     86         if db.get(name):
     87             if password == db.get(name).get('password'):
     88                 logger.info('登录成功')
     89                 current_user['user']=name
     90                 current_user['login_time']=time.time()
     91                 return func(*args,**kwargs)
     92         else:
     93             logger.error('用户名不存在')
     94 
     95     return wrapper
     96 
     97 @auth
     98 def buy():
     99     print('buy...')
    100 
    101 @auth
    102 def run():
    103 
    104     print('''
    105 购物
    106 查看余额
    107 转账
    108     ''')
    109     while True:
    110         choice = input('>>: ').strip()
    111         if not choice:continue
    112         if choice == '1':
    113             buy()
    114 
    115 
    116 
    117 #===============>db.json
    118 {"egon": {"password": "123", "money": 3000}, "alex": {"password": "alex3714", "money": 30000}, "wsb": {"password": "3714", "money": 20000}}
    119 
    120 #===============>common.py
    121 from conf import settings
    122 import logging
    123 import logging.config
    124 import json
    125 
    126 def get_logger(name):
    127     logging.config.dictConfig(settings.LOGGING_DIC)  # 导入上面定义的logging配置
    128     logger = logging.getLogger(name)  # 生成一个log实例
    129     return logger
    130 
    131 
    132 def conn_db():
    133     db_path=settings.DB_PATH
    134     dic=json.load(open(db_path,'r',encoding='utf-8'))
    135     return dic
    136 
    137 
    138 #===============>access.log
    139 [2017-10-21 19:08:20,285][MainThread:10900][task_id:core.src][src.py:19][INFO][登录成功]
    140 [2017-10-21 19:08:32,206][MainThread:10900][task_id:core.src][src.py:19][INFO][登录成功]
    141 [2017-10-21 19:08:37,166][MainThread:10900][task_id:core.src][src.py:24][ERROR][用户名不存在]
    142 [2017-10-21 19:08:39,535][MainThread:10900][task_id:core.src][src.py:24][ERROR][用户名不存在]
    143 [2017-10-21 19:08:40,797][MainThread:10900][task_id:core.src][src.py:24][ERROR][用户名不存在]
    144 [2017-10-21 19:08:47,093][MainThread:10900][task_id:core.src][src.py:24][ERROR][用户名不存在]
    145 [2017-10-21 19:09:01,997][MainThread:10900][task_id:core.src][src.py:19][INFO][登录成功]
    146 [2017-10-21 19:09:05,781][MainThread:10900][task_id:core.src][src.py:24][ERROR][用户名不存在]
    147 [2017-10-21 19:09:29,878][MainThread:8812][task_id:core.src][src.py:19][INFO][登录成功]
    148 [2017-10-21 19:09:54,117][MainThread:9884][task_id:core.src][src.py:19][INFO][登录成功]
    View Code
  • 相关阅读:
    我的第一篇博客
    吴裕雄--天生自然python学习笔记:Python3 标准库概览
    吴裕雄--天生自然python学习笔记:Python3 命名空间和作用域
    吴裕雄--天生自然python学习笔记:Python3 面向对象
    吴裕雄--天生自然python学习笔记:Python3 错误和异常
    吴裕雄--天生自然python学习笔记:Python3 OS 文件/目录方法
    吴裕雄--天生自然python学习笔记:Python3 File(文件) 方法
    吴裕雄--天生自然python学习笔记:Python3 输入和输出
    吴裕雄--天生自然python学习笔记:Python3 模块
    吴裕雄--天生自然python学习笔记:Python3 数据结构
  • 原文地址:https://www.cnblogs.com/Albert-w/p/10815077.html
Copyright © 2011-2022 走看看