Dan*_*son 9 python logging yaml configuration-files python-3.x
在我的Python程序中,我有以下代码:
def main():
# The file's path
path = os.path.dirname(os.path.realpath(__file__))
...
# Config file relative to this file
loggingConf = open('{0}/configs/logging.yml'.format(path), 'r')
logging.config.dictConfig(yaml.load(loggingConf))
loggingConf.close()
logger = logging.getLogger(LOGGER)
...
Run Code Online (Sandbox Code Playgroud)
这是我的logging.yml配置文件:
version: 1
formatters:
default:
format: '%(asctime)s %(levelname)s %(name)s %(message)s'
handlers:
console:
class: logging.StreamHandler
level: DEBUG
formatter: default
stream: ext://sys.stdout
file:
class : logging.FileHandler
formatter: default
filename: bot.log
loggers:
cloaked_chatter:
level: DEBUG
handlers: [console, file]
propagate: no
Run Code Online (Sandbox Code Playgroud)
问题是在程序启动的地方创建了bot.log文件.我希望它始终在项目的文件夹中创建,即与我的Python程序在同一文件夹中.
例如,启动程序./bot.py将在同一文件夹中创建日志文件.但启动它python3 path/bot.py会将日志文件创建为文件层次结构中Python程序之上的级别.
我应该如何在配置文件中写入文件名来解决这个问题?或者我需要编写自定义处理程序?如果是这样,怎么样?或者使用dictConfig无法解决这个问题?
Vin*_*jip 10
有很多方法可以达到你想要的效果.例如,一种方法是为您的处理程序创建自定义初始化程序:
import os
import yaml
def logmaker():
path = os.path.dirname(os.path.realpath(__file__))
path = os.path.join(path, 'bot.log')
return logging.FileHandler(path)
def main():
# The file's path
path = os.path.dirname(os.path.realpath(__file__))
# Config file relative to this file
loggingConf = open('{0}/logging.yml'.format(path), 'r')
logging.config.dictConfig(yaml.load(loggingConf))
loggingConf.close()
logger = logging.getLogger('cloaked_chatter')
logger.debug('Hello, world!')
if __name__ == '__main__':
main()
Run Code Online (Sandbox Code Playgroud)
请注意,我将其移动logging.yml到脚本旁边.这logmaker是自定义初始化程序.在YAML中指定它,如下所示:
version: 1
formatters:
default:
format: '%(asctime)s %(levelname)s %(name)s %(message)s'
handlers:
console:
class: logging.StreamHandler
level: DEBUG
formatter: default
stream: ext://sys.stdout
file:
() : __main__.logmaker
formatter: default
loggers:
cloaked_chatter:
level: DEBUG
handlers: [console, file]
propagate: no
Run Code Online (Sandbox Code Playgroud)
如果您运行Python脚本,您应该会发现它bot.log是在脚本和YAML文件旁边创建的.相同的消息将打印到控制台并bot.log:
2013-04-16 11:08:11,178 DEBUG cloaked_chatter Hello, world!
Run Code Online (Sandbox Code Playgroud)
NB脚本可能有点整洁,但它说明了我的观点.
更新:根据文档,()在字典中使用键作为键表示该值是可调用的,它本质上是处理程序的自定义构造函数.
| 归档时间: |
|
| 查看次数: |
4175 次 |
| 最近记录: |