import os
base_dir=os.path.dirname(os.path.dirname(__file__))
base_db=os.path.join(base_dir,'db')
base_log=os.path.join(base_dir,'log')
#定义三种日志输出格式
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 = os.path.abspath(os.path.dirname(os.path.dirname(__file__))) # log文件的目录
logfile_dir = logfile_dir+'/log'
logfile_name = 'shopping.log' # log文件名 # 如果不存在定义的日志目录就创建一个
if not os.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)传递
},
},
}

输出:

[2018-07-28 13:19:37,991][MainThread:43136][task_id:bank][bank.py:31][INFO][账户alex还款1元成功]
[2018-07-28 13:25:38,842][MainThread:41504][task_id:user][user.py:20][INFO][账户karen注册成功,初始额度15000元]
[2018-07-28 13:26:25,185][MainThread:41852][task_id:user][user.py:28][INFO][账户karen登陆成功,剩余额度15000元]
[2018-07-28 13:26:36,917][MainThread:41852][task_id:bank][bank.py:18][INFO][账户karen成功转账1000元给账户andy]
[2018-07-28 13:26:41,246][MainThread:41852][task_id:bank][bank.py:31][INFO][账户karen还款2000元成功]
[2018-07-28 13:26:45,665][MainThread:41852][task_id:bank][bank.py:42][INFO][账户karen取款1000成功,手续费50.0元]
[2018-07-28 13:26:52,368][MainThread:41852][task_id:shop][shop.py:15][INFO][账户karen购买{'IPhone': {'price': 8800, 'count': 1}}成功]

最新文章

  1. SQL Server2016 原生支持JSON
  2. LinqPad工具:帮你快速学习Linq
  3. javascript学习—理解addLoadEvent函数
  4. Java工厂设计模式
  5. spring mvc 重定向问题
  6. Codeforces Round #251 (Div. 2) B. Devu, the Dumb Guy
  7. 关于玩QQ消息导入导出功能的感想!
  8. SQL 必知必会-- 第1课:数据库基础和什么是SQL
  9. Android开发之定义接口暴露数据
  10. Android自定义drawable(Shape)详解
  11. POJ3687 Labeling Balls(拓扑)
  12. 关于Spring中的PagedListHolder分页类的分析
  13. Hadoop学习笔记(1)概述
  14. firefox os 2.0版模拟器QQ初体验
  15. nodejs加密Crypto简单例子
  16. Java中Set的contains()方法
  17. java面向对象编程(六)--四大特征之继承
  18. Hibernate SQL查询 addScalar()或addEntity()【转】
  19. MySQL:数据表基本操作
  20. Shell教程 之字符串

热门文章

  1. SQLite 数据库安装与创建数据库
  2. KVC基本使用
  3. android菜鸟学习笔记11----Intent的两点补充
  4. C#获取网页内容的三种方式(转)
  5. iOS开发常用第三方框架
  6. 题解 P3805 【【模板】manacher算法】
  7. 【题解】CF264B Good Sequences
  8. Django框架ORM单表删除表记录_模型层
  9. 关于button的自动刷新
  10. JS的事件流概念*******