首页 > 解决方案 > 日志记录模块是否具有日期时间/从程序调用的内置函数作为日志文件名的一部分?

问题描述

当我运行一个程序 someprogram.py 时,我更喜欢这样的日志文件名:

someprogram.py_2021_11_10_20_25_00.log

这样日志文件的名称就可以告诉我它是从哪个程序生成的,以及该程序的启动时间。

这并不难实现。

但由于我们使用的是日志记录模块,我希望它内置在 logging.basicConfig 中,因此类似于: logging.basicConfig(filename=module_%(asctime)s,

标签: pythondatetimelogging

解决方案


您可以像在Logging Cookbook中的示例中一样添加名称作为关键字

这里你的模块/文件 'filename' 'spam_application.auxiliary'

import logging
import sys
# create logger
MODULE_NAME = 'spam_application.auxiliary' # Keyword of the file / Module
module_logger = logging.getLogger(MODULE_NAME)

class Auxiliary:
    class_name = 'spam_application.auxiliary.Auxiliary' # Class name
    def __init__(self):
        module_logger.info('creating an instance of Auxiliary')
        self.logger = self.set_up_config()
        self.logger.info('instance of Auxiliary initialized!')
    def do_something(self):
        self.logger.info('doing something')
        a = 1 + 1
        self.logger.info('done doing something')

    def set_up_config(self):
        logger = logging.getLogger(self.class_name)
        format = '%(asctime)s %(levelname)s %(name)s: %(message)s ' # Set up the asctime
        FORMATTER = logging.Formatter(format)
        stream_handler = logging.StreamHandler(sys.stdout)  # Using sys.stdout
        stream_handler.terminator = '\n=====================================================\n'
        stream_handler.setLevel(logging.INFO)
        stream_handler.setFormatter(FORMATTER)
        logger.addHandler(stream_handler)
        return logger

def some_function():
    module_logger.info('received a call to "some_function"')

根据文档的父模块/子模块

import logging
import auxiliary_module

# create logger with 'spam_application'
logger = logging.getLogger('spam_application')
logger.setLevel(logging.INFO)
# create file handler which logs even debug messages
fh = logging.FileHandler('spam.log')
fh.setLevel(logging.INFO)
# create console handler with a higher log level
ch = logging.StreamHandler()
ch.setLevel(logging.INFO)
# create formatter and add it to the handlers
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter)
ch.setFormatter(formatter)
# add the handlers to the logger
logger.addHandler(fh)
logger.addHandler(ch)

logger.info('creating an instance of auxiliary_module.Auxiliary')
a = auxiliary_module.Auxiliary()
logger.info('created an instance of auxiliary_module.Auxiliary')
logger.info('calling auxiliary_module.Auxiliary.do_something')
a.do_something()
logger.info('finished auxiliary_module.Auxiliary.do_something')
logger.info('calling auxiliary_module.some_function()')
auxiliary_module.some_function()
logger.info('done with auxiliary_module.some_function()')

## 从另一个模块调用记录器##

import logging
import auxiliary_module

a = auxiliary_module.Auxiliary()
aux_module = logging.getLogger('spam_application.auxiliary.Auxiliary')
aux_module.setLevel(logging.INFO)
aux_module.info("Hey")

# 2021-11-10 21:18:04,376 INFO spam_application.auxiliary.Auxiliary: Hey 
# =====================================================

配置记录器的最简单方法

import logging

format = '%(asctime)s %(levelname)s %(name)s: %(message)s '
logging.basicConfig(
     level=logging.INFO,
     format= format,
     datefmt='%H:%M:%S'
 )
_logger = logging.getLogger('MY_MODULE_NAME')
_logger.info("Here a log")

输出

>>> 20:55:12 INFO __main__: Hello WOrld 

使用 StreamerHandler

需要注册不同的记录器

import logging
import sys

_logger = logging.getLogger('MY_MODULE_NAME')
_logger.setLevel(logging.DEBUG)
# Streamer Registartion
format = '%(asctime)s %(levelname)s %(name)s: %(message)s '
FORMATTER = logging.Formatter(format)
stream_handler = logging.StreamHandler(sys.stdout) # Using sys.stdout
stream_handler.terminator = '\n====================================================='
stream_handler.setLevel(logging.INFO)
stream_handler.setFormatter(FORMATTER)
_logger.addHandler(stream_handler)

_logger.info("Here a log")

相同,但有单独的流线

用于稍后检索其他一些日志。可以使用相同的方法写入日志文件

import logging
import sys
import io

_logger = logging.getLogger('MY_MODULE_NAME')
_logger.setLevel(logging.DEBUG)
# Streamer Registartion
format = '%(asctime)s %(levelname)s %(name)s: %(message)s '
FORMATTER = logging.Formatter(format)
stream_handler = logging.StreamHandler(sys.stdout) # Using sys.stdout
stream_handler.terminator = '\n====================================================='
stream_handler.setLevel(logging.INFO)
stream_handler.setFormatter(FORMATTER)
_logger.addHandler(stream_handler)


# Add to a streamer
streamer = io.StringIO()
format = '%(asctime)s %(levelname)s %(name)s: %(message)s '
FORMATTER = logging.Formatter(format)
stream_handler = logging.StreamHandler(stream=streamer) # We use stringio
stream_handler.terminator = '\n*******************************************************'
stream_handler.setLevel(logging.INFO)
stream_handler.setFormatter(FORMATTER)
_logger.addHandler(stream_handler)

_logger.info("Here a log")

# Get All logged valued from streamer

steramed_values = streamer.getvalue()
print(f'steramed_values --> \n{steramed_values}')


# 2021-11-10 21:02:15,492 INFO __main__: Here a log 
# =====================================================steramed_values --> 
# 2021-11-10 21:02:15,492 INFO __main__: Here a log 
# *******************************************************

相关主题/文档


推荐阅读