[toc]
分布式airflow下的日志中文乱码问题
背景
我们的airflow部署方式为分布式的,在主节点上部署了webserver,worker节点部署了worker和日志服务器,并没有将日志写入远程服务器,所以任务的日志是直接写本地磁盘并通过日志服务器传输给webserver进行展示的。在某一次的作业日志查看中发现出现了中文乱码问题。
排查过程
- 首先查看日志文件的编码格式,发现确实是utf-8格式
- 查看日志内文件内容发现中文显示正常(当时以为见了鬼了)
- 通过浏览器观察webserver发送的获取日志的请求,发现请求路径为http://slave1:8793/log/dag_name/task_name/datetime,通过该路径去查看airflow源码,发现cli.py这个文件中一段代码
@flask_app.route('/log/<path:filename>')
def serve_logs(filename): # noqa
log = os.path.expanduser(conf.get('core', 'BASE_LOG_FOLDER'))
return flask.send_from_directory(
log,
filename,
mimetype="application/json",
as_attachment=False)
WORKER_LOG_SERVER_PORT = \
int(conf.get('celery', 'WORKER_LOG_SERVER_PORT'))
flask_app.run(
host='0.0.0.0', port=WORKER_LOG_SERVER_PORT)
该代码中的 flask.send_from_directory 这个方法是传输本地文件的给webserver进行日志展示的
解决办法
修改mimetype为mimetype="application/json;charset=utf-8",重启日志服务器,问题解决
总结
排查过程并不算难,文章写得不好还请各位童鞋谅解,本次中文问题涉及到了修改源码的操作,不得不说老外的东西毕竟是老外的东西,他们在用的时候可能没有这种问题,希望本篇文章对各位有帮助,谢谢!