欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python 實(shí)現(xiàn)logging動(dòng)態(tài)變更輸出日志文件名

 更新時(shí)間:2021年03月15日 10:16:34   作者:shijc_csdn  
這篇文章主要介紹了python 實(shí)現(xiàn)logging動(dòng)態(tài)變更輸出日志文件名的案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧

python作為一門(mén)非常容易上手的腳本語(yǔ)言,日志輸出更是簡(jiǎn)單,logging模塊,簡(jiǎn)單的設(shè)置配置和屬性,就能實(shí)現(xiàn)到控制臺(tái)輸出日志,在basicConfig()設(shè)置文件名,就能夠?qū)⑷罩拘畔?xiě)入文件,簡(jiǎn)直是簡(jiǎn)單到不能再簡(jiǎn)單。

最近在項(xiàng)目中就遇到一個(gè)日志問(wèn)題,使用python編寫(xiě)的服務(wù)程序一直運(yùn)行,連續(xù)處理一些任務(wù),每個(gè)任務(wù)的關(guān)鍵信息都需要輸出到文件中,便于維護(hù)人員查看,可是對(duì)于簡(jiǎn)單實(shí)用logging來(lái)說(shuō),日志寫(xiě)入文件非常簡(jiǎn)單,由于服務(wù)程序連續(xù)運(yùn)行,一直向一個(gè)文件記錄日志信息有些不妥,有常識(shí)的開(kāi)發(fā)人員都知道,長(zhǎng)時(shí)間的日志輸出會(huì)導(dǎo)致日志文件過(guò)大,可是如何在服務(wù)運(yùn)行時(shí),修改日志的輸出文件,以當(dāng)天日期作為日志文件名。

代碼編寫(xiě)環(huán)境:python3.4.3

1.logging.basicConfig()

首先,想到的是更改logging.basicConfig(filename=logfilename)參數(shù),來(lái)實(shí)現(xiàn)變更日志文件名的目的。編寫(xiě)代碼如下:

log_fmt = '%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s'
for i in range(1,4):
 filename = str.format('mylog%d.txt' % i)
 logging.basicConfig(format=log_fmt, level=logging.DEBUG, filename=filename)
 logging.debug('This is debug message')
 logging.info('This is info message')
 logging.warning('This is warning message')

運(yùn)行結(jié)果沒(méi)有達(dá)到預(yù)期的效果,只有日志文件mylog1.txt被創(chuàng)建,mylog2.txt和mylog3.txt都未被創(chuàng)建,連續(xù)3次的輸出的內(nèi)容都寫(xiě)入mylog1.txt中。說(shuō)明logging.basicConfig()設(shè)置屬性具有全局性,第一次設(shè)置之后,之后再設(shè)置將不再生效。查看官方文檔,也確實(shí)是如此。

logging.basicConfig(**kwargs)

Does basic configuration for the logging system by creating a StreamHandler with a default Formatter and adding it to the root logger. The functions debug(), info(), warning(), error() and critical() will call basicConfig() automatically if no handlers are defined for the root logger.

This function does nothing if the root logger already has handlers configured for it.

此路不通,只好用其他方法。

2.Handler對(duì)象

logging支持添加多個(gè)不同類(lèi)型的handler對(duì)象,實(shí)現(xiàn)對(duì)控制臺(tái)(logging.StreamHandler)、文件(logging.FileHandler)等不同目標(biāo)輸出日志。

logging支持的日志詳情見(jiàn)文檔logging.handlers

通過(guò)增加多個(gè)handler對(duì)象,可是實(shí)現(xiàn)同時(shí)在控制臺(tái)、文件同時(shí)輸出不同級(jí)別的日志信息。

# 默認(rèn)配置logging寫(xiě)入本地文件
logging.basicConfig(level=logging.DEBUG,
  format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
  datefmt='%a, %d %b %Y %H:%M:%S',
  filename='myapp2.log',
  filemode='w')
#定義一個(gè)StreamHandler,將INFO級(jí)別或更高的日志信息打印到標(biāo)準(zhǔn)錯(cuò)誤,并將其添加到當(dāng)前的日志處理對(duì)象。
console = logging.StreamHandler()
console.setLevel(logging.INFO)
formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s')
console.setFormatter(formatter)
logging.getLogger('').addHandler(console)
logging.debug('This is debug message')
logging.info('This is info message')
logging.warning('This is warning message')

