今天在部署一個(gè)服務(wù)的時(shí)候遇到一個(gè)問題腐芍,記錄一下:
這個(gè)服務(wù)本身已經(jīng)部署了多臺(tái)機(jī)器,所以當(dāng)出現(xiàn)下面的錯(cuò)誤的時(shí)候感覺似乎又點(diǎn)兒不對(duì)。
報(bào)錯(cuò):
UnicodeEncodeError: 'ascii' codec can't encode characters in position 36-41: ordinal not in range(128)
一看就是編碼的問題,查詢資料
https://segmentfault.com/q/1010000003932742
http://www.reibang.com/p/9ed4cca9172e
https://www.binss.me/blog/solve-problem-of-python3-raise-unicodeencodeerror-when-print-utf8-string/
http://blog.csdn.net/fengfeiliusheng1990/article/details/77966396
以上的都沒能解決問題高蜂,但是還是提供了思路
在服務(wù)器執(zhí)行命令: locale charmap
輸出:ANSI_X3.4-1968
這個(gè)字符集一旦出現(xiàn)中文就會(huì)報(bào)錯(cuò)。
主要報(bào)錯(cuò)的代碼如下
def writeLog(message):
logDir =Cfg.PATH['log_dir']
if not os.path.exists(logDir):
os.makedirs(logDir)
msg ="[%s] %s" % (time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), message)
print(msg)
logger=logging.getLogger()
filename = time.strftime('%Y-%m-%d',time.localtime(time.time()))
handler=logging.FileHandler(os.path.join(logDir,filename + ".log"))
logger.addHandler(handler)
logger.setLevel(logging.ERROR)
logger.error(msg)
logger.removeHandler(handler)
然后看到這個(gè):
1.http://blog.csdn.net/AckClinkz/article/details/78538462
PYTHONIOENCODING=utf-8 pythonyour_script.py
這樣解決了控制臺(tái)print輸出中文字符的問題
2.第二個(gè)問題就是logging寫文件的問題罕容,按圖索驥發(fā)現(xiàn)logging的FileHandler沒有制定utf-8格式
果斷修改代碼
handler=logging.FileHandler(os.path.join(logDir,filename + ".log"),encoding='utf-8’)
經(jīng)過這個(gè)問題备恤,以后務(wù)必注意文件編碼。只要有io以及控制臺(tái)輸入輸出的都中文字符的都加上encoding