python2.7下使用logging模塊記錄日志到終端顯示亂碼問題解決


剛才翻了翻2年以前用python2.7寫的一個爬蟲程序,主要功能就是把各地市知識產權局/專利局網站的專利相關項目、課題通知,定期爬取和分析,輔助企業進行項目申請。

這里要談的不是爬蟲功能的實現,而是今天重跑程序的時候發現,日志文件正常展現中文,但是終端展現的確實亂碼。影響體驗,着實比較郁悶。

 

相關代碼如下:

1、python文件是utf-8編碼

2、使用logging模塊記錄日志,同步輸出到app.log文件,和終端標准輸出。

3、使用了sys.setdefaultencoding的方式來解決亂碼問題。

 

# coding=UTF-8
import sys
import logging

reload(sys)
sys.setdefaultencoding('utf8')  # @UndefinedVariable

cur_path = os.path.dirname(os.path.abspath(sys.argv[0]))

logging.basicConfig(level=logging.INFO,
                #format='[%(asctime)s] [%(filename)s:%(lineno)d] %(levelname)s %(message)s',
                format='[%(asctime)s] %(message)s',
                datefmt='%Y-%m-%d %H:%M:%S, %a',
                filename=cur_path+'/../log/app.log',
                filemode='w')

#################################################################################################
# 定義一個StreamHandler,將INFO級別或更高的日志信息打印到標准錯誤,並將其添加到當前的日志處理對象#
console = logging.StreamHandler()
console.setLevel(logging.DEBUG)
formatter = logging.Formatter('[%(asctime)s] [%(filename)s:%(lineno)d] %(levelname)s %(message)s')
console.setFormatter(formatter)
logging.getLogger('').addHandler(console)
#################################################################################################

 

標准輸入是亂碼:

[2018-02-19 22:07:37,211] [app_main.py:100] INFO ++++++++++ 寮€濮嬪惎鍔ㄦ姄鍙栫▼搴?.. ++++++++++
[2018-02-19 22:07:37,217] [app_conf.pyo:70] WARNING 娌℃湁鎸囧畾瑕佺瓫閫夋柊闂葷殑璧峰鏃墮棿錛岄粯璁ら€夋嫨褰撴棩銆?
[2018-02-19 22:07:37,224] [app_conf.pyo:73] WARNING 娌℃湁鎸囧畾瑕佺瓫閫夋柊闂葷殑緇撴潫鏃墮棿錛岄粯璁ら€夋嫨褰撴棩銆?
[2018-02-19 22:07:37,227] [base_module.pyo:64] INFO ---------- 寮€濮嬫姄鍙栫綉欏靛唴瀹癸紝騫剁瓫閫夋柊闂葷粨鏋溿€?---------

但是日志文件顯示正常:

[2018-02-19 22:07:37, Mon] ++++++++++ 開始啟動抓取程序... ++++++++++
[2018-02-19 22:07:37, Mon] 沒有指定要篩選新聞的起始時間,默認選擇當日。
[2018-02-19 22:07:37, Mon] 沒有指定要篩選新聞的結束時間,默認選擇當日。
[2018-02-19 22:07:37, Mon] ---------- 開始抓取網頁內容,並篩選新聞結果。----------

 

查了半天,終於發現棋差一招,使用logging記日志的時候,需要帶中文的字符串前面再加上 u

比如:

logging.info( u'++++++++++ 開始啟動抓取程序... ++++++++++ ')
logging.info( u'本次抓取結束,總耗時:%d秒\n\n' % (end-start))

這樣就完美解決標准輸出亂碼問題啦。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM