我知道--verbose或者-v来自几个工具,我想将它实现到我自己的一些脚本和工具中.
我想放置:
if verbose:
print ...
Run Code Online (Sandbox Code Playgroud)
通过我的源代码,这样如果用户传递-v选项,变量verbose将被设置为True,文本将被打印.
这是正确的方法还是有更常见的方法?
另外:我不是要求一种方法来实现参数的解析.我知道它是如何完成的.我只对verbose选项感兴趣.
是否有可能将INFO或DEBUG的python日志消息转到stdout,使用WARNING或更高版本转到stderr?
在其他一些技术中,我们偶尔使用DEBUG以下的日志级别,我认为这个级别被称为"详细".我意识到对这种水平的需求是非常主观的.但在我看来,"只是"拥有INFO和DEBUG还不够.我们有时需要记录一些非常垃圾邮件(比调试更垃圾邮件).在实践中,我们会在没有打开的情况下生成构建版本,但在少数情况下,我们会在产品全部安装到某些QA设置后启用此级别的日志记录,同时跟踪错误等.
有没有办法(简单或其他方式)使用标准的python日志库记录DEBUG级别以下的东西?
在temp.py文件中,我可以执行以下操作:
logging.addLevelName(5,"verbose")
VERBOSE = 5
logger = logging.getLogger("foo")
logger.setLevel(VERBOSE)
logger.log(VERBOSE,"blah!")
Run Code Online (Sandbox Code Playgroud)
这在我在IDE中运行temp.py(并记录到stdout)时有效,但我们的真实守护进程使用标准文件/字典配置语法来设置日志记录,我没有看到任何方式表明应该使用级别5守护进程.
我在追逐一些不太可行的东西吗?
对于那些可能想知道我为什么需要低于DEBUG的东西的人来说,偶尔会出现一种非常频繁的日志记录(也许是一个内循环),即使在DEBUG,我也不会想看到它,但在某些生产系统上在一段时间内启用它可能会有所帮助,而无需在源代码中添加更多日志记录并重新部署等.
EDIT1 - 显然,日志库允许自定义级别.由于DEBUG是10级,所以在1..9范围内的某个地方有空间.如果我定义一个自定义级别(例如上面的示例代码中),我想我真正的问题是如何从json日志配置文件中启用该级别的日志记录?
EDIT2 - 如果不是因为我们需要/使用json配置文件(我无法更改的要求),以下内容将起作用:
import logging
logging.basicConfig(filename='example.log',level=5)
VERBOSE = 5
logging.addLevelName(5,"verbose")
logger = logging.getLogger("bar")
logger.log(VERBOSE,"blah!")
Run Code Online (Sandbox Code Playgroud)
EDIT3 - 弄清楚了......打电话给
logging.addLevelName(5,"VERBOSE")
Run Code Online (Sandbox Code Playgroud)
至关重要.我只是没有把它放在正确的地方.在我的情况下,我只需要在调用日志库dictConfig(...)调用之前进行上述调用.在我这样做之后,我就可以进入我们的日志配置文件并将事情(在文件处理程序和根目录上)降低到VERBOSE并且它有效.
当然,日志语句本身并不完美,因为您调用:
self.logger.log(VERBOSE,"Something very spammy")
Run Code Online (Sandbox Code Playgroud)
而不是
self.logger.verbose("Something very spammy")
Run Code Online (Sandbox Code Playgroud)
但我真的不想修改任何记录器库代码(去过那里,完成了,有T恤).
谢谢大家!
对于那些认为不需要低于DEBUG的人来说,更多的力量给你:)
我正在使用 argparse 从命令行获取日志记录级别,然后将其作为 logging.basicConfig 的输入传递。但是,我试图实现这一点的方式不起作用。有什么建议吗?
期望行为,来自命令行:
python main.py -log=DEBUG
Run Code Online (Sandbox Code Playgroud)
欲望输出
DEBUG:__main__: Debug is working
Run Code Online (Sandbox Code Playgroud)
代码
import logging
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-log", "--log", nargs='+', help="Provide logging level. Example --log debug'")
log_level = parser.parse_args().log
log_level = 'logging.'+log_level[0]
print(log_level)
logging.basicConfig(level=log_level)
logger = logging.getLogger(__name__)
logger.debug(' Debug is working')
Run Code Online (Sandbox Code Playgroud) 我正在使用 Python 3.5 中的日志记录模块,我觉得我以前已经这样做过,但我想使用我的配置文件提供的常量来更改日志记录级别。
目前我正在使用:
logger = logging.getLogger(__name__)
logging.basicConfig(level=logging.INFO)
logger.setLevel(logging.INFO)
Run Code Online (Sandbox Code Playgroud)
我想在配置文件中声明 INFO、DEBUG 等并使用文字替换。
我的脚本配置:
LOG_LEVEL = 'DEBUG' #this value to be modified by user.
Run Code Online (Sandbox Code Playgroud)
脚本:
import my_script_conf as msc
SET_LEVEL = 'logging.' + msc.LOG_LEVEL
BASIC_LEVEL = 'level=' + SET_LEVEL
logger = logging.getLogger(__name__)
logging.basicConfig(BASIC_LEVEL)
logger.setLevel(SET_LEVEL)
Run Code Online (Sandbox Code Playgroud)
Python 对此感到不安,任何对我糟糕的编码的帮助将不胜感激。任何达到相同结果的途径,我基本上希望它可读且易于使用,在外部配置文件中设置日志记录模块级别似乎是最明智的选择。你的Pythonista可能有其他想法!
谢谢,弗兰克
我阅读了Python Logging HOWTO,有一段我不明白的描述:
如果要从命令行选项设置日志记录级别,例如:
Run Code Online (Sandbox Code Playgroud)--log=INFO并且您
--log在某个变量loglevel 中传递了参数的值,您可以使用:Run Code Online (Sandbox Code Playgroud)getattr(logging, loglevel.upper())获取您将通过level参数传递给
basicConfig()的值。
这是什么意思?没有例子,如果有人能给一个就好了。
我可以像这样设置日志记录级别吗?
logging --log=INFO
Run Code Online (Sandbox Code Playgroud) 基于此答案,启用详细日志记录的更简单方法
让我们以这个 Python 脚本为例。
import argparse
import logging
def main():
import argparse
import logging
parser = argparse.ArgumentParser(
description='A test script for http://stackoverflow.com/q/14097061/78845'
)
parser.add_argument("-v", "--verbose", help="increase output verbosity",
action="store_true")
args = parser.parse_args()
if args.verbose:
logging.basicConfig(level=logging.DEBUG)
logging.info('Shown in debug and info mode')
logging.debug('Only shown in debug mode')
if __name__ == "__main__":
logging.info('Starting script!')
main()
Run Code Online (Sandbox Code Playgroud)
从终端运行此脚本 aspython -m verbose -v不会打印任何内容。
如果您logging.info('Starting script!')将文件中的行注释为
if __name__ == "__main__":
#logging.info('Starting script!')
main()
Run Code Online (Sandbox Code Playgroud)
然后日志记录按预期工作。
看起来logging.info()在basicConfig定义之前调用 a 的尝试将完全禁用任何日志记录。 …