python - 日志记录模块是否具有日期时间/从程序调用的内置函数作为日志文件名的一部分?
问题描述
当我运行一个程序 someprogram.py 时,我更喜欢这样的日志文件名:
someprogram.py_2021_11_10_20_25_00.log
这样日志文件的名称就可以告诉我它是从哪个程序生成的,以及该程序的启动时间。
这并不难实现。
但由于我们使用的是日志记录模块,我希望它内置在 logging.basicConfig 中,因此类似于:
logging.basicConfig(filename=module_%(asctime)s,
解决方案
您可以像在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
# *******************************************************
相关主题/文档
推荐阅读
- php - PHP:通过 URL 获取外部网站的主机名(确定主机名是否包含“www”)
- sql - 如何每天获取每个班次的数据
- java - JLabel 忽略 setBounds 方法
- node.js - 尝试运行 npx create-react-app myapp 时面临的问题
- vb.net - 根据工作班次持续时间添加迄今为止的小时数
- javascript - IP地址的最快哈希+盐是什么?(Node.JS)
- sql - 如何在 PostgreSQL 查询中按数组值搜索
- php - laravel 5.8 调度程序不能自动工作必须手动触发
- google-chrome - 如何使用 HTTP Sniffer(Chrome 网络选项卡)根据文件名自动下载文件
- c++ - 在菜单功能中调用和显示文本文件