Python logging基本使用


1、打印到控制台

# -*- coding: UTF-8 -*-

import logging

def logFileTest():
    logging.debug('This is debug')
    logging.warning('This is warning message')
    logging.info('This is info')
    
logFileTest()

  運行結果

WARNING:root:This is warning message

  PS : 只有 logging.warning() 能打印輸出到控制台,因為默認設置的等級是 warning,等級低於warning的都不會打印出來

2、配置默認等級后,打印到控制台

# -*- coding: UTF-8 -*-

import logging

def logBasicConfig():
    logging.basicConfig(level=logging.DEBUG)
    logging.debug('This is debug')
    logging.warning('This is warning message')
    logging.info('This is info')
    
logBasicConfig()

  運行結果

DEBUG:root:This is debug
WARNING:root:This is warning message
INFO:root:This is info

  PS : 日志級別: debug < info < warning < error < critical

3、保存到日志文件中,通過 logging.basicConfig() 設置

# -*- coding: UTF-8 -*-

import logging
    
def saveToLogFile():
    logging.basicConfig(
                        filename = 'saveMessage.log', #保存文件路徑
                        filemode = 'a',#保存方式,有 w 和 a 模式,默認不寫為追加 a 模式
                        format = '%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s' #日志格式
                        )
    logging.warning('This is warning')
    
saveToLogFile()    

  運行結果

2019-08-27 14:00:58,463 - D:\E_DISK\product\eclipse\logFileDemo\src\com\logFileDemo.py[line:24] - WARNING: This is warning

  PS : 這是 saveMessage.log 文件中生成的日志信息

       如果在 logging.basicConfig() 設置 filename 和 filemode,則只會保存 log 到文件,不會輸出到控制台

4、實現info信息記錄到文件,error信息記錄文件並在屏幕上輸出,且實現日志回滾

保存10個文件,每個文件大小為1024*1024

需要注意該函數在一個工程中只能調用一次,否則寫入信息會增加,比如調用兩次該函數后log.info('aaa')文件中會有兩次

因此我寫了一個log = LogConfig.log()其他類使用時,用該log就行,有點像單例模式

重復寫入問題可以參考https://blog.csdn.net/huilan_same/article/details/51858817

import logging.handlers
import os


class LogConfig:
    def __init__(self):
        pass

    # DEBUG,INFO,NOTICE,WARNING,ERROR,CRITICAL,ALERT,EMERGENCY
    # 如果是一個大工程,建議只調用一次,調用位置為主入口處。

    @staticmethod
    def log(log_name='logs/log.log', log_flag=True,
        max_bytes=1024 * 1024, backup_count=10):

        path = os.path.split(log_name)[0]
        if not os.path.isdir(path) and path != '':
            os.makedirs(path) # 目錄不存在則創建
        log_handler = logging.getLogger(log_name)
        if log_flag:
            # write log  above info 為True記錄INFO以及以上等級的日志
            log_handler.setLevel(logging.INFO)
        else:
            # write log  above error 為False記錄ERROR以及以上等級的日志
            log_handler.setLevel(logging.ERROR)
        stream_handler = logging.StreamHandler() # 控制台日志句柄,設置則可以打印到控制台
        # is or not show to cmd console
        stream_handler.setLevel(logging.WARN) # 設置打印到控制台日志等級為WARN以及以上
        log_handler.addHandler(stream_handler) # 添加控制台句柄
     # 設置回滾日志句柄
        rollback_handler = logging.handlers.RotatingFileHandler(log_name,
                                                                maxBytes=max_bytes,
                                                                backupCount=backup_count)
        log_format = logging.Formatter(
            '[%(asctime)s][%(levelname)s]%(message)s') # 設置日志格式,時間,等級,信息
        rollback_handler.setFormatter(log_format) 
        rollback_handler.setLevel(logging.INFO) # 設置回滾日志記錄INFO以及以上信息
        log_handler.addHandler(rollback_handler) # 添加回滾日志句柄
        return log_handler # 返回句柄,以便於使用


log = LogConfig.log() # 類似單例模式,只使用一次,不然會出現日志疊加情況

if __name__ == '__main__':
    log.info('444')
    log.error('555')


免責聲明!

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



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