python 實(shí)現(xiàn)自定義 日志模塊 logging 打印到屏幕和保存到文件

python 日志模塊 logging

FileHandler:

以“a”(追加)的方式將日志輸出到文件,如果文件不存在,則自動(dòng)創(chuàng)建該文件。

StreamHandler:

將日志輸出到Stream,比如sys.stderr、sys.stdour、文件流等。

RotatingFileHandler:

將日志輸出到文件,可以通過(guò)設(shè)置文件大小,文件達(dá)到上限后自動(dòng)創(chuàng)建一個(gè)新的文件來(lái)繼續(xù)輸出文件。

class logging.handlers.RotatingFileHandler(filename, mode='a', maxBytes=0, backupCount=0, encoding=None, delay=0)

參數(shù)maxBytes和backupCount允許日志文件在達(dá)到maxBytes時(shí)rollover.當(dāng)文件大小達(dá)到或者超過(guò)maxBytes時(shí),就會(huì)新創(chuàng)建一個(gè)日志文件。上述的這兩個(gè)參數(shù)任一一個(gè)為0時(shí),rollover都不會(huì)發(fā)生。也就是就文件沒(méi)有maxBytes限制。backupcount是備份數(shù)目,也就是最多能有多少個(gè)備份。命名會(huì)在日志的base_name后面加上.0-.n的后綴,如example.log.1,example.log.1,…,example.log.10。當(dāng)前使用的日志文件為base_name.log。

TimedRotatingFileHandler:

將日志輸出到文件,可以通過(guò)設(shè)置時(shí)間,使日志根據(jù)不同的時(shí)間自動(dòng)創(chuàng)建并輸出到不同的文件中。

class logging.handlers.TimedRotatingFileHandler(filename, when='h', interval=1, backupCount=0, encoding=None, delay=False, utc=False)

參數(shù)when決定了時(shí)間間隔的類(lèi)型,參數(shù)interval決定了多少的時(shí)間間隔。如when=‘D’,interval=2,就是指兩天的時(shí)間間隔,backupCount決定了能留幾個(gè)日志文件。超過(guò)數(shù)量就會(huì)丟棄掉老的日志文件。

Example


class Log:
    def __init__(
            self,
            logger_name=os.path.basename(
                sys.argv[0])):
        """
        By default module name is used as the logger name; if no output directory is provided, file_handler will not
        be used.
        :param logger_name:
        :param log_dir:
        """
        print('log init')
        self.start_time = None
        self.end_time = None
        self.log_path = None
        self.logger = logging.getLogger(logger_name)
        self.logger.setLevel(logging.DEBUG)

        self.formatter = logging.Formatter(
            '%(asctime)s - %(name)s - %(levelname)s - %(message)s',
            "%Y-%m-%d %H:%M:%S")

    def set_print(self):
        """
        decide whether to print log
        設(shè)置日志是否打印
        :return:
        """
        self.stream_handler = logging.StreamHandler()
        self.stream_handler.setLevel(logging.DEBUG)
        self.stream_handler.setFormatter(self.formatter)
        self.logger.addHandler(self.stream_handler)

    def set_path(self, log_path):
        """
        dicide whether to save log to path
        設(shè)置日志是否保存到文件夾
        :param log_path:
        :return:
        """
        self.log_path = log_path
        if self.log_path is not None:
            p = Path(self.log_path)
            if not os.path.exists(str(p.parent)):
                print(
                    "Creating logging directory {}".format(p.parent))
                os.makedirs(str(p.parent))

            # fname = datetime.strftime(datetime.now(), "%Y%m%d_%H:%M:%S")

            # log_filename = os.path.join(log_dir, fname)
            self.file_handler = logging.FileHandler(self.log_path)
            self.file_handler.setLevel(logging.INFO)
            self.file_handler.setFormatter(self.formatter)

            self.logger.addHandler(self.file_handler)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 在現(xiàn)實(shí)生活中,記錄日志非常重要。銀行轉(zhuǎn)賬時(shí)會(huì)有轉(zhuǎn)賬記錄;飛機(jī)飛行過(guò)程中,會(huì)有黑盒子(飛行數(shù)據(jù)記錄器)記錄飛行過(guò)程中...
    chliar閱讀 883評(píng)論 1 0
  • logging模塊介紹: logging是python內(nèi)置的標(biāo)準(zhǔn)庫(kù)模塊,模塊提供不同的日志級(jí)別,并可以采用不同的方...
    4ffde5305e8f閱讀 3,001評(píng)論 0 2
  • 一、tracker.conf # 這個(gè)配置文件是否無(wú)效,false表示有效# is this config fil...
    依然飯?zhí)?/span>閱讀 2,594評(píng)論 0 2
  • 日志 日志是跟蹤軟件運(yùn)行時(shí)所發(fā)生的事件的一種方法。軟件開(kāi)發(fā)者在代碼中調(diào)用日志函數(shù),表明發(fā)生了特定的事件。事件由描述...
    桃子味的白開(kāi)水閱讀 307評(píng)論 0 0
  • Day05的課程要點(diǎn)記錄詳細(xì)教程地址:Day5 - 常用模塊學(xué)習(xí) | 第四篇:模塊 一、模塊介紹 1.1 定義 模...
    乘風(fēng)逐月閱讀 510評(píng)論 0 1

友情鏈接更多精彩內(nèi)容