芹菜工人日志包含问号 (???) 而不是正确的 unicode 字符



我正在使用Centos 6.5上的Python 2.7.8的芹菜3.1.18。

在芹菜任务模块中,我有以下代码:

# someapp/tasks.py
from celery import shared_task
from celery.utils.log import get_task_logger
logger = get_task_logger(__name__)

@shared_task()
def foo():
    logger.info('Test output: %s', u"测试中")

我在这里使用Initd脚本来运行芹菜工人。我也将以下设置放在/etc/default/celeryd中:

CELERYD_NODES="bar"
# %N will be replaced with the first part of the nodename.
CELERYD_LOG_FILE="/var/log/celery/%N.log"
# Workers should run as an unprivileged user.
#   You need to create this user manually (or you can choose
#   a user/group combination that already exists, e.g. nobody).
CELERYD_USER="nobody"
CELERYD_GROUP="nobody"

所以我的日志文件位于 /var/log/celery/bar.log中。

但是,一旦工作由工人执行,上面的日志文件显示:

[2015-05-07 03:51:14,438: INFO/Worker-1/someapp.tasks.foo(...)] Test output: ???

Unicode字符消失了,用许多问号替换。

如何恢复日志文件中的Unicode字符?

您需要在启动芹菜应用程序的环境中设置LANG=zh_CN.UTF-8

如果您使用的是celeryd,则有一种简单的方法,请在/etc/default/celeryd中设置CELERY_BIN="env LANG=zh_CN.UTF-8 /path/to/celery/binary

说明:

  1. 芹菜使用ColorFormatter进行消息格式化,这是在celery.utils.log中定义。
  2. ColorFormatter使用kombu.utils.encoding.safe_strunicode转换为str
  3. kombu.utils.encoding.safe_str用编码编码Unicode以str default_encoding中定义的CC_14返回
  4. default_encoding返回getattr(get_default_encoding_file(), 'encoding', None) or sys.getfilesystemencoding()
  5. 此外,我找不到明确编码的芹菜集,所以我认为芹菜是使用sys.getfilesystemencoding()用作将Unicode转换为Str的编码。
  6. sys.getfilesystemencoding的手册说:

    在UNIX上,编码是根据NL_LANGINFO(CODESET)的结果,或者如果NL_LANGINFO(codeSet)失败

  7. ,则无需编码。
  8. 所以,在芹菜过程环境中设置LANG=zh_CN.UTF8,告诉芹菜将UTF8转换为Str。

最新更新