考慮實(shí)現(xiàn)簡(jiǎn)單又能說(shuō)明效果,寫(xiě)入文件使用logging.basicConfig()設(shè)置,并添加輸出指向控制臺(tái)的流處理(StreamHandler)對(duì)象console,實(shí)現(xiàn)同時(shí)輸出日志。當(dāng)然也可以反過(guò)來(lái),默認(rèn)設(shè)置控制臺(tái)輸出日志,之后創(chuàng)建文件對(duì)象(logging.FileHandler),并加入處理集合,實(shí)現(xiàn)同樣的效果。

logging.getLogger('')獲取的是名為'root'的默認(rèn)根節(jié)點(diǎn)

同時(shí),logging提供addHandler()的方法,自然也會(huì)有管理handler的方法。

延伸之前Handler的思路,我們可以實(shí)現(xiàn)對(duì)handler的動(dòng)態(tài)管理,變更日志文件。每次需要變更輸出文件路徑前,使用handler管理清空原先的logging.FileHandler對(duì)象,重新創(chuàng)建一個(gè)新文件名的logging.FileHandler對(duì)象即可。

# 默認(rèn)配置logging寫(xiě)入本地文件
logging.basicConfig(level=logging.DEBUG,
  format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
  datefmt='%a, %d %b %Y %H:%M:%S',
  filename='myapp2.log',
  filemode='w')
#定義一個(gè)StreamHandler,將INFO級(jí)別或更高的日志信息打印到標(biāo)準(zhǔn)錯(cuò)誤,并將其添加到當(dāng)前的日志處理對(duì)象。
console = logging.StreamHandler()
console.setLevel(logging.INFO)
formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s')
console.setFormatter(formatter)
logging.getLogger('').addHandler(console)
logging.debug('This is debug message')
logging.info('This is info message')
logging.warning('This is warning message')

使用for循環(huán)執(zhí)行3次處理,分別創(chuàng)建日志文件名稱(chēng)為mylog1.txt, mylog2.tx, mylog3.txt,并寫(xiě)入相同的內(nèi)容。執(zhí)行結(jié)果確實(shí)產(chǎn)生不同名稱(chēng)的文件,日志內(nèi)容也正確寫(xiě)入。

至此,已經(jīng)實(shí)現(xiàn)動(dòng)態(tài)變更輸出文件日志名稱(chēng)的功能。至于按照日志輸出文件名,只需要按照上述代碼的思路,將創(chuàng)建logging.FileHandler()的文件名參數(shù)變更就能達(dá)成目的。

簡(jiǎn)單實(shí)現(xiàn)方案

瀏覽官方文檔logging.handlers一節(jié)內(nèi)容,python考慮到日志的常規(guī)使用場(chǎng)景,已經(jīng)封裝更為簡(jiǎn)單的實(shí)現(xiàn)方案,TimedRotatingFileHandler,只需簡(jiǎn)單的配置,即可實(shí)現(xiàn)對(duì)輸出日志文件的基本管理,靈活易用,代碼如下:

import logging, logging.handlers
import time
'''
TimedRotatingFileHandler構(gòu)造函數(shù)聲明
class logging.handlers.TimedRotatingFileHandler(filename, when='h', interval=1, backupCount=0, encoding=None, delay=False, utc=False, atTime=None)
filename 日志文件名前綴
when 日志名變更時(shí)間單位
 'S' Seconds
 'M' Minutes
 'H' Hours
 'D' Days
 'W0'-'W6' Weekday (0=Monday)
 'midnight' Roll over at midnight
interval 間隔時(shí)間,是指等待N個(gè)when單位的時(shí)間后,自動(dòng)重建文件
backupCount 保留日志最大文件數(shù),超過(guò)限制,刪除最先創(chuàng)建的文件;默認(rèn)值0,表示不限制。
delay 延遲文件創(chuàng)建,直到第一次調(diào)用emit()方法創(chuàng)建日志文件
atTime 在指定的時(shí)間(datetime.time格式)創(chuàng)建日志文件。
'''
def test_TimedRotatingFileHandler():
 # 定義日志輸出格式
 fmt_str = '%(asctime)s[level-%(levelname)s][%(name)s]:%(message)s'
 # 初始化
 logging.basicConfig()
 # 創(chuàng)建TimedRotatingFileHandler處理對(duì)象
 # 間隔5(S)創(chuàng)建新的名稱(chēng)為myLog%Y%m%d_%H%M%S.log的文件,并一直占用myLog文件。
 fileshandle = logging.handlers.TimedRotatingFileHandler('myLog', when='S', interval=5, backupCount=3)
 # 設(shè)置日志文件后綴,以當(dāng)前時(shí)間作為日志文件后綴名。
 fileshandle.suffix = "%Y%m%d_%H%M%S.log"
 # 設(shè)置日志輸出級(jí)別和格式
 fileshandle.setLevel(logging.DEBUG)
 formatter = logging.Formatter(fmt_str)
 fileshandle.setFormatter(formatter)
 # 添加到日志處理對(duì)象集合
 logging.getLogger('').addHandler(fileshandle)
