![](/img/trans.png)
[英]Python TimedRotatingFileHandler - PID in Log File name - Best Approach
[英]TimedRotatingFileHandler Changing File Name?
我正在嘗試實現 python 日志處理程序TimedRotatingFileHandler
。
當它滾動到午夜時,它會以YYYY-MM-DD
的形式附加當前日期。
LOGGING_MSG_FORMAT = '%(name)-14s > [%(levelname)s] [%(asctime)s] : %(message)s'
LOGGING_DATE_FORMAT = '%Y-%m-%d %H:%M:%S'
logging.basicConfig(
level=logging.DEBUG,
format=LOGGING_MSG_FORMAT,
datefmt=LOGGING_DATE_FORMAT
)
root_logger = logging.getLogger('')
logger = logging.handlers.TimedRotatingFileHandler("C:\\logs\\Rotate_Test",'midnight',1)
root_logger.addHandler(logger)
while True:
daemon_logger = logging.getLogger('TEST')
daemon_logger.info("SDFKLDSKLFFJKLSDD")
time.sleep(60)
創建的第一個日志文件名為Rotate_Test
,一旦它滾動到第二天,它就會將文件名更改為Rotate_Test.YYYY-MM-DD
,其中YYYY-MM-DD
是當天。
我怎樣才能改變它改變文件名的方式?
“我怎樣才能改變它改變文件名的方式?”
由於它沒有記錄,我選擇閱讀源代碼。 這是我通過閱讀logging/handlers.py
的來源得出的結論
handler = logging.handlers.TimedRotatingFileHandler("C:\\isis_ops\\logs\\Rotate_Test",'midnight',1)
handler.suffix = "%Y-%m-%d" # or anything else that strftime will allow
root_logger.addHandler(handler)
后綴是格式化字符串。
您可以通過更改上面建議的日志后綴來完成此操作,但您還需要更改 extMatch 變量以匹配后綴以查找旋轉文件:
handler.suffix = "%Y%m%d"
handler.extMatch = re.compile(r"^\d{8}$")
這個問題還有另一種方法:例如,我需要每天輪換日志,但它們必須以 %m%d%Y 格式的后綴命名......
所以我寫了一個 TimedRotatingFileHandler 混音!
try:
import codecs
except ImportError:
codecs = None
import logging.handlers
import time
import os
class MyTimedRotatingFileHandler(logging.handlers.TimedRotatingFileHandler):
def __init__(self,dir_log):
self.dir_log = dir_log
filename = self.dir_log+time.strftime("%m%d%Y")+".txt" #dir_log here MUST be with os.sep on the end
logging.handlers.TimedRotatingFileHandler.__init__(self,filename, when='midnight', interval=1, backupCount=0, encoding=None)
def doRollover(self):
"""
TimedRotatingFileHandler remix - rotates logs on daily basis, and filename of current logfile is time.strftime("%m%d%Y")+".txt" always
"""
self.stream.close()
# get the time that this sequence started at and make it a TimeTuple
t = self.rolloverAt - self.interval
timeTuple = time.localtime(t)
self.baseFilename = self.dir_log+time.strftime("%m%d%Y")+".txt"
if self.encoding:
self.stream = codecs.open(self.baseFilename, 'w', self.encoding)
else:
self.stream = open(self.baseFilename, 'w')
self.rolloverAt = self.rolloverAt + self.interval
謝謝。
我看了一下源碼。
真的沒有辦法改變它的形式。 由於操作后綴,只附加到文件名的末尾。 以太方式,沒有真正的方法來操作完整的文件名,我希望你可以聲明一個文件掩碼,當它執行“翻轉”時,它將根據文件掩碼創建一個新的文件名. 我只是要回到我最初的想法,只是殺死整個日志子系統並在它滾動時使用新文件名重新初始化它。
謝謝你。
只是一個更新,我最終采用了不同的方法。
我發現修改文件輸出的最簡單方法是簡單地使用 FileHandler,然后什么時候進行翻轉。
我這樣做:
if(current_time > old_time):
for each in logging.getLogger('Debug').handlers:
each.stream = open("C:\\NewOutput", 'a')
這就是它的要點。 這需要大量的探索和環顧,但修改流是最簡單的方法。
:)
在 Python 3.8 中,您可以更改提供的“self.namer”,以便在進行旋轉時可以對文件名進行任何操作。 像這樣的東西:
def my_namer(default_name):
# This will be called when doing the log rotation
# default_name is the default filename that would be assigned, e.g. Rotate_Test.txt.YYYY-MM-DD
# Do any manipulations to that name here, for example this changes the name to Rotate_Test.YYYY-MM-DD.txt
base_filename, ext, date = default_name.split(".")
return f"{base_filename}.{date}.{ext}"
logger = logging.handlers.TimedRotatingFileHandler("C:\\logs\\Rotate_Test",'midnight',1)
logger.namer = my_namer
root_logger.addHandler(logger)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.