python3-基礎9

經常使用模塊 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()
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
相關文章
相關標籤/搜索