我创建了一个包装记录器类,它实际上包含了日志记录模块的功能。我创建了它,以便我的应用程序中使用日志记录的每个类都不需要每次都在顶部添加logging.config.fileConfig()
和logging.getLogger()
。
我的包装类看起来像这样 -
class MyFileLogger():
# The config file for logging formatter.
logging.config.fileConfig('logging.ini', disable_existing_loggers=False)
def __init__(self, name):
self.logger=logging.getLogger(name)
def log_debug(self, message):
self.logger.debug(message)
logging.ini
档案 -
[loggers]
keys=root
[handlers]
keys=fileHandler
[formatters]
keys=myFormatter
[logger_root]
level=NOTSET
handlers=fileHandler
[handler_fileHandler]
class=handlers.TimedRotatingFileHandler
level=DEBUG
formatter=myFormatter
args=('testlog.log','midnight',)
[formatter_myFormatter]
format=%(asctime)s |%(name)-12s |%(levelname)-8s |%(message)s
datefmt=
class=logging.Formatter
MyFileLogger.py
和logging.ini
文件位于同一路径上。我创建testlog.log
的意图也与logging.ini
文件的路径相同。
MyFileLogger.py
的实施就像 -
imp.py
-
fileLogger = MyFileLogger(__name__)
message = "hey!"
fileLogger.log_debug(message)
现在这个imp.py
与MyFileLogger.py
和logging.ini
不在同一条路径上。这就是为什么当我运行它时,这给了我以下错误,因为python在imp.py
路径上运行。
File "C:\Python34\lib\logging\config.py", line 76, in fileConfig
formatters = _create_formatters(cp)
File "C:\Python34\lib\logging\config.py", line 109, in _create_formatters
flist = cp["formatters"]["keys"]
File "C:\Python34\lib\configparser.py", line 937, in __getitem__
raise KeyError(key)
KeyError: 'formatters'
我知道如果我只提供logging.ini
和testlog.log
的绝对路径,它就会起作用。但我不想去那里,因为这个应用程序可以在Windows或Linux中运行。所以会有路径问题。
现在,即使我不关心Windows-Linux的事情,也只关注Linux。还有另一个问题。因此,如果我们假设当前目录结构为此({ProjectDir / src'在PYTHONPATH
中添加并假设每个模块文件夹中都有__init__.py
) -
ProjectDir
├── src
│ └── sales
│ ├── common
│ │ ├── logger
│ │ │ ├── logging.ini
│ │ │ ├── MyFileLogger.py
│ │ │ └── testlog.log
│ │ └── implmnts
│ │ └── imp.py
│ └── unitTest
│ └── test_MyFileLogger.py
└── bar.txt
我们假设:
imp.py
-
fileLogger = MyFileLogger(__name__)
message = "From imp.py"
fileLogger.log_debug(message)
test_MyFileLogger.py
-
fileLogger = MyFileLogger(__name__)
message = "from test_MyFileLogger.py"
fileLogger.log_debug(message)
然后,如果我运行imp.py
,我需要将logging.config.fileConfig('logging.ini', disable_existing_loggers=False)
更改为logging.config.fileConfig('../logger/logging.ini', disable_existing_loggers=False)
之后它会运行但是当我尝试运行test_MyFileLogger.py
时,我需要再次更改为logging.config.fileConfig('../common/logger/logging.ini', disable_existing_loggers=False)
所以我的代码依赖于我正在运行的文件,我想要删除它。有没有什么方法可以动态获取logging.ini
和testlog.log
的路径,而不管哪个文件(来自其他路径)正在调用它?我不想硬核绝对路径,因为这需要在Windows和Linux上运行,任何解决方案?