import 方式

所有对包的操作,都相当于对包下的__init__操作

from a.b.c import d

b 必须 是包 import 最后只有一个层级

相对导入 . 代表当前路径, .. 代表父级路径

logging日志

# 旗舰版
## 旗舰版logging import os
import logging.config ## 定义三种输出格式 standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' \
'[%(levelname)s][%(message)s]' ## (时间,线程名字,线程数量,任务名字,文件名字,报错行数,等级,信息) 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.dirname(os.path.abspath(__file__)) logfile_name = 'log1.log'
logfile_name_boss = 'boss.log'
## 如果不存在定义的日志目录就创建一个 if not os.path.isdir(logfile_dir):
os.mkdir(logfile_dir) # log 文件的全路径 logfile_path = os.path.join(logfile_dir,'logs',logfile_name)
logfile_path_boss = os.path.join(logfile_dir,'boss',logfile_name_boss)
## log配置字典 LOGGING_DIG= {
'version':1,
'disable_existing_loggers':False,
'formatters':{ ## 配置相应格式化
'standard':{
'format':standard_format
},
'simple':{
'format':simple_format
},
'easy':{
'format':id_simple_format
}
},
'filters':{},
'handlers':{ ## 配置句柄 文件 或者 控制台
'console':{
'level':'DEBUG',
'class':'logging.StreamHandler',
'formatter':'simple'
},
'default':{
'level':'DEBUG',
'class':'logging.handlers.RotatingFileHandler', ## 轮换着保存到文件
'formatter':'standard',
'filename':logfile_path, # 文件名字 绝对路径
'maxBytes':1024*1024*5, ## 单文件最大大小 字节
'backupCount':5, ## 最多多少个文件
'encoding':'utf-8'
},
'sb_boss':{
'level':'DEBUG',
'class':'logging.handlers.RotatingFileHandler', ## 轮换着保存到文件
'formatter':'easy',
'filename':logfile_path_boss, # 文件名字 绝对路径
'maxBytes':1024*1024*5, ## 单文件最大大小 字节
'backupCount':5, ## 最多多少个文件
'encoding':'utf-8'
}
},
'loggers':{ #对象
'':{
'handlers':['default','console','sb_boss'],
'level':'DEBUG',
'propagate':True
}
}
} def load_my_logging_cfg(task_id):
logging.config.dictConfig(LOGGING_DIG) ## 添加配置
logger = logging.getLogger(task_id) ## 任务标识
return logger if __name__ == '__main__':
logger = load_my_logging_cfg('购物车') ##这是使用,这个部分可以包装成函数
logger.info('it works')

最新文章

  1. Android Weekly Notes Issue #234
  2. IONIC 开发的Android应用程序签名(或重新签名)详解
  3. ORACLE与mysql中查询第n条到第m条的数据记录的方法
  4. windows设置开机启动项
  5. tp5文件上传
  6. linux tcp/ip编程和windows tcp/ip编程差别以及windows socket编程详解
  7. iOS开发——使用技术OC篇&简单九宫格锁屏功能的实现与封装
  8. Revit二次开发-根据Element获取系统族信息
  9. (六)Ireport制作一个规范的报表,处理数据格式
  10. ADO.NET 快速入门(十):过滤数据
  11. webview相关链接
  12. 超强1000 JQuery插件
  13. web.xml 的加载顺序
  14. [转载] 创建为ClickOnce清单签名的.pfx格式数字证书
  15. 移动端touch事件 || 上拉加载更多
  16. Python进阶10---魔术方法*
  17. Safari无痕模式是不能只使用localStorage存储数据要用Cookie做补丁
  18. Java 使用 Redis存储系统
  19. 性能监控(4)–linux下的pidstat命令
  20. Sci_DRead_ParaBuzzerDriver_st_BuzzerSoundOpening1

热门文章

  1. WPF 设置类库项目为启动项,设置窗体跟随。
  2. 关于C#你应该知道的2000件事
  3. MySQL 执行原生sql
  4. wpf采用Xps实现文档显示、套打功能
  5. WPF中的多进程(Threading)处理实例(二)
  6. 微信小程序把玩(十二)text组件
  7. Play Framework + ReactiveMongo 环境搭建
  8. 使用WebBrowser并调用网页中的JS函数
  9. [铁人赛] ASP.NET Core 2 系列- 从头开始
  10. Unity 入門 - 延遲解析