[toc]

分布式airflow下的日志中文乱码问题

背景

我们的airflow部署方式为分布式的,在主节点上部署了webserver,worker节点部署了worker和日志服务器,并没有将日志写入远程服务器,所以任务的日志是直接写本地磁盘并通过日志服务器传输给webserver进行展示的。在某一次的作业日志查看中发现出现了中文乱码问题。

排查过程

  1. 首先查看日志文件的编码格式,发现确实是utf-8格式
  2. 查看日志内文件内容发现中文显示正常(当时以为见了鬼了)
  3. 通过浏览器观察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",重启日志服务器,问题解决

总结

排查过程并不算难,文章写得不好还请各位童鞋谅解,本次中文问题涉及到了修改源码的操作,不得不说老外的东西毕竟是老外的东西,他们在用的时候可能没有这种问题,希望本篇文章对各位有帮助,谢谢!

08-07 03:25