【问题排查】nginx uwsgi python django 链路下 UnicodeEncodeError: ‘ascii‘ codec

【问题排查】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工具不适配中文或其他字体的情况。

参考链接

  1. debian 手动修改locale
  2. locale 无法保存
  3. docker compose 下的 ascii codec
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值