Вам нужно выполнить дополнительную обработку, чтобы получить нужный вам путь.
Вы можете выполнить такую обработку и добавить дополнительную информацию в записи журнала, включая «локальный» путь для вашего собственного пакета,путем создания пользовательского фильтра .
Фильтры на самом деле не имеют для выполнения фильтрации, но они получают доступ ко всем записям журнала, поэтому они являются отличным способомобновления записей с отсутствующей информацией.Просто убедитесь, что вы вернете True
когда закончите:
import logging
import os
import sys
class PackagePathFilter(logging.Filter):
def filter(self, record):
pathname = record.pathname
record.relativepath = None
abs_sys_paths = map(os.path.abspath, sys.path)
for path in sorted(abs_sys_paths, key=len, reverse=True): # longer paths first
if not path.endswith(os.sep):
path += os.sep
if pathname.startswith(path):
record.relativepath = os.path.relpath(pathname, path)
break
return True
Это найдет запись sys.path
, которая является родительским каталогом для pathname
в записи журнала, и добавит новую запись relativepath
в журналзапись.Затем вы можете использовать %(relativepath)s
, чтобы включить его в свой журнал.
Добавить фильтр в любой обработчик , который вы настроили с помощью пользовательского форматера:
handler.addFilter(PackagePathFilter())
и вместе с '%(relativepath)s:%(lineno)s: %(message)s'
в качестве формата ваши сообщения журнала будут выглядеть так:
mypackage/topmodule.py:123: First log message
mypackage/subpackage/nested.py:456: Second log message
(фактический вывод, за исключением того, что я изменил номера строк на этом).