带有格式化和日志旋转的日志设置

问题描述 投票:0回答:1

在下面的程序中,我尝试使用

basicConfig
设置具有所需格式的日志,并使用
RotatingFileHandler
旋转日志。

但出现错误:

Traceback (most recent call last):  
  File "C:\Python27\lib\logging\handlers.py", line 77, in emit  
    self.doRollover()  
  File "C:\Python27\lib\logging\handlers.py", line 142, in doRollover  
    os.rename(self.baseFilename, dfn)  
WindowsError: [Error 32] The process cannot access the file because it is being used by another process  
Logged from file log_rotate.py, line 53  

无法弄清楚问题出在哪里,Python新手。 有人可以指出我正确的方向吗?

import os
import logging
import time
import string
from ctypes import windll
from logging.handlers import RotatingFileHandler

LOG_FILE = 'C:\\temp\\debug.log'

def get_drives():
    drives = []
    bitmask = windll.kernel32.GetLogicalDrives()
    for letter in string.ascii_uppercase:
        if bitmask & 1:
            drives.append(letter)
        bitmask >>= 1

    return drives

def create_temp_dir():

    drives = []
    drives = get_drives()
    temp_dir = drives[0]+':\\temp\\'
    if not os.path.exists(temp_dir):
        print ( " creating temp for logs and etc ", temp_dir )
        os.makedirs(temp_dir)
    return temp_dir

def make_log_setup():
    global LOG_FILE
    temp_dir = create_temp_dir()
    log_file = temp_dir+'debug.log'
    date_strftime_format = "%d-%b-%y %H:%M:%S"
    message_format='%(asctime)s %(levelname)s %(module)s - %(funcName)s: %(message)s'
    logging.basicConfig(filename = log_file, format = message_format, datefmt = date_strftime_format,level=logging.DEBUG)

def create_rotating_log(path):
    """
    Creates a rotating log
    """
    logger = logging.getLogger("Rotating Log")
    logger.setLevel(logging.DEBUG)
    
    # add a rotating handler
    handler = RotatingFileHandler(path, maxBytes=20,
                                  backupCount=5)
    logger.addHandler(handler)
    
    for i in range(6):
        logger.info("This is test log line %s" % i)
        time.sleep(1.5)
        

if __name__ == "__main__":
    #log_file = "test.log"
    make_log_setup()
    create_rotating_log(LOG_FILE)
python python-2.7 logging logrotate
1个回答
0
投票

该错误是因为您无法在 logging.basicConfigRotatingFileHandler 方法中引用两次 LOG_FILE

但是回到您最初的要求,可以构建一个旋转日志并为其分配格式,如下所示:

def defineLogger():
    handler = RotatingFileHandler(filename=logFileName,maxBytes=5120,backupCount=10,encoding="utf-8")
    logger.addHandler(handler)
    logger.setLevel(level=logging.INFO)
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    handler.setFormatter(formatter)

注意使用logging.Formatter来实现此目的。

© www.soinside.com 2019 - 2024. All rights reserved.