if __name__ == '__main__':
 test_TimedRotatingFileHandler()
 # 測(cè)試在200s內(nèi)創(chuàng)建文件多個(gè)日志文件
 for i in range(0, 100):
 logging.debug("logging.debug")
 logging.info("logging.info")
 logging.warning("logging.warning")
 logging.error("logging.error")
 time.sleep(2)

補(bǔ)充:使用Python的logging.config.fileConfig配置日志

Python的logging.config.fileConfig方式配置日志,通過(guò)解析conf配置文件實(shí)現(xiàn)。文件 logglogging.conf 配置如下:

[loggers]
keys=root,fileLogger,rotatingFileLogger
 
[handlers]
keys=consoleHandler,fileHandler,rotatingFileHandler
 
[formatters]
keys=simpleFormatter
 
[logger_root]
level=DEBUG
handlers=consoleHandler
 
[logger_fileLogger]
level=DEBUG
# 該logger中配置的handler
handlers=fileHandler
# logger 的名稱(chēng)
qualname=fileLogger
propagate=0
 
[logger_rotatingFileLogger]
level=DEBUG
# 這樣配置,rotatingFileLogger中就同時(shí)配置了consoleHandler,rotatingFileHandler
# consoleHandler 負(fù)責(zé)將日志輸出到控制臺(tái)
# rotatingFileHandler 負(fù)責(zé)將日志輸出保存到文件中
handlers=consoleHandler,rotatingFileHandler
qualname=rotatingFileLogger
propagate=0
 
[handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatter=simpleFormatter
args=(sys.stdout,)
 
[handler_fileHandler]
class=FileHandler
level=DEBUG
formatter=simpleFormatter
args=('logs/logging.log', 'a')
 
[handler_rotatingFileHandler]
class=handlers.RotatingFileHandler
level=WARNING
formatter=simpleFormatter
args=("logs/rotating_logging.log", "a", 1*1024*1024, 5)
 
[formatter_simpleFormatter]
#format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
format=%(asctime)s - %(module)s - %(thread)d - %(levelname)s : %(message)s
datefmt=%Y-%m-%d %H:%M:%S

以上配置文件主要包含以下幾部分:

loggers : 配置logger信息。必須包含一個(gè)名字叫做root的logger,當(dāng)使用無(wú)參函數(shù)logging.getLogger()時(shí),默認(rèn)返回root這個(gè)logger,其他自定義logger可以通過(guò) logging.getLogger("fileLogger") 方式進(jìn)行調(diào)用

handlers:定義聲明handlers信息。常用的handlers包括 StreamHandler(僅將日志輸出到kong控制臺(tái))、FileHandler(將日志信息輸出保存到文件)、RotaRotatingFileHandler(將日志輸出保存到文件中,并設(shè)置單個(gè)日志wenj文件的大小和日志文件個(gè)數(shù))

formatter : 設(shè)置日志格式

logger_xxx : 對(duì)loggers中聲明的logger進(jìn)行逐個(gè)配置,且要一一對(duì)應(yīng)

handler_xxx : 對(duì)handlers中聲明的handler進(jìn)行逐個(gè)配置,且要一一對(duì)應(yīng)

formatter_xxx : 對(duì)聲明的formatterjinx進(jìn)行配置

代碼示例

logging.config.fileConfig(“l(fā)ogging.conf”)
 
# 輸出日志到控制臺(tái),獲取的是root對(duì)應(yīng)的logger
console_logger = logging.getLogger()
 
# 輸出日志到單個(gè)文件
file_logger = logging.getLogger(name="fileLogger")
 
# rotatingFileLogger中額consoleHandler輸出到控制臺(tái),rotatingHandler輸出日志到文件
rotating_logger = logging.getLogger(name="rotatingFileLogger")

友情提示

進(jìn)行以上配置后,在項(xiàng)目中需要進(jìn)行日志輸出的地方通過(guò)logging.getLogger()方式就可以獲取到du應(yīng)的logger,然后就可以使用logger.info("xxx")jinx進(jìn)行日志輸出了。

使用這種方式配置日志,一定要在項(xiàng)目的入口函數(shù)中就調(diào)用 logging.config.fileConfig(“l(fā)ogging.conf”)函數(shù),因?yàn)?logging.conf 文件中,在handler中配置的是日志文件的相對(duì)地址,如果在其他代碼文件中進(jìn)行調(diào)用,由于相對(duì)地址的原因,將導(dǎo)致日志文件會(huì)出現(xiàn)在yixi意想不到的位置。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

相關(guān)文章

  • Python Web程序搭建簡(jiǎn)單的Web服務(wù)器

    Python Web程序搭建簡(jiǎn)單的Web服務(wù)器

    這篇文章主要介紹了Python Web程序搭建簡(jiǎn)單的Web服務(wù)器,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • Python多線(xiàn)程和隊(duì)列操作實(shí)例

    Python多線(xiàn)程和隊(duì)列操作實(shí)例

    這篇文章主要介紹了Python多線(xiàn)程和隊(duì)列操作實(shí)例,本文直接給給實(shí)例代碼,需要的朋友可以參考下
    2015-06-06
  • Python利用臨時(shí)文件實(shí)現(xiàn)數(shù)據(jù)的保存

    Python利用臨時(shí)文件實(shí)現(xiàn)數(shù)據(jù)的保存

    tempfile模塊專(zhuān)門(mén)用于創(chuàng)建臨時(shí)文件和臨時(shí)目錄,它既可以在?UNIX?平臺(tái)上運(yùn)行良好,也可以在?Windows?平臺(tái)上運(yùn)行良好。本文將利用tempfile模塊創(chuàng)建臨時(shí)文件來(lái)保存數(shù)據(jù),感興趣的可以了解一下
    2022-07-07
  • Python實(shí)現(xiàn)購(gòu)物車(chē)購(gòu)物小程序

    Python實(shí)現(xiàn)購(gòu)物車(chē)購(gòu)物小程序

    這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)購(gòu)物車(chē)購(gòu)物小程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • 研究Python的ORM框架中的SQLAlchemy庫(kù)的映射關(guān)系

    研究Python的ORM框架中的SQLAlchemy庫(kù)的映射關(guān)系

    這篇文章主要介紹了研究Python的ORM框架中的SQLAlchemy庫(kù)的映射關(guān)系,SQLAlchemy庫(kù)是一個(gè)常見(jiàn)的Python中操作數(shù)據(jù)庫(kù)的工具,需要的朋友可以參考下
    2015-04-04
  • Python實(shí)現(xiàn)合并同一個(gè)文件夾下所有PDF文件的方法示例

    Python實(shí)現(xiàn)合并同一個(gè)文件夾下所有PDF文件的方法示例

    這篇文章主要介紹了Python實(shí)現(xiàn)合并同一個(gè)文件夾下所有PDF文件的方法,涉及Python針對(duì)pdf文件的讀取、判斷、解密、寫(xiě)入合并等相關(guān)操作技巧,需要的朋友可以參考下
    2018-04-04
  • 基于python判斷目錄或者文件代碼實(shí)例

    基于python判斷目錄或者文件代碼實(shí)例

    這篇文章主要介紹了基于python判斷目錄或者文件代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • python 運(yùn)用Django 開(kāi)發(fā)后臺(tái)接口的實(shí)例

    python 運(yùn)用Django 開(kāi)發(fā)后臺(tái)接口的實(shí)例

    今天小編就為大家分享一篇python 運(yùn)用Django 開(kāi)發(fā)后臺(tái)接口的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-12-12
  • python中必要的名詞解釋

    python中必要的名詞解釋

    在本篇文章里小編給大家整理的是關(guān)于python中必要的名詞解釋以及相關(guān)知識(shí)點(diǎn),有興趣的朋友們學(xué)習(xí)下。
    2019-11-11
  • python連接clickhouse的端口問(wèn)題及解決

    python連接clickhouse的端口問(wèn)題及解決

    這篇文章主要介紹了python連接clickhouse的端口問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05

最新評(píng)論