猿问

记录日期格式错误地将 │ 表示为 ¦

我有一个设置格式的日志记录脚本。它使用 utf-8 符号以提高可读性,编码设置为保存文件,如下所示。


log = logging.getLogger('general')

fmt = logging.Formatter('%(asctime)s.%(msecs)03d  │  %(levelname)-10s│  %(lineno)4s %(funcName)-20s│  %(message)s',

                        datefmt='%Y/%m/%d │ %H:%M:%S')

handler_error = logging.handlers.RotatingFileHandler("error.log", 'a', encoding="utf-8")

handler_error.setLevel(logging.INFO)

handler_error.setFormatter(fmt)

log.addHandler(handler_error)

理论上,所有的分隔符都应该是 │ 的,但是datefmt中的分隔符被改成了 ¦。因此,生成的日志如下所示 - 注意所有正确添加的垂直线,除了日期和时间之间的一组。


我试过使用 unicode \u2502而不是 │,但没有帮助。有想法该怎么解决这个吗?


日志截图


编辑 - 来自另一个用户执行的错误日志。


  File "C:\Users\xxx\AppData\Local\Programs\Python\Python37\lib\logging\__init__.py", line 1025, in emit

    msg = self.format(record)

  File "C:\Users\xxx\AppData\Local\Programs\Python\Python37\lib\logging\__init__.py", line 869, in format

    return fmt.format(record)

  File "C:\Users\xxx\AppData\Local\Programs\Python\Python37\lib\logging\__init__.py", line 610, in format

    record.asctime = self.formatTime(record, self.datefmt)

  File "C:\Users\xxx\AppData\Local\Programs\Python\Python37\lib\logging\__init__.py", line 548, in formatTime

    s = time.strftime(datefmt, ct)

UnicodeEncodeError: 'locale' codec can't encode character '\u2502' in position 9: encoding error


一只萌萌小番薯
浏览 124回答 1
1回答

弑天下

解决方案:您需要设置LC_CTYPE为UTF-8以下更多方框图字符的示例表明在字符串中进行了一些字符转换datefmt(类似于 Windows 命令tree与 之间tree /A的区别)。# -*- coding: utf-8 -*-import time, localet = time.localtime()datefmt = '%Y/%m/%d ─│┌┐└┘├┤┬┴┼═║╔╗╚╝╠╣╦╩╬ %H:%M:%S'print( '\n datefmt:', datefmt)print( '\nLC_CTYPE:', locale.getlocale(category=locale.LC_CTYPE) )print( 'strftime:', time.strftime(datefmt, t) )locale.setlocale(locale.LC_CTYPE, (locale.getlocale()[0], '1252'))print( '\nLC_CTYPE:', locale.getlocale(category=locale.LC_CTYPE) )print( 'strftime:', time.strftime(datefmt, t) )locale.setlocale(locale.LC_CTYPE, (locale.getlocale()[0], 'utf8'))print( '\nLC_CTYPE:', locale.getlocale(category=locale.LC_CTYPE) )print( 'strftime:', time.strftime(datefmt, t) )输出:.\SO\63472673.py datefmt: %Y/%m/%d ─│┌┐└┘├┤┬┴┼═║╔╗╚╝╠╣╦╩╬ %H:%M:%SLC_CTYPE: ('Czech_Czechia', '1250')strftime: 2020/08/20 ¦--¬L-++T++=¦-¬L-¦¦T¦+ 19:29:14LC_CTYPE: ('Czech_Czechia', '1252')strftime: 2020/08/20 -¦+++++¦--+-¦++++¦¦--+ 19:29:14LC_CTYPE: ('Czech_Czechia', 'utf8')strftime: 2020/08/20 ─│┌┐└┘├┤┬┴┼═║╔╗╚╝╠╣╦╩╬ 19:29:14不幸的是,我在 Python 源代码中找不到那个字符翻译(可以看到(我的本地)代码页有一个错误1250:字符─和│被翻译为¦和-,分别以相反的顺序......
随时随地看视频慕课网APP

相关分类

Python
我要回答