1. 程式人生 > >python中logging的常用方法

python中logging的常用方法

存在 日誌輪轉 val 設定 href lee count ftime 輸出

logging常用

# -*- coding:utf-8 -*-
__author__ = "lgj"

import os
import sys
import time
import logging
from logging.handlers import TimedRotatingFileHandler
from instance.test import LOG_LEVEL,LOG_NAME

set_level = getattr(logging, LOG_LEVEL.upper(), None)
if not isinstance(set_level, int):
    raise ValueError(‘Invalid log level:%s‘ % LOG_LEVEL)

# 獲取logger實例,如果參數為空則返回root logger,不同模塊最好使用不同實例名字
logger = logging.getLogger("camel")

# 指定日誌的最低輸出級別,默認為WARN級別
logger.setLevel(LOG_LEVEL)

# 指定logger輸出格式
formatter = logging.Formatter(
    ‘%(asctime)s %(filename)s [line:%(lineno)d] %(funcName)s %(levelname)s %(message)s %(process)d ‘)

# 文件日誌
log_path = os.path.realpath(os.getcwd()) + ‘/log/‘
file_handler = logging.FileHandler(log_path + LOG_NAME + ".log")
file_handler.setFormatter(formatter)  # 可以通過setFormatter指定輸出格式

# 控制臺日誌
console_handler = logging.StreamHandler(sys.stdout)
console_handler.formatter = formatter  # 也可以直接給formatter賦值

# 日誌輪轉--與file_handler同時存在時會造成日誌重復打印--具體詳情見下面日誌重復問題
timeRotatingHandler = TimedRotatingFileHandler(log_path + ‘%s.log‘ % (LOG_NAME), when=‘midnight‘)
timeRotatingHandler.setFormatter(formatter)
timeRotatingHandler.suffix = "_%Y%m%d.log"


# 為logger添加的日誌處理器
logger.addHandler(file_handler)
logger.addHandler(console_handler)
logger.addHandler(timeRotatingHandler)

# 輸出不同級別的log
logger.debug(‘this is debug info‘)
logger.info(‘this is information‘)
logger.warn(‘this is warning message‘)
logger.error(‘this is error message‘)
logger.fatal(‘this is fatal message, it is same as logger.critical‘)
logger.critical(‘this is critical message‘)

日誌輪轉的兩種方式

# myapp的初始化工作
logger = logging.getLogger(‘myapp‘)
logger.setLevel(logging.INFO)


1、使用TimedRotatingFileHandler
# 定義一個1秒換一次log文件的handler ,保留3個舊log文件
rotating_handler = logging.handlers.TimedRotatingFileHandler("log/myapp.log", when=‘S‘, interval=1, backupCount=3)
# 設置後綴名稱,跟strftime的格式一樣
rotating_handler.suffix = "%Y-%m-%d_%H-%M-%S.log"
logger.addHandler(rotating_handler)

# 經測試, 並有效果輪轉了但保留文件數有問題
# 註意:filehanlder.suffix的格式必須這麽寫,才能自動刪除舊文件,如果設定是天,就必須寫成“%Y-%m-%d.log”,寫成其他格式會導致刪除舊文件不生效,這個配置在源碼裏能看出來。
while True:
    time.sleep(1)
    logger.info("test")


2、使用RotatingFileHandler

# 寫入文件,如果文件超過100個Bytes,僅保留5個文件。
handler = logging.handlers.RotatingFileHandler(
    ‘log/myapp.log‘, maxBytes=100, backupCount=5)
logger.addHandler(handler)

# 效果很好
while True:
    time.sleep(0.01)
    logger.info("file test")



TimedRotatingFileHandler(filename [,when [,interval [,backupCount]]])
filename 是輸出日誌文件名的前綴,比如log/myapp.log
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是不會自動刪除掉日誌。若設3,則在文件的創建過程中庫會判斷是否有超過這個3,若超過,則會從最先創建的開始刪除。

註意:filehanlder.suffix的格式必須這麽寫,才能自動刪除舊文件,如果設定是天,就必須寫成“%Y-%m-%d.log”,寫成其他格式會導致刪除舊文件不生效。這個配置在源碼裏能看出來

日誌重復輸出的坑

你有可能會看到你打的日誌會重復顯示多次,可能的原因有很多,但總結下來就一個原因,日誌中使用了重復的handler或者handler輸出的文件重復了(如TimedRotatingFileHandler、RotatingFileHandler與FileHandler輸出的文件相同時)。
可以參考 http://python.jobbole.com/86887/ 的解釋。

參考:

  • https://www.cnblogs.com/CJOKER/p/8295272.html
  • http://python.jobbole.com/86887/
  • https://blog.csdn.net/lizhe_dashuju/article/details/72579705

python中logging的常用方法