返回信息流重审代码 + 翻手册后找到了原因:
代码一个子模块里加了以下语句:
```python
logging.basicConfig(level=logging.DEBUG)
```
而部署时候根据加载顺序,import 子模块的时候,在上面这个子模块里的 `basicConfig()` 先被加载,root logger 配置被设置为仅有 `level=logging.DEBUG` ,默认输出是 `stderr`。应用入口的 `basicConfig()` 在之后才被加载。
而[官方的文档(2.7)](https://docs.python.org/2/library/logging.html#logging.basicConfig)是这么写的:
> Does basic configuration for the logging system by creating a StreamHandler with a default Formatter and adding it to the root logger. The functions debug(), info(), warning(), error() and critical() will call basicConfig() automatically if no handlers are defined for the root logger.
> **This function does nothing if the root logger already has handlers configured for it.**
关键就在这最后一句,因为上面提到的加载顺序的原因,主应用的 `basicConfig()` 在执行时候检测到 root logger 已经被设置,于是:
> Do nothing if the root logger already has handlers configured for it.
自己挖的坑。。。归根结底还是基础问题,还有就是手册!手册!手册!引一句经常提到的话吧:
> Read the F**king Manual.
#### 感谢提出建议和指引的各位!
--------------------更新--------------
是这样的,一个项目用的 flask + gunicorn ,flask 部分的代码如下:
import logging
from flask import Flask
app = Flask(__name__)
logging.basicConfig(filename='log.log')
LOGGER = logging.getLogger(__name__)
@app.route('/', methods=['GET'])
def index():
LOGGER.info('hello world')
return 'hello world!'
def main():
app.run(host='localhost', port=5000)
if __name__ == '__main__':
main()
原来部署以后,日志正常出现,前几天某次重新部署后(仅修改部分业务代码),就没再产生过日志,Google 翻遍了都说的是 handler 的设置,但是和我的实现不是一样的。而且,我新开了一个简单的例子,日志逻辑如上,还是能产生日志信息。
现在已经不知道要怎么办了,连服务器都重启了,难道真的要烧柱高香???
有老哥有啥建议么??
这是一条镜像帖。来源:北邮人论坛 / python / #22286同步于 2018/7/8
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Python机器人发帖
[已解决]快被一个日志的玄学问题搞疯了
mushroomboy
2018/7/8镜像同步29 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
[ema1][ema1][ema1]
这几天做梦都在审代码
打算下午重来一遍
[ema8]
【 在 fuxuemingzhu 的大作中提到: 】
: 越是找不到错误,越要找最愚蠢的错误从头捋一捋
默认的日志等级好像是 `warning`,所以以 `info` 等级输出的话是不会有任何内容的。不知道你遇到的问题是不是这个?举例如图:
【 在 mushroomboy 的大作中提到: 】
: 是这样的,一个项目用的 flask + gunicorn ,flask 部分的代码如下:
: [code=py]
: import logging
: ...................