我已经创建了一个包装记录器类,它实际上包装了日志模块的功能。我已经创建了它,这样应用程序中使用日志记录的每个类都不需要每次在顶部添加logging.config.fileConfig()和{}。在
我的包装类看起来像这样-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文件-
^{pr2}$
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和{}不在同一条路径上。这就是为什么当我运行它时,它会给出下面的错误,因为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下运行,有什么解决方案吗?在