首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python 学习手册
Python Cookbook
Python 基础教程
Python Sites
PyPI - Python Package Index
http://www.simple-is-better.com/
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
V2EX  ›  Python

请问怎么解决 logging 中出现的 GBK 编码错误问题

  •  
  •   yangyaofei · 195 天前 · 1236 次点击
    这是一个创建于 195 天前的主题,其中的信息可能已经有所发展或是发生改变。

    打 log 的时候,因为会出现 emoji,而 gbk 是不支持 emoji 的,所以刚开始的时候在 windows 机器上(部署程序的机器)的终端打印的 log 会出现 encode error 问题🤦‍

    因为没办法,我们写了个 handler,将 log 存到数据库里面,basic logger 设置成存入日志文件中,以为不在终端打印 emoji 什么的就不会出现问题,但是依然报错😂😂😂

    请问,有没有遇见过这种情况的,有什么办法可以解决啊.关键是这个错误是 logging error,都捕获不到异常...

    9 回复  |  直到 2018-03-16 15:50:22 +08:00
        1
    xpresslink   195 天前
    看不懂你说什么,windows 机器上也用 utf-8 啊,直接用 byte 模式写根本不会有编码问题。
        2
    xpresslink   195 天前
    直接国标码 GB18030 也能支持 emoji
        3
    yangyaofei   195 天前 via Android
    @xpresslink 是 utf8 但是显示在终端的时候会内部转成 gbk 导致错误,并不是想用什么显示
        4
    kunluanbudang   195 天前
    你们使用的是这个 handler 吗?

    ```
    class RotatingFileHandler(BaseRotatingHandler):
    """
    Handler for logging to a set of files, which switches from one file
    to the next when the current file reaches a certain size.
    """
    def __init__(self, filename, mode='a', maxBytes=0, backupCount=0, encoding=None, delay=False):
    ```

    好像有一个 encoding 的参数
        5
    yangyaofei   194 天前 via Android
    @kunluanbudang 没有,我自己写的 handler,就是很简单的获取后存数据库,另一个就是用 basicConfig 设置成文件输出
        6
    qq316107934   194 天前 via Android
    遇到了同样的问题,关注
        7
    ZoomQuiet   193 天前 via iPhone
    是也乎 ╮(╯▽╰)╭

    最好给一下具体的报错日志现场 文本…

    问题的关键在你的判定 gbk 的锅在哪个环节爆的?

    目测终端~logging 问题不大…可能是业务代码本身?
        8
    yangyaofei   192 天前 via Android
    @ZoomQuiet 不是,是这样的,一个 str 在 python3 里面肯定是 unicode,在显示的时候肯定要转换成系统终端的编码方式,所以当有 emoji 的时候转换不了所以会报错。你可以写个 print("😂😂😂"),估计在 win 的中文系统里面也会报错的,这个地方的问题是我没有输出到终端,输出到文本也这样,我怀疑是输出文件的时候也会转码成 gbk
        9
    yangyaofei   192 天前 via Android
    @qq316107934 同上,我觉得这个问题可以把原始的 logger remove 出来,然后再添加一个自己用的 file 或者 stream hadler 来解决,最近在弄优先级更高的任务,所以没弄。要是能找到 basicConfig 里面怎么设置 encode 我想也可以。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   666 人在线   最高记录 3762   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.1 · 42ms · UTC 19:01 · PVG 03:01 · LAX 12:01 · JFK 15:01
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1