經常使用模塊 json
# logging 日誌模塊
# configparser 模塊安全
用於便捷記錄日誌且線程安全的模塊
##級別 (自下而上)
CRITICAL = 50 #FATAL = CRITICAL
ERROR = 40
WARNING = 30 #WARN = WARNING
INFO = 20
DEBUG = 10 #最低級別
NOTSET = 0 #不設置app
##ide
可在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()
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][登陸成功]