log類
#!/usr/bin/env python # -*- coding:utf-8 -*- import logging.handlers class Logger(logging.Logger): def __init__(self, filename=None): super(Logger, self).__init__(self) # 日志文件名 if filename is None: filename = 'cgss.log' self.filename = filename # 創建一個handler,用於寫入日志文件 (每天生成1個,保留30天的日志) fh = logging.handlers.TimedRotatingFileHandler(self.filename, 'D', 1, 5) fh.suffix = "%Y%m%d-%H%M.log" fh.setLevel(logging.DEBUG) # 再創建一個handler,用於輸出到控制台 ch = logging.StreamHandler() ch.setLevel(logging.DEBUG) # 定義handler的輸出格式 formatter = logging.Formatter('[%(asctime)s] - %(filename)s [Line:%(lineno)d] - [%(levelname)s]-[thread:%(thread)s]-[process:%(process)s] - %(message)s') fh.setFormatter(formatter) #ch.setFormatter(formatter) # 給logger添加handler self.addHandler(fh) #self.addHandler(ch)
handler類
class test(tornado.web.RequestHandler): def get(self): log = Logger() # 輸出日志 log.info("日志模塊消息!") log.debug("日志模塊調試消息!") log.error("日志模塊錯誤消息!") self.write("hello world")
源鏈接:http://blog.csdn.net/cyh1111/article/details/53405795
詳解
TimedRotatingFileHandler的構造函數定義如下(2.5版本API為例): TimedRotatingFileHandler(filename [,when [,interval [,backupCount]]]) filename 是輸出日志文件名的前綴 when 是一個字符串的定義如下: “S”: Seconds “M”: Minutes “H”: Hours “D”: Days “W”: Week day (0=Monday) “midnight”: Roll over at midnight interval 是指等待多少個單位when的時間后,Logger會自動重建文件,當然,這個文件的創建 取決於filename+suffix,若這個文件跟之前的文件有重名,則會自動覆蓋掉以前的文件,所以 有些情況suffix要定義的不能因為when而重復。 backupCount 是保留日志個數。默認的0是不會自動刪除掉日志。若設10,則在文件的創建過程中 庫會判斷是否有超過這個10,若超過,則會從最先創建的開始刪除。
2.7日志模塊與3.5的區別
python2.7 支持絕對路徑和相對路徑, 而3.5默認是相對路徑
如果3.5使用相對路徑的話
if filename is None: filepath = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))), "cgss.log") filename = filepath2 self.filename = filename
絕對路徑呢?
if filename is None: filepath2 = os.path.abspath("/opt/code/my_code/readerwriter_file_mysql/cgss.log") filename = filepath2 self.filename = filename
還需要注意個地方就是日志模塊不支持多進程
剛才去瞄了一下官網,有更詳細的解釋,可以去看看,推薦去官網
詳情:http://blog.csdn.net/yongche_shi/article/details/49890103
# 創建一個handler,用於寫入日志文件 (每天生成1個,保留30天的日志) # fh = logging.handlers.TimedRotatingFileHandler(self.filename, 'D', 1, 5) fh = logging.handlers.WatchedFileHandler(self.filename)