需求说明:
额度 15000或自定义
实现购物商城,买东西加入 购物车,调用信用卡接口结账
可以提现,手续费5%
支持多账户登录
支持账户间转账
记录每月日常消费流水
提供还款接口
ATM记录操作日志
提供管理接口,包括添加账户、用户额度,冻结账户等。。。
用户认证用装饰器
程序说明:
主菜单,进入主菜单显示如下:
【1】购物商城 【2】用户中心 【3】信用卡中心 【4】后台管理 【5】登录系统 【6】退出
购物商城:
显示各种商品和价格,选择对应的序号进行购买
用户中心:
【1】修改密码 【2】额度查询 【3】消费记录 【4】返回
信用卡中心:
【1】额度查询 【2】提现 【3】转账 【4】还款 【5】返回
后台管理,主要是admin用户进行管理:
【1】创建用户 【2】冻结信用卡 【3】解冻用户
【4】额度调整 【5】退出后台管理
登录系统:
未登录的用户需要进行登录
代码结构
程序代码,主程序:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #!/usr/bin/env python 2 #-*- coding:utf-8 -*- 3 # @Time : 2017/10/19 22:18 4 # @Author : lichuan 5 # @File : creditcard.py 6 7 from config import template 8 import time 9 from datetime import datetime 10 from module import common 11 import pickle 12 from log import my_log_settings 13 import logging 14 from module.users import Users 15 import os,sys 16 17 18 #加在日志配置模块 19 my_log_settings.load_my_logging_cfg() 20 #访问日志logger,path=log/access.log 21 acess_logger=logging.getLogger(__name__) 22 #消费日志logger,path=log/shop.log 23 shop_logger=logging.getLogger('shop') 24 25 #用户认证函数 26 # @wraps 27 def auth(func): 28 ''' 29 用户是否已经登录的认证装饰器 30 :param func: 31 :return: 32 ''' 33 def warpper(*args,**kwargs): 34 import pickle 35 # userinfo=pickle.loads(open('.json','rb').read())\ 36 userinfos = load_user() 37 if len(userinfos)!=0: 38 func(*args,**kwargs) 39 else: 40 login() 41 userinfos = load_user() 42 if len(userinfos)!=0: 43 func(*args,**kwargs) 44 return warpper 45 46 @auth 47 def shop_center(): 48 ''' 49 购物商城界面选择 50 :return: 51 ''' 52 shop={'apple手机':7000,'魅族手机':2000,'小米手机':2500,'华为手机':4000,'小米笔记本':4000} 53 shop_list=['apple手机','魅族手机','小米手机','华为手机','小米笔记本'] 54 salary=15000 55 userinfo=load_user() 56 # print(userinfo) 57 buy_list={} 58 salary=int(userinfo['salary']) 59 shop_flag=True 60 while shop_flag: 61 print(template.shopping_index_menu) 62 choice=input('请选择:').strip() 63 if not choice.isdigit() or int(choice) not in range(1,7): 64 print('输入错误,请重试!') 65 continue 66 if int(choice) == 6: 67 Users[userinfo['name']]=userinfo 68 dump_user(userinfo) 69 print('退出购物商城,再见!') 70 break 71 else: 72 key=shop_list[int(choice)-1] 73 money=shop[key] 74 if money > salary: 75 print('剩余额度不够,请选择别的商品!') 76 continue 77 else: 78 salary=salary-money 79 username=userinfo['name'] 80 shop_logger.info('[%s]购买%s,花费%d元!' % (username,key,money)) 81 print('%s,价值%d元,已购买!' % (key,money)) 82 print('剩余额度:%d元' % salary) 83 #更新信息到Users配置文件 84 userinfo['salary']=salary 85 if key in buy_list: 86 buy_list[key]+=1 87 else: 88 buy_list[key] = 1 89 userinfo['buy_list']=buy_list 90 Users[userinfo['name']] = userinfo 91 common.update_users(Users) 92 93 #从文件加载登录用户的信息 94 def load_user(): 95 ''' 96 从文件加载登录用户的信息 97 :return: userinfo信息 98 ''' 99 try: 100 with open('.pkl', 'rb') as read_f: 101 userinfo = {} 102 userinfo = pickle.loads(read_f.read()) 103 # print(userinfo) 104 except (FileNotFoundError,EOFError): 105 pass 106 return userinfo 107 108 #将登录用户信息重新写入.pkl 109 def dump_user(users): 110 ''' 111 将users信息重新写入.pkl文件进行保存。 112 :param users:users信息是个字典 113 :return: 114 ''' 115 with open('.pkl', 'w'): 116 pass 117 with open('.pkl', 'wb') as read_f: 118 p = pickle.dumps(users) 119 read_f.write(p) 120 121 #用户登录函数 122 def login(): 123 ''' 124 用户登录函数,对用户名密码进行校验,用户密码采用加密模块hashlib进行加盐加密 125 :return: 126 ''' 127 err_count=0 128 login_flag=True 129 while login_flag: 130 username=input('please input your username: ').strip() 131 password=input('please input your password: ').strip() 132 if username in Users: 133 if Users[username]['password'] == common.encrypt(password) and Users[username]['islocked'] == 0: 134 userinfo=Users[username] 135 err_count = 0 136 with open('.pkl','wb') as write_f: 137 p=pickle.dumps(userinfo) 138 write_f.write(p) 139 acess_logger.info(str(username)+' login success!') 140 print(str(username)+' login success!') 141 login_flag=False 142 elif Users[username]['islocked'] != 0: 143 print('user is locked ! cannot login!') 144 err_count = 0 145 login_flag=False 146 break 147 else: 148 print('name or password is wrong!!!') 149 acess_logger.info(str(username)+' login Falied ,password is wrong') 150 err_count+=1 151 #错误登录3次以上,锁定用户 152 if err_count >= 3: 153 Users[username]['islocked']=1 154 acess_logger.info(str(username)+' user locked!') 155 print(str(username)+' user locked!') 156 common.update_users(Users) 157 break 158 else: 159 print('name or password is wrong!') 160 # err_count+=1 161 162 @auth 163 def user_center(today,weekday): 164 ''' 165 用户登录后进入的用户个人中心界面 166 :param name:用户名称 167 :param today: 168 :param weekday:星期几 169 :return: 170 ''' 171 center_flag=True 172 userinfo=load_user() 173 name=userinfo['name'] 174 while center_flag: 175 print(template.index_user_center.format(name,today,weekday)) 176 choice=input('please input your choice:').strip() 177 if not choice.isdigit() or int(choice) not in range(1,5): 178 print('input wrong,please try again!') 179 continue 180 if int(choice) == 4: 181 print('用户中心和您再见!') 182 center_flag=False 183 break 184 elif int(choice) == 1: 185 common.modify_passwd(userinfo) 186 elif int(choice) == 2: 187 query_salary() 188 elif int(choice) == 3: 189 buylist=common.buy_list(userinfo['name']) 190 for b in buylist: 191 print(b,end='') 192 193 #额度查询函数,显示信用卡基本信息 194 def query_salary(): 195 status_all=['正常','被锁定'] 196 userinfo=load_user() 197 salary=userinfo['salary'] 198 total_salary=userinfo['total_salary'] 199 cardno=userinfo['bindcard'] 200 name=userinfo['name'] 201 status=status_all[0] if userinfo['islocked'] ==0 else status_all[1] 202 print(template.card_info.format(cardno,name,total_salary,salary,status)) 203 # print(template.card_info.format(str(cardno),name,str(total_salary),str(salary),status)) 204 205 #转账函数 206 def forward_cash(): 207 userinfo = load_user() 208 salary = userinfo['salary'] 209 u_card_no = userinfo['bindcard'] 210 card_list=[] 211 print('您现在剩余的可用额度为:%d' %salary) 212 card_no=input('请输入对方的卡号:').strip() 213 money=input('请输入转账的金额:').strip() 214 if not money.isdigit(): 215 print('金额输入有误!') 216 return 217 for k in Users: 218 if Users[k]['bindcard'] != u_card_no: 219 card_list.append(Users[k]['bindcard']) 220 if card_no not in card_list: 221 print('卡号有误') 222 return 223 if int(money) > salary: 224 print('转账金额超出你的信用额度!') 225 return 226 #减去自己的额度 227 salary=salary-int(money) 228 userinfo['salary']=salary 229 dump_user(userinfo) 230 Users[userinfo['name']]['salary']=salary 231 #增加别人的额度 232 for k in Users: 233 if card_no == Users[k]['bindcard']: 234 Users[k]['salary']+=int(money) 235 common.update_users(Users) 236 print('[%s]转账%d元给%s,手续费%d元' % (userinfo['name'],int(money),card_no)) 237 shop_logger.info('[%s]转账%d元给%s' % (userinfo['name'],int(money),card_no)) 238 239 #提现函数 240 def draw_cash(): 241 cash=input('请输入提现金额:').strip() 242 if not cash.isdigit() or int(cash) < 0: 243 print('金额输入错误!') 244 return 245 userinfo=load_user() 246 salary=userinfo['salary'] 247 if int(cash) > salary: 248 print('你的额度是%s,额度不够!' % salary) 249 return 250 else: 251 salary = salary - int(cash)*1.05 252 userinfo['salary']=salary 253 dump_user(userinfo) 254 Users[userinfo['name']]['salary'] = salary 255 common.update_users(Users) 256 query_salary() 257 shop_logger.info('[%s]取现%d元,手续费%d元!' % (userinfo['name'],int(cash),int(cash)*0.05)) 258 print('[%s]取现%d元,手续费%d元!' % (userinfo['name'],int(cash),int(cash)*0.05)) 259 260 #信用卡还款 261 def repay_salary(): 262 repay_money=input('请输入还款金额:').strip() 263 if not repay_money.isdigit(): 264 print('金额有误!') 265 return 266 else: 267 repay_money=int(repay_money) 268 userinfo = load_user() 269 userinfo['salary'] = userinfo['salary']+repay_money 270 dump_user(userinfo) 271 Users[userinfo['name']]=userinfo 272 common.update_users(Users) 273 query_salary() 274 shop_logger.info('[%s]还款%d元' % (userinfo['name'], repay_money)) 275 print('[%s]还款%d元' % (userinfo['name'], repay_money)) 276 277 #信用卡中心程序 278 @auth 279 def card_center(): 280 ''' 281 信用卡中心程序 282 :return: 283 ''' 284 func={ 285 '1': query_salary, 286 '2': draw_cash, 287 '3': forward_cash, 288 '4': repay_salary, 289 } 290 card_flag=True 291 while card_flag: 292 #初始化打印信息 293 userinfo=load_user() 294 user_name=userinfo['name'] 295 card_no=userinfo['bindcard'] 296 print(template.index_card_center.format(user_name,card_no)) 297 choice=input('请选择:').strip() 298 if not choice.isdigit() or int(choice) not in range(1,6): 299 print('输入错误,请重试!') 300 continue 301 if int(choice) == 5: 302 print('信用卡中心和您再见!') 303 break 304 else: 305 func[choice]() 306 307 308 #后台管理程序 309 @auth 310 def manager(): 311 func={ 312 '1':common.create_card, 313 '2':common.lock_card, 314 '3':common.unlock_card, 315 '4':common.modify_salary, 316 } 317 userinfo=load_user() 318 if userinfo['name'] != 'admin': 319 print('只有admin用户可以进入后台管理!') 320 return 321 manager_flag=True 322 while manager_flag: 323 print(template.index_admin.format(userinfo['name'])) 324 choice=input('请选择:').strip() 325 if not choice.isdigit() or int(choice) not in range(1,6): 326 print('输入错误!') 327 continue 328 if int(choice) == 5: 329 print('后台管理和您再见!') 330 manager_flag=False 331 break 332 else: 333 func[choice]() 334 335 if __name__ == '__main__': 336 Flag=True 337 # Flag=False 338 while Flag: 339 userinfo = load_user() 340 # print(userinfo) 341 # print(userinfo['name']) 342 username = '' 343 # username = userinfo['name'] if len(userinfo) != 0 else '' 344 today=time.strftime('%Y-%m-%d',time.localtime()) 345 weekday=common.numTo_characters(datetime.now().weekday()) 346 print(template.index_default_menu.format(username,today,weekday)) 347 choice = input("请选择:").strip() 348 if not choice.isdigit(): 349 print("输入错误,请重新输入") 350 continue 351 if int(choice) not in range(1,7): 352 print("输入错误,,请重新输入") 353 continue 354 if int(choice) == 1: 355 shop_center() 356 elif int(choice) == 2: 357 user_center(today,weekday) 358 elif int(choice) == 3: 359 card_center() 360 elif int(choice) == 4: 361 manager() 362 elif int(choice) == 5: 363 login() 364 elif int(choice) == 6: 365 with open('.pkl','w',encoding='utf-8'): 366 pass 367 print("再见!") 368 Flag=False
个显示模板的程序:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #!/usr/bin/env python 2 #-*- coding:utf-8 -*- 3 # @Time : 2017/10/20 15:28 4 # @Author : lichuan 5 # @File : template.py 6 7 8 """ 9 该模块用来定义系统的菜单模板,用的网上别人的模板。 10 """ 11 # 主程序中的主菜单 12 13 index_default_menu = ''' 14 ------------------------------------------------------------------------- 15 ATM 模拟程序 16 17 {0} 今天 {1} 星期{2} 18 ------------------------------------------------------------------------- 19 【1】购物商城 【2】用户中心 【3】信用卡中心 【4】后台管理 【5】登录系统 【6】退出 20 ''' 21 22 #购物商城界面 23 shopping_index_menu = ''' 24 ================================================================================== 25 = = 26 = 信用卡购物商城 = 27 = = 28 ================================================================================== 29 30 【1】apple手机 7000元 31 【2】魅族手机 2000元 32 【3】小米手机 2500元 33 【4】华为手机 4000元 34 【5】小米笔记本 4000元 35 【6】退出 36 ''' 37 38 index_card_center = ''' 39 ------------------------------------------------------------------------------ 40 信用卡管理中心 41 42 用户:{0} 卡号:{1} 43 ------------------------------------------------------------------------------ 44 【1】额度查询 【2】提现 【3】转账 【4】还款 【5】返回 45 ''' 46 # 显示信用卡基本信息模板 47 card_info = ''' 48 ----------------------------------------------------------------------------------- 49 信用卡基本信息 50 51 卡号:{0} 所有人:{1} 信用额度:{2} 剩余额度:{3} 状态:{4} 52 ----------------------------------------------------------------------------------- 53 ''' 54 index_user_center = ''' 55 ------------------------------------------------------------------------- 56 用户中心 57 58 当前用户:{0} 今天 {1} 星期{2} 59 ------------------------------------------------------------------------- 60 【1】修改密码 【2】额度查询 【3】消费记录 【4】返回 61 62 ''' 63 # 后台管理模板 64 index_admin = ''' 65 ------------------------------------------------------------------------------ 66 后台管理 67 68 用户:{0} 69 ------------------------------------------------------------------------------ 70 【1】创建用户 【2】冻结信用卡 【3】解冻用户 71 【4】额度调整 【5】退出后台管理 72 ''' 73 74 75 76 #'----------------------------------------------------------------------------------------------------------------------------------------------------------------------'
定义的公用函数:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #!/usr/bin/env python 2 #-*- coding:utf-8 -*- 3 # @Time : 2017/10/20 15:46 4 # @Author : lichuan 5 # @File : common.py 6 7 import hashlib 8 from module.users import Users 9 import os 10 import re 11 from log import my_log_settings 12 import logging 13 14 my_log_settings.load_my_logging_cfg() 15 acess_logger=logging.getLogger(__name__) 16 17 def numTo_characters(num): 18 ''' 19 传入数字,转换成星期几中的几 20 :param num: 21 :return:汉字 22 ''' 23 if num in range(0,7): 24 week=('一','二','三','四','五','六','日') 25 return week[num] 26 27 def encrypt(str): 28 ''' 29 对传入字符串进行加盐加密 30 :param str: 需要进行加密的字符串 31 :return: 返回加密过的字符串 32 ''' 33 encrpt=hashlib.md5() 34 encrpt.update(bytes('admin1234nnnnnn',encoding='utf-8')) 35 encrpt.update(bytes(str,encoding='utf-8')) 36 return encrpt.hexdigest() 37 38 def update_users(Users): 39 ''' 40 更新Users信息的函数 41 :param Users: 用户信息,是个字典 42 :return: 43 ''' 44 import os 45 user_path=os.path.dirname(os.path.abspath(__file__))+'\\users.py' 46 with open(user_path,'w',encoding='utf-8') as write_f: 47 Users_new='Users='+str(Users) 48 write_f.write(Users_new) 49 50 #修改密码 51 def modify_passwd(userinfo): 52 ''' 53 用于更新Users用户密码信息 54 :param userinfo: 传入用户信息 55 :param new_passwd: 新的密码信息 56 :return: 57 ''' 58 old_passwd=input('请输入现在密码:') 59 new_passwd=input('请输入新密码:') 60 pattern_new_passwd=input('请再次输入新密码:') 61 old_passwd=encrypt(old_passwd) 62 if new_passwd != pattern_new_passwd: 63 print('两次输入密码不一致!') 64 return 65 if old_passwd != userinfo['password']: 66 print('密码错误!') 67 return 68 encrypt_passwd=encrypt(new_passwd) 69 userinfo['password']=encrypt_passwd 70 Users[userinfo['name']]=userinfo 71 update_users(Users) 72 acess_logger.info('%s修改了用户密码!' % userinfo['name']) 73 print('修改密码成功!') 74 75 #用户的购物消费信息 76 def buy_list(username): 77 buy=[] 78 shop_path=os.path.normpath(os.path.join( 79 os.path.abspath(__file__), 80 os.pardir, 81 os.pardir, 82 'log', 83 'shop.log' 84 )) 85 with open(shop_path,'r',encoding='utf-8') as read_f: 86 lines=read_f.readlines() 87 r='.*\[%s\].*' %username 88 patern = re.compile(r) 89 for line in lines: 90 if patern.match(line): 91 buy.append(line) 92 return buy 93 94 #创建信用卡用户 95 def create_card(): 96 flag=True 97 while True: 98 username=input('请输入name:').strip() 99 if len(username) <= 0: 100 print('输入错误!') 101 flag = False 102 break 103 if username in Users: 104 print('用户已存在!') 105 continue 106 mobile=input('请输入手机号:').strip() 107 if len(mobile) <= 0: 108 print('输入错误!') 109 flag = False 110 break 111 for i in Users: 112 if Users[i]['mobile'] == mobile: 113 print('手机号已经存在!') 114 flag=False 115 break 116 card_no = input('请输入卡号:').strip() 117 if len(card_no) <= 0 or not card_no.isdigit(): 118 print('输入错误!') 119 flag = False 120 break 121 for i in Users: 122 if Users[i]['bindcard'] == card_no: 123 print('卡号已经存在!') 124 flag = False 125 break 126 passwd = input('请输入密码:').strip() 127 encrypt_passwd=encrypt(passwd) 128 userinfo={ 129 'isdel': 0, 130 'name': username, 131 'password': encrypt_passwd, 132 'islocked': 0, 133 'salary': 15000, 134 'total_salary': 15000, 135 'bindcard': card_no, 136 'mobile': mobile, 137 'buy_list': {} 138 } 139 Users[username]=userinfo 140 update_users(Users) 141 acess_logger.info('新创建用户%s' % username) 142 print('新创建用户%s已成功' % username) 143 flag=False 144 145 #冻结信用卡 146 def lock_card(): 147 name=input('请输入要冻结的用户名:').strip() 148 if name == 'admin': 149 print('不能冻结admin账号!') 150 return 151 if name in Users: 152 Users[name]['islocked'] = 1 153 update_users(Users) 154 acess_logger.info('%s用户被冻结' %name) 155 print('%s用户被成功冻结' %name) 156 else: 157 print('用户不存在!') 158 159 160 #解冻信用卡 161 def unlock_card(): 162 name = input('请输入要解冻的用户名:').strip() 163 if name in Users: 164 Users[name]['islocked'] = 0 165 update_users(Users) 166 acess_logger.info('%s用户被解冻' % name) 167 print('%s用户被成功解冻' % name) 168 else: 169 print('用户不存在!') 170 171 #调整额度 172 def modify_salary(): 173 name = input('请输入要调整额度的用户名:').strip() 174 total_salary=input('请输入新额度:').strip() 175 if not total_salary.isdigit(): 176 print('额度错误!') 177 return 178 if name in Users: 179 Users[name]['salary'] = int(total_salary) - (Users[name]['total_salary']-Users[name]['salary']) 180 Users[name]['total_salary'] = int(total_salary) 181 update_users(Users) 182 acess_logger.info('%s用户额度调整为%s' % (name,total_salary)) 183 print('%s用户额度调整为%s' % (name,total_salary)) 184 else: 185 print('用户不存在!') 186 187 if __name__ == '__main__': 188 # modify_passwd({},'bbb') 189 # print('it is common') 190 r=buy_list('alex') 191 for i in r: 192 print(i,end='')
保存用户信息的文件:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 Users={'alex': {'isdel': 0, 'name': 'alex', 'password': 'bc5b9cb3e4ab483335edab3347f3c102', 'islocked': 0, 'salary': 52187.4, 'total_salary': 15000, 'bindcard': '1001012345', 'mobile': '13511111111', 'buy_list': {'apple手机': 1, '魅族手机': 1, '小米手机': 1, '华为手机': 1, '小米笔记本': 2}}, 'egon': {'isdel': 0, 'name': 'egon', 'password': 'bc5b9cb3e4ab483335edab3347f3c102', 'islocked': 0, 'salary': 16950, 'total_salary': 15000, 'bindcard': '1001012346', 'mobile': '13511111112', 'buy_list': {}}, 'admin': {'isdel': 0, 'name': 'admin', 'password': 'bc5b9cb3e4ab483335edab3347f3c102', 'islocked': 0, 'salary': 15000, 'total_salary': 15000, 'role': 'admin', 'bindcard': '1001010002', 'mobile': '15257157418'}, 'lit': {'isdel': 0, 'name': 'lit', 'password': 'bc5b9cb3e4ab483335edab3347f3c102', 'islocked': 0, 'salary': 50000, 'total_salary': 50000, 'bindcard': '1001012347', 'mobile': '13520381333', 'buy_list': {}}}
日志模块:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 """ 2 logging配置 3 """ 4 5 import os 6 import logging.config 7 8 # 定义三种日志输出格式 开始 9 10 standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' \ 11 '[%(levelname)s][%(message)s]' #其中name为getlogger指定的名字 12 13 simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s' 14 15 id_simple_format = '[%(levelname)s][%(asctime)s] %(message)s' 16 17 shop_format= '[%(asctime)s]%(message)s' 18 19 # 定义日志输出格式 结束 20 21 logfile_dir = os.path.dirname(os.path.abspath(__file__)) # log文件的目录 22 23 logfile_name = 'access.log' # log文件名 24 25 # 如果不存在定义的日志目录就创建一个 26 if not os.path.isdir(logfile_dir): 27 os.mkdir(logfile_dir) 28 29 # log文件的全路径 30 logfile_path = os.path.join(logfile_dir, logfile_name) 31 shop_path = os.path.join(logfile_dir, 'shop.log') 32 33 # log配置字典 34 LOGGING_DIC = { 35 'version': 1, 36 'disable_existing_loggers': False, 37 'formatters': { 38 'standard': { 39 'format': standard_format 40 }, 41 'simple': { 42 'format': simple_format 43 }, 44 'id_simple': { 45 'format': id_simple_format 46 }, 47 'shop_format': { 48 'format': shop_format 49 }, 50 }, 51 'filters': {}, 52 'handlers': { 53 #打印到终端的日志 54 'console': { 55 'level': 'DEBUG', 56 'class': 'logging.StreamHandler', # 打印到屏幕 57 'formatter': 'simple' 58 }, 59 #打印到文件的日志,收集info及以上的日志 60 'default': { 61 'level': 'DEBUG', 62 'class': 'logging.handlers.RotatingFileHandler', # 保存到文件 63 'formatter': 'standard', 64 'filename': logfile_path, # 日志文件 65 'maxBytes': 1024*1024*5, # 日志大小 5M 66 'backupCount': 5, 67 'encoding': 'utf-8', # 日志文件的编码,再也不用担心中文log乱码了 68 }, 69 'boss': { 70 'level': 'DEBUG', 71 'class': 'logging.handlers.RotatingFileHandler', # 保存到文件 72 'formatter': 'standard', 73 'filename': 'boss.log', # 日志文件 74 'maxBytes': 1024 * 1024 * 5, # 日志大小 5M 75 'backupCount': 5, 76 'encoding': 'utf-8', # 日志文件的编码,再也不用担心中文log乱码了 77 }, 78 'shop': { 79 'level': 'INFO', 80 'class': 'logging.handlers.RotatingFileHandler', # 保存到文件 81 'formatter': 'shop_format', 82 'filename': shop_path, # 日志文件 83 'encoding': 'utf-8', # 日志文件的编码,再也不用担心中文log乱码了 84 }, 85 }, 86 'loggers': { 87 #logger1=logging.getLogger(__name__)拿到的logger配置 88 '': { 89 'handlers': ['default',], # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕 90 'level': 'DEBUG', 91 'propagate': True, # 向上(更高level的logger)传递 92 }, 93 #logger1=logging.getLogger('collect')拿到的logger配置 94 'collect': { 95 'handlers': ['boss',], # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕 96 'level': 'DEBUG', 97 'propagate': True, # 向上(更高level的logger)传递 98 }, 99 'shop': { 100 'handlers': ['shop'], # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕 101 'level': 'INFO', 102 'propagate': True, # 向上(更高level的logger)传递 103 }, 104 }, 105 } 106 107 108 def load_my_logging_cfg(): 109 logging.config.dictConfig(LOGGING_DIC) # 导入上面定义的logging配置 110 # logger = logging.getLogger(__name__) # 生成一个log实例 111 # logger = logging.getLogger('shopping') # 生成一个log实例 112 # logger.info('It works2!') # 记录该文件的运行状态 113 114 if __name__ == '__main__': 115 load_my_logging_cfg()