Python-logging报错解决:UnicodeEncodeError: 'gbk' codec can't encode character '\u' in position: illegal

本文介绍了在Python3中遇到UnicodeEncodeError:'gbk' codec can't encode character问题的解决办法,重点是终端编码不支持Unicode字符。通过修改代码设置sys.stdout编码为UTF-8,参考了Stack Overflow上的相关问题解答。

我在Python3 中使用Logging模块把日志打到终端输出时会报错。
代码如下:

import logging
logging.basicConfig(level=logging.INFO,
                    filename='log.log',
                    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
logging.getLogger().addHandler(logging.StreamHandler(sys.stdout))

报错如下:

--- Logging error ---
Traceback (most recent call last):
  File "C:\Users\peter\Anaconda3\lib\logging\__init__.py", line 1028, in emit
    stream.write(msg + self.terminator)
UnicodeEncodeError: 'gbk' codec can't encode character '\u1ecb' in position 582: illegal multibyte sequence
Call stack:
  File "C:/Users/peter/Documents/GitHub/youtube-spider/youtube-search-spider.py", line 129, in <module>
    asyncio.get_event_loop().run_until_complete(new_search_page(url=search_url))
  File "C:\Users\peter\Anaconda3\lib\asyncio\base_events.py", line 566, in run_until_complete
    self.run_forever()
  File "C:\Users\peter\Anaconda3\lib\site-packages\nest_asyncio.py", line 71, in run_forever
    self._run_once()
  File "C:\Users\peter\Anaconda3\lib\asyncio\base_events.py", line 1771, in _run_once
    handle._run()
  File "C:\Users\peter\Anaconda3\lib\site-packages\nest_asyncio.py", line 135, in run
    ctx.run(self._callback, *self._args)
  File "C:\Users\peter\Anaconda3\lib\asyncio\tasks.py", line 329, in __wakeup
    self.__step()
  File "C:\Users\peter\Anaconda3\lib\site-packages\nest_asyncio.py", line 101, in step
    step_orig(task, exc)
  File "C:\Users\peter\Anaconda3\lib\asyncio\tasks.py", line 249, in __step
    result = coro.send(None)
Message: "counts: 68 names:
Arguments: ()

这是因为终端默认的编码是gbk,不是utf-8,修改代码如下:

sys.stdout.reconfigure(encoding='utf-8')
import logging
logging.basicConfig(level=logging.INFO,
                    filename='log.log',
                    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
logging.getLogger().addHandler(logging.StreamHandler(sys.stdout))

参考:
unicode - How to set sys.stdout encoding in Python 3? - Stack Overflow
python - python3 logger - UnicodeEncodeError - Stack Overflow
python 3.6 logging modul error UnicodeEncodeError: ‘charmap’ codec can’t encode characters - Stack Overflow
UTF-8 In Python logging, how? - Stack Overflow

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值