【问题排查】nginx uwsgi python django 链路下 UnicodeEncodeError: ‘ascii‘ codec
问题描述
项目本地 docker 无问题,部署 nginx 和 uwsgi 之后输出到 logger 中文报错。
--- Logging error ---
Traceback (most recent call last):
File "/usr/lib/python3.8/logging/__init__.py", line 1088, in emit
stream.write(msg + self.terminator)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 109-110: ordinal not in range(128)
...
File "/usr/local/lib/python3.8/dist-packages/django/contrib/auth/decorators.py", line 21, in _wrapped_view
return view_func(request, *args, **kwargs)
File "/nilai/core/views/item.py", line 327, in update_meta
logger.debug(f"{meta_obj} has been update, {str(meta_obj.detail)}")
Message: '... , \u5367\u69fd'
Arguments: ()
解决方法
uwsgi.ini
中配置 zh_CN.utf-8 支持。
...
env = LANG=zh_CN.utf-8
...
其余各种尝试
对于本次问题解决没有用,提供一些思路。
1. Nginx
nignx.conf
i. 修改配置文件
bash http{ server{ ... charset utf-8; # charset UTF-8 都行 ... } }
ii. nginx 环境变量
bash sudo vim /etc/default/nginx export LANG=zh_CN.UTF-8
2. locale
进入 docker 之后 怎么修改 locale 都无法起效,需要登陆 su -
。
# 1. 安装语言依赖
sudo apt-get install -y language-pack-zh-hans language-pack-zh-hans-base
# 2. 下载字体
update-locale LANG=zh_CN.UTF-8
# or 手动添加
vim /etc/locale.gen # 取消 zh_CN.UTF-8 的注释
# 3.
dpkg-reconfigure locales # 重新生成 locale 配置文件
# or
source /etc/default/locale # 当前会话更新 locale
修改后
root@3df7c495dc4d:~# locale -a
C
C.UTF-8
POSIX
zh_CN.utf8 # 至少说明本地是有这个 zh_CN.UTF-8
3. python logger 包
直接修改logger 默认支持 utf-8。
vim /usr/lib/python3.8/logging/__init__.py # /FileHandler
# 修改 encoding
class FileHandler(StreamHandler):
"""
A handler class which writes formatted logging records to disk files.
"""
def __init__(self, filename, mode='a', encoding=None, delay=False): # => encoding='utf-8'
"""
Open the specified file and use it as the stream for logging.
"""
# Issue #27493: add support for Path objects to be passed in
filename = os.fspath(filename)
#keep the absolute path, otherwise derived classes which use this
#may come a cropper when the current directory changes
self.baseFilename = os.path.abspath(filename)
self.mode = mode
4. 链接终端
网上出现链接ssh工具不适配中文或其他字体的情况。