在Python中使用全局日志时需要注意的问题


Posted in Python onMay 06, 2015

在使用 uliweb 开发 soap webservice 后,启动 uliweb 时,werkzeug 的日志莫名其妙丢失了。

正常的日志:

[INFO]  * Loading DebuggedApplication...

[INFO]  * Running on http://localhost:8000/

[INFO]  * Restarting with reloader

[INFO]  * Loading DebuggedApplication...

异常的日志:

[INFO]  * Loading DebuggedApplication...

[INFO]  * Loading DebuggedApplication...

事实上, werkzeug 相关 INFO 及其以下级别的日志全部都看不到了,这太诡异了,于是果断提交了issue

而且我创建一个新的项目和 app 后,并没有日志丢失的问题,于是我怀疑是因为我从 uliweb 0.1.3 升级到 0.1.4 导致的,我的项目是使用 0.1.3 创建的,之前也没有注意过日志的问题,但是得到 limodou 的答复后,我否定了这一点

  •     uliweb在创建项目时不会生成象 Django 一样的 manage.py 之类的东西,就是 settings.py 等一些配置文件和启动文件, 都是和版本无关的。

仔细想想,我的项目和新创建的项目的区别在于 settings.ini 丰富了一些,然后用了 pysimplelib,好吧,从源码追踪吧。

我看了 uliweb 内置的 zerkzeug 代码,创建日志这里很明确

uliweb/lib/werkzeug/serving.py

112         if not logging.root.handlers and _logger.level == logging.NOTSET:

113             _logger.setLevel(logging.INFO)

114             handler = logging.StreamHandler()

115             _logger.addHandler(handler)[code]
当全局 logging.root 中已经定义了 Handler 或者 werkzeug 没有定义日志级别,werkzeug 会将其 logger 的日志级别 设置为 info,而打印 werkzeug 日志的地方,恰巧用了 info 级别
[code][INFO]  * Running on http://localhost:8000/

[INFO]  * Restarting with reloader

也就是说,因为已经定义其它 logging handler 的原因,导致无法输出 werkzeug 日志

grep pysimplelib 下的结果

./client.py:33: logging.basicConfig(format='%(levelname)s:%(message)s', level=logging.WARNING)

./simplexml.py:27:logging.basicConfig(format='%(levelname)s:%(message)s', level=logging.WARNING)

./transport.py:30:logging.basicConfig(format='%(levelname)s:%(message)s', level=logging.WARNING)

好吧,果然是这家伙在作祟,注释掉这三行代码后,werkzeug 日志正常输出

说起来,这不应该算是 uliweb 的问题,pysimplesoap 的库修改的全局设计,似乎应该给它提个 issue 才是, 这个 issue 应该可以关闭了。

这里有个 workaround,在 apps/settings.ini 中添加

[LOG.Loggers]

werkzeug = {'propagate':0, 'level': 'info', 'format':'format_simple'}

当然,建议 limodou 将 default_settings.ini 中的 zerkzeug 的日志级别默认设置成 info,因为这个问题实 在太诡异了,毕竟 werkzeug 中的默认日志级别就是 info。

好了,回顾一下,pysimplesoap 中因为覆盖了全局日志级别,导致 werkzeug 无法输入低于 warning 的日志,所以, 如果我们在开发开放 python 库的时候,还是将日志打在自己的命名空间下吧,不要去碰全局的 logging 设置,这样 会对别人造成困扰。

Python 相关文章推荐
python3.5仿微软计算器程序
Mar 30 Python
Python基于更相减损术实现求解最大公约数的方法
Apr 04 Python
Python json模块dumps、loads操作示例
Sep 06 Python
python实现坦克大战游戏 附详细注释
Mar 27 Python
python实现翻转棋游戏(othello)
Jul 29 Python
python实现通过队列完成进程间的多任务功能示例
Oct 28 Python
在PyCharm中遇到pip安装 失败问题及解决方案(pip失效时的解决方案)
Mar 10 Python
解决python图像处理图像赋值后变为白色的问题
Jun 04 Python
python 利用openpyxl读取Excel表格中指定的行或列教程
Feb 06 Python
Python爬虫之爬取某文库文档数据
Apr 21 Python
浅析Python中的套接字编程
Jun 22 Python
Python编程编写完善的命令行工具
Sep 15 Python
python通过post提交数据的方法
May 06 #Python
python实现逆波兰计算表达式实例详解
May 06 #Python
编写Python脚本批量下载DesktopNexus壁纸的教程
May 06 #Python
在Windows服务器下用Apache和mod_wsgi配置Python应用的教程
May 06 #Python
利用Python脚本在Nginx和uwsgi上部署MoinMoin的教程
May 05 #Python
Python实现的HTTP并发测试完整示例
Apr 23 #Python
安装dbus-python的简要教程
May 05 #Python
You might like
PHP实现MySQL更新记录的代码
2008/06/07 PHP
完美解决:Apache启动问题―(OS 10022)提供了一个无效的参数
2013/06/08 PHP
PHP日期函数date格式化UNIX时间的方法
2015/03/19 PHP
Yii框架组件和事件行为管理详解
2016/05/20 PHP
Thinkphp 框架扩展之类库扩展操作详解
2020/04/23 PHP
jQuery 1.4 15个你应该知道的新特性(译)
2010/01/24 Javascript
获取表单控件原始(初始)值的方法
2013/08/21 Javascript
jquery无法设置checkbox选中即没有变成选中状态
2014/03/27 Javascript
angularjs 处理多个异步请求方法汇总
2015/01/06 Javascript
JavaScript实现自动变换表格边框颜色
2015/05/08 Javascript
js实现浏览本地文件并显示扩展名的方法
2015/08/17 Javascript
JS如何生成一个不重复的ID的函数
2016/12/25 Javascript
JS获取填报扩展单元格控件的值的解决办法
2017/07/14 Javascript
postman自定义函数实现 时间函数的思路详解
2019/04/17 Javascript
详解Vue demo实现商品列表的展示
2019/05/07 Javascript
vue实现路由监听和参数监听
2019/10/29 Javascript
python模拟鼠标拖动操作的方法
2015/03/11 Python
在matplotlib的图中设置中文标签的方法
2018/12/13 Python
Python I/O与进程的详细讲解
2019/03/08 Python
解决TensorFlow调用Keras库函数存在的问题
2020/07/06 Python
python 常见的反爬虫策略
2020/09/27 Python
Django中的DateTimeField和DateField实现
2021/02/24 Python
GWT都有什么特性
2016/12/02 面试题
外企求职信范文分享
2013/12/31 职场文书
数控技术专业毕业自荐书范文
2014/02/05 职场文书
高中教师评语大全
2014/04/25 职场文书
写得不错的求职信范文
2014/07/11 职场文书
关于群众路线的心得体会
2014/11/05 职场文书
2015年中学元旦晚会活动方案
2014/12/09 职场文书
2015年精神文明建设工作总结
2015/04/21 职场文书
如何写通讯稿
2015/07/22 职场文书
使用Django实现商城验证码模块的方法
2021/06/01 Python
Python Pandas pandas.read_sql_query函数实例用法分析
2021/06/21 Python
Spring Boot实战解决高并发数据入库之 Redis 缓存+MySQL 批量入库问题
2022/02/12 Redis
详解在SQLPlus中实现上下键翻查历史命令的功能
2022/03/18 SQL Server
python中的getter与setter你了解吗
2022/03/24 Python