【logging】日誌處理【原創】

參考

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


注意:當天的日誌文件中不會有,此文件處理程序僅在新的一天開始時添加日期後綴。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章