#=============>bin目录:存放执行脚本#start.py
importsys,os
BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(BASE_DIR)from core importcorefrom conf importmy_log_settingsif __name__ == '__main__':
my_log_settings.load_my_logging_cfg()
core.run()#=============>conf目录:存放配置文件#config.ini
[DEFAULT]
user_timeout= 1000[x]
password= 123money= 10000000[y]
password= 123456money=1000[z]
password=qwe123
money=10
#settings.py
importos
config_path=r'%s\%s' %(os.path.dirname(os.path.abspath(__file__)),'config.ini')
user_timeout=10user_db_path=r'%s\%s' %(os.path.dirname(os.path.dirname(os.path.abspath(__file__))),\'db')#my_log_settings.py
"""logging配置"""
importosimportlogging.config#定义三种日志输出格式 开始
standard_format= '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]'\'[%(levelname)s][%(message)s]' #其中name为getlogger指定的名字
simple_format= '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'id_simple_format= '[%(levelname)s][%(asctime)s] %(message)s'
#定义日志输出格式 结束
logfile_dir= r'%s\log' %os.path.dirname(os.path.dirname(os.path.abspath(__file__))) #log文件的目录
logfile_name= 'all2.log' #log文件名
#如果不存在定义的日志目录就创建一个
if notos.path.isdir(logfile_dir):
os.mkdir(logfile_dir)#log文件的全路径
logfile_path =os.path.join(logfile_dir, logfile_name)#log配置字典
LOGGING_DIC ={'version': 1,'disable_existing_loggers': False,'formatters': {'standard': {'format': standard_format
},'simple': {'format': simple_format
},
},'filters': {},'handlers': {#打印到终端的日志
'console': {'level': 'DEBUG','class': 'logging.StreamHandler', #打印到屏幕
'formatter': 'simple'},#打印到文件的日志,收集info及以上的日志
'default': {'level': 'DEBUG','class': 'logging.handlers.RotatingFileHandler', #保存到文件
'formatter': 'standard','filename': logfile_path, #日志文件
'maxBytes': 1024*1024*5, #日志大小 5M
'backupCount': 5,'encoding': 'utf-8', #日志文件的编码,再也不用担心中文log乱码了
},
},'loggers': {#logging.getLogger(__name__)拿到的logger配置
'': {'handlers': ['default', 'console'], #这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
'level': 'DEBUG','propagate': True, #向上(更高level的logger)传递
},
},
}defload_my_logging_cfg():
logging.config.dictConfig(LOGGING_DIC)#导入上面定义的logging配置
logger = logging.getLogger(__name__) #生成一个log实例
logger.info('It works!') #记录该文件的运行状态
if __name__ == '__main__':
load_my_logging_cfg()#=============>core目录:存放核心逻辑#core.py
importloggingimporttimefrom conf importsettingsfrom lib importread_inifrom conf importmy_log_settings#print(__name__)
config =read_ini.read(settings.config_path)
logger= my_log_settings.load_my_logging_cfg(__name__)
current_user={'user':None,'login_time':None,'timeout':int(settings.user_timeout)}defauth(func):def wrapper(*args,**kwargs):if current_user['user']:
interval=time.time()-current_user['login_time']if interval < current_user['timeout']:return func(*args,**kwargs)
name= input('name>>:')
password= input('password>>:')ifconfig.has_section(name):if password == config.get(name,'password'):
logger.info('登录成功')
current_user['user']=name
current_user['login_time']=time.time()return func(*args,**kwargs)else:
logger.error('登录失败')else:
logger.error('用户名不存在')returnwrapper
@authdefbuy():print('buy...')
@authdefrun():print('''购物
查看余额
转账''')whileTrue:
choice= input('>>:').strip()if not choice:continue
if choice == '1':
buy()#=============>db目录:存放数据库文件#x_json#y_json
#=============>lib目录:存放自定义的模块与包#read_ini.py
importconfigparserdefread(config_file):
config=configparser.ConfigParser()
config.read(config_file)returnconfig#=============>log目录:存放日志#all.log
[2018-04-20 00:19:48,587][MainThread:10840][task_id:__main__][my_logsettiing.py:75][INFO][It works!]
[2018-04-20 00:28:29,387][MainThread:9492][task_id:conf.my_log_settings][my_log_settings.py:75][INFO][It works!]
[2018-04-20 00:32:14,803][MainThread:15240][task_id:conf.my_log_settings][my_log_settings.py:75][INFO][It works!]
[2018-04-20 00:39:30,564][MainThread:11216][task_id:__main__][my_log_settings.py:75][INFO][It works!]
[2018-04-20 00:39:46,132][MainThread:11216][task_id:__main__][core.py:22][INFO][登录成功]
[2018-04-20 00:41:27,929][MainThread:6644][task_id:core.core][my_log_settings.py:75][INFO][It works!]
[2018-04-20 00:41:44,162][MainThread:8620][task_id:core.core][my_log_settings.py:75][INFO][It works!]
[2018-04-20 00:41:44,163][MainThread:8620][task_id:__main__][my_log_settings.py:75][INFO][It works!]
[2018-04-20 00:41:53,689][MainThread:8620][task_id:core.core][core.py:29][ERROR][用户名不存在]
[2018-04-20 00:44:33,641][MainThread:14012][task_id:__main__][my_log_settings.py:75][INFO][It works!]
[2018-04-20 00:44:42,086][MainThread:14012][task_id:__main__][core.py:22][INFO][登录成功]
[2018-04-20 00:47:22,321][MainThread:9460][task_id:__main__][my_log_settings.py:75][INFO][It works!]
[2018-04-20 00:47:25,847][MainThread:9460][task_id:__main__][core.py:29][ERROR][用户名不存在]
[2018-04-20 00:51:58,265][MainThread:14784][task_id:core.core][my_log_settings.py:75][INFO][It works!]
[2018-04-20 00:51:58,265][MainThread:14784][task_id:__main__][my_log_settings.py:75][INFO][It works!]
[2018-04-20 00:52:14,703][MainThread:14784][task_id:core.core][core.py:22][INFO][登录成功]