參考
https://cloud.tencent.com/developer/article/1354396
http://cn.voidcc.com/question/p-bywlbukc-tp.html
需求
在Python中手動記錄日誌,並且日誌以日期的方式輸出到文件名
解決方法
兩種方法
- logging原生
- TimedRotatingFileHandler
第一種方法:
日誌配置文件:logging.conf.ini
[loggers]
keys = root,sampleLogger
[handlers]
keys = consoleHandler
[formatters]
keys = sampleFormatter
[logger_root]
level = DEBUG
handlers = consoleHandler
[logger_sampleLogger]
level = DEBUG
handlers = consoleHandler
qualname = sampleLogger
propagate = 0
[handler_consoleHandler]
class = StreamHandler
level = DEBUG
formatter = sampleFormatter
args = (sys.stdout,)
[formatter_sampleFormatter]
format = %(asctime)s - %(name)s - %(lineno)s - %(levelname)s - %(message)s
代碼:
import logging
import logging.config
from datetime import datetime
# 定義日誌存放路徑
# LOG_PATH = "/data/zaspace/data/AutoRelease/log/"
LOG_PATH = "D:\\software\\laragon\\www\\test\\AutoRelease\\log\\"
def log_init():
"""
日誌初始化
:return:
"""
# 加載日誌配置文件
logging.config.fileConfig(fname='logging.conf.ini', disable_existing_loggers=False)
logger = logging.getLogger('mainLogger')
# 定義日誌存放路徑
log_path = LOG_PATH
# 日誌文件名稱 - 以日期爲文件名
fh = logging.FileHandler(log_path + '{:%Y-%m-%d}.log'.format(datetime.now()))
# 設置日誌格式 時間 - 名稱 - 行數 - 嚴重程度 - 日誌內容
formatter = logging.Formatter('%(asctime)s - %(name)s - %(lineno)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter)
logger.addHandler(fh)
return logger
# 日誌初始化
main_logger = log_init()
# 記錄日誌
main_logger.info('這個是警告1')
main_logger.debug('這個是調試1')
main_logger.error('這個是錯誤1')
運行後:
控制檯會顯示:
Connected to pydev debugger (build 191.8026.44)
2019-08-12 18:33:45,538 - mainLogger - 75 - INFO - 這個是警告1
2019-08-12 18:33:45,538 - mainLogger - 76 - DEBUG - 這個是調試1
2019-08-12 18:33:45,538 - mainLogger - 77 - ERROR - 這個是錯誤1
同時會輸出文件:
2019-08-12.log
2019-08-12 18:33:45,538 - mainLogger - 75 - INFO - 這個是警告1
2019-08-12 18:33:45,538 - mainLogger - 76 - DEBUG - 這個是調試1
2019-08-12 18:33:45,538 - mainLogger - 77 - ERROR - 這個是錯誤1
第二種方法:
使用TimedRotatingFileHandler
TimedRotatingFileHandler類可以實現按照時間進行劃分,不僅日期,比如每隔一個小時記錄一個日誌也是可以實現的
代碼:
import logging
# 定義日誌存放路徑
# LOG_PATH = "/data/zaspace/data/AutoRelease/log/"
LOG_PATH = "D:\\software\\laragon\\www\\test\\AutoRelease\\log\\"
def log_init():
"""
日誌初始化
:return:
"""
logger = logging.getLogger('main_logger')
logger.setLevel(logging.INFO)
# 定義日誌存放路徑
log_path = LOG_PATH
# 日誌文件名稱
filename = log_path + "release"
# 設置日誌格式 時間 - 名稱 - 行數 - 嚴重程度 - 日誌內容
formatter = logging.Formatter('%(asctime)s - %(name)s - %(lineno)d - %(levelname)s - %(message)s')
# 以日期輸出日誌名,從0點開始滾動日誌,只保留30天的日誌
log_file_handler = TimedRotatingFileHandler(filename, when="MIDNIGHT", interval=1, backupCount=30)
log_file_handler.setFormatter(formatter)
log_file_handler.setLevel(logging.INFO)
logger.addHandler(log_file_handler)
return logger
# 日誌初始化
main_logger = log_init()
# 記錄日誌
main_logger.info('這個是註釋')
main_logger.error('這個是註釋')
會輸出文件:
release
2019-08-12 18:44:25,898 - main_logger - INFO - 這個是警告
2019-08-12 18:44:25,899 - main_logger - ERROR - 這個是錯誤
如果release日誌文件裏面有其他日期的內容,會單獨分割出來:
release.2019-08-09等文件名
TimedRotatingFileHandler(filename, when="MIDNIGHT", interval=1, backupCount=30)
參數解釋
- filename 是輸出日誌的文件名稱前綴,比如說 testServiceLog 這樣的就是日誌文件名前綴
- when,是一個字符串,定義了日誌切分的間隔時間單位,這是一個枚舉類,可選參數如下:
"S":Second 秒
"M":Minutes 分鐘
"H":Hour 小時
"D":Days 天
"W":Week day(0 = Monday)
"midnight":Roll over at midnight
- interval 是間隔時間單位的個數,指等待多少個 when 的時間後 Logger 會自動重建新聞繼續進行日誌記錄
- backupCount 是保留日誌的文件個數,默認的參數是0,這種設置下是不會自動刪除文件的。如果設置爲 N(正整數),則會在創建新的日誌文件時會檢查日誌文件個數是否到達 N,達到了的話就會從最先創建的開始刪除,從而達到維持日誌文件個數爲 N 個的目標
這裏有個問題:
如果when設置爲D的話,那麼比如今天2019-08-13的14:00:00運行的時候,會記錄到filename裏面去,然後等到第二天的2019-08-14的14:00:00之後,會切割,把filename裏面的2019-08-13的14:00:00到2019-08-14的14:00:00切割出來,切割成filename.2019-08-13這個文件
也就是說,filename.2019-08-13這個文件記錄的是2019-08-13的14:00:00到2019-08-14的14:00:00之間的日誌,並不是從0點開始滾動切割的,如果想要從0點的話,需要使用midnight
注意:當天的日誌文件中不會有,此文件處理程序僅在新的一天開始時添加日期後綴。