如何在 python 记录器中指定调用者文件名
How to specify caller file name in python logger
我正在尝试创建基于 python 记录器库的自定义日志。
主要目标是创建可以从整个应用程序的任何脚本调用的主日志,并将日志数据写入同一个日志文件。
问题是因为记录器嵌入到自定义 class 中,所以函数的每次调用都会写入日志数据,就好像调用是从主文件进行的一样。
假设我有自定义日志的代码 class:
import os
import logging
from logging import *
from datetime import *
class omri_logging:
@staticmethod
def logcreate (severity = logging.DEBUG, filename =os.path.basename(__file__)):
today = datetime.today()
week = today.strftime("%U")
LogName = 'MainLog' + week + '.log'
FORMAT = "%(filename)s#%(levelname)s#%(asctime)s#%(funcName)s#%(lineno)d#%(message)s"
logging.basicConfig(filename=LogName,
level=severity,format=FORMAT,
)
@staticmethod
def CreateError (msg):
logging.error(msg)
logcreate 函数将在调用它的地方接收文件名。如何更改记录器格式化程序以将此文件名作为记录文件。
获取以下日志示例:
omri_logger.py#DEBUG#2015-02-21 11:48:56,819##63#Error Message >Sent From File
到下面的日志行,考虑现在CreateError调用的文件名是LogCallFile.py
LogCallFile.py#DEBUG#2015-02-21 11:48:56,819##63#Error Message >Sent From File
您可以尝试将您的全局日志记录配置放在一个文件中,您将导入到您的脚本中,并在每个特定脚本中添加一个 getLogger(name)
调用:
logging.getLogger(name)
其中name
可以是写入日志的实际文件名。
因此您也可以检测当前文件名,例如:
name = (inspect.getfile(inspect.currentframe()).split("\", -1)[-1]).rsplit(".", 1)[0] #Extract current *.py file name
如果您只想包含作为文件名 kwarg 传递的字符串并且不需要更改日志记录参数,您应该能够将文件名 kwarg 作为字符串插入,格式如下:
FORMAT = 文件名 + "#%(levelname)s#%(asctime)s#%(funcName)s#%(lineno)d#%(message)s"
有一个单独的 python 文件,比如 settings.py 保存日志设置,并将其导入您的项目文件。
import logging
from logging.handlers import RotatingFileHandler
log_formatter = logging.Formatter('%(asctime)s %(levelname)s %(filename)s(%(lineno)d) %(message)s')
my_handler = RotatingFileHandler(Logfile, mode='a', maxBytes=5*1024*1024,
backupCount=5, encoding=None, delay=0)
my_handler.setFormatter(log_formatter)
my_handler.setLevel(logging.INFO)
导入后在项目文件中使用以下代码settings.py
app_log = logging.getLogger('root')
app_log.setLevel(logging.INFO)
app_log.addHandler(settings.my_handler)
我正在尝试创建基于 python 记录器库的自定义日志。 主要目标是创建可以从整个应用程序的任何脚本调用的主日志,并将日志数据写入同一个日志文件。 问题是因为记录器嵌入到自定义 class 中,所以函数的每次调用都会写入日志数据,就好像调用是从主文件进行的一样。
假设我有自定义日志的代码 class:
import os
import logging
from logging import *
from datetime import *
class omri_logging:
@staticmethod
def logcreate (severity = logging.DEBUG, filename =os.path.basename(__file__)):
today = datetime.today()
week = today.strftime("%U")
LogName = 'MainLog' + week + '.log'
FORMAT = "%(filename)s#%(levelname)s#%(asctime)s#%(funcName)s#%(lineno)d#%(message)s"
logging.basicConfig(filename=LogName,
level=severity,format=FORMAT,
)
@staticmethod
def CreateError (msg):
logging.error(msg)
logcreate 函数将在调用它的地方接收文件名。如何更改记录器格式化程序以将此文件名作为记录文件。 获取以下日志示例:
omri_logger.py#DEBUG#2015-02-21 11:48:56,819##63#Error Message >Sent From File
到下面的日志行,考虑现在CreateError调用的文件名是LogCallFile.py
LogCallFile.py#DEBUG#2015-02-21 11:48:56,819##63#Error Message >Sent From File
您可以尝试将您的全局日志记录配置放在一个文件中,您将导入到您的脚本中,并在每个特定脚本中添加一个 getLogger(name)
调用:
logging.getLogger(name)
其中name
可以是写入日志的实际文件名。
因此您也可以检测当前文件名,例如:
name = (inspect.getfile(inspect.currentframe()).split("\", -1)[-1]).rsplit(".", 1)[0] #Extract current *.py file name
如果您只想包含作为文件名 kwarg 传递的字符串并且不需要更改日志记录参数,您应该能够将文件名 kwarg 作为字符串插入,格式如下:
FORMAT = 文件名 + "#%(levelname)s#%(asctime)s#%(funcName)s#%(lineno)d#%(message)s"
有一个单独的 python 文件,比如 settings.py 保存日志设置,并将其导入您的项目文件。
import logging
from logging.handlers import RotatingFileHandler
log_formatter = logging.Formatter('%(asctime)s %(levelname)s %(filename)s(%(lineno)d) %(message)s')
my_handler = RotatingFileHandler(Logfile, mode='a', maxBytes=5*1024*1024,
backupCount=5, encoding=None, delay=0)
my_handler.setFormatter(log_formatter)
my_handler.setLevel(logging.INFO)
导入后在项目文件中使用以下代码settings.py
app_log = logging.getLogger('root')
app_log.setLevel(logging.INFO)
app_log.addHandler(settings.my_handler)