gpt4 book ai didi

python - StreamHandler - 不记录到 docker 容器中的 sys.stdout - Python

转载 作者:行者123 更新时间:2023-12-03 14:56:33 25 4
gpt4 key购买 nike

我的 Python 应用程序中有一个 RotatingFileHandler 和 StreamHandler 。这是在 docker 容器中的 apache 服务器中运行的。因此,我将 apache 访问和错误日​​志都符号链接(symbolic link)到/dev/stdout,如下所示:

RUN ln -sf /dev/stdout /project/Project_Service/log/access.log && \
ln -sf /dev/stdout /project/Project_Service/log/error.log

我已将处理程序设置为:
app = Flask(__name__)
app.logger.setLevel(logging.DEBUG)
formatter = logging.Formatter(
"%(asctime)s - %(name)s - %(levelname)s - %(message)s")

file_handler = RotatingFileHandler(app_error,
maxBytes=1024 * 1024 * 100, backupCount=20)
file_handler.setLevel(logging.DEBUG)
file_handler.setFormatter(formatter)

stream_handler = logging.StreamHandler(stream=sys.stdout)
stream_handler.setLevel(logging.DEBUG)
stream_handler.setFormatter(formatter)

app.logger.addHandler(file_handler)
app.logger.addHandler(stream_handler)
app.logger.debug('DEBUG LOG')
app.logger.info('INFO LOG')
app.logger.warning('WARNING LOG')
app.logger.error('ERROR LOG')
app.logger.critical('CRITICAL LOG')

如果我查看 app_error 文件,我可以正确看到输出:
2018-12-06 19:37:46,863 - app - DEBUG - DEBUG LOG
2018-12-06 19:37:46,865 - app - INFO - INFO LOG
2018-12-06 19:37:46,865 - app - WARNING - WARNING LOG
2018-12-06 19:37:46,866 - app - ERROR - ERROR LOG
2018-12-06 19:37:46,868 - app - CRITICAL - CRITICAL LOG

这可以在 docker 日志中看到:
[Thu Dec 06 19:37:46.864764 2018] [:error] [pid 8] 2018-12-06 19:37:46,863 - app - DEBUG - DEBUG LOG
[Thu Dec 06 19:37:46.865872 2018] [:error] [pid 8] 2018-12-06 19:37:46,865 - app - INFO - INFO LOG
[Thu Dec 06 19:37:46.866116 2018] [:error] [pid 8] 2018-12-06 19:37:46,865 - app - WARNING - WARNING LOG
[Thu Dec 06 19:37:46.866370 2018] [:error] [pid 8] [2018-12-06 19:37:46,866] ERROR in app: ERROR LOG
[Thu Dec 06 19:37:46.868450 2018] [:error] [pid 8] 2018-12-06 19:37:46,866 - app - ERROR - ERROR LOG
[Thu Dec 06 19:37:46.870184 2018] [:error] [pid 8] [2018-12-06 19:37:46,868] CRITICAL in app: CRITICAL LOG
[Thu Dec 06 19:37:46.870448 2018] [:error] [pid 8] 2018-12-06 19:37:46,868 - app - CRITICAL - CRITICAL LOG

这是有道理的,因为我同时拥有错误日志(我假设它具有 ERROR 和 CRITICAL 的日志级别)和流处理程序。但是,如果我取出错误日志的符号链接(symbolic link),两个日志都会消失。就好像 StreamHandler 正在输出到 dev/stderr,即使我已在 StreamHandler 中将其声明为 sys.stdout。我也尝试删除“stream =”,但这并没有解决任何问题。我一直在翻阅所有文档,似乎无法弄清楚如何解决这个问题。

我也设置了 PYTHONUNBUFFERED=0在环境变量中。

感谢您提供的任何帮助或指导。

最佳答案

Flask 已经将“默认” StreamHandler 附加到应用程序记录器。因此,在您附加 2 个记录器后,实际上有 3 个记录器:

print(app.logger.handlers)
[<logging.StreamHandler object at 0x7ff30592b358>,
<logging.handlers.RotatingFileHandler object at 0x7ff3058e2e80>,
<logging.StreamHandler object at 0x7ff3058f33c8>]
这也解释了为什么这两行有不同的格式——它们来自默认的 StreamHandler ,它有自己的格式化程序:
2018-12-06 19:37:46,863 - app - DEBUG - DEBUG LOG
2018-12-06 19:37:46,865 - app - INFO - INFO LOG
2018-12-06 19:37:46,865 - app - WARNING - WARNING LOG
[2018-12-06 19:37:46,866] ERROR in app: ERROR LOG # <----
2018-12-06 19:37:46,866 - app - ERROR - ERROR LOG
[2018-12-06 19:37:46,868] CRITICAL in app: CRITICAL LOG # <----
2018-12-06 19:37:46,868 - app - CRITICAL - CRITICAL LOG
解决方法是简单地 在添加您的处理程序之前删除所有处理程序 :
app.logger.handlers = []

关于python - StreamHandler - 不记录到 docker 容器中的 sys.stdout - Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53658866/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com