相关疑难解决方法(0)

如何在脚本中实现--verbose或-v选项?

我知道--verbose或者-v来自几个工具,我想将它实现到我自己的一些脚本和工具中.

我想放置:

if verbose:
    print ...
Run Code Online (Sandbox Code Playgroud)

通过我的源代码,这样如果用户传递-v选项,变量verbose将被设置为True,文本将被打印.

这是正确的方法还是有更常见的方法?

另外:我不是要求一种方法来实现参数的解析.我知道它是如何完成的.我只对verbose选项感兴趣.

python option

78
推荐指数
5
解决办法
9万
查看次数

Python日志记录在stdout和stderr之间分割

是否有可能将INFO或DEBUG的python日志消息转到stdout,使用WARNING或更高版本转到stderr?

python logging stderr

18
推荐指数
2
解决办法
1万
查看次数

Python日志记录 - DEBUG下面有什么东西吗?

在其他一些技术中,我们偶尔使用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的人来说,更多的力量给你:)

python logging

17
推荐指数
3
解决办法
7659
查看次数

如何从命令行设置日志记录级别

我正在使用 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 logging argparse

8
推荐指数
3
解决办法
1万
查看次数

Python3 日志记录模块:在配置中设置日志记录级别变量

我正在使用 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可能有其他想法!

谢谢,弗兰克

logging python-3.x

3
推荐指数
1
解决办法
1万
查看次数

Python Logging HOWTO 中的“--log=INFO”是什么意思

我阅读了Python Logging HOWTO,有一段我不明白的描述:

如果要从命令行选项设置日志记录级别,例如:

--log=INFO
Run Code Online (Sandbox Code Playgroud)

并且您--log在某个变量loglevel 中传递了参数的值,您可以使用:

getattr(logging, loglevel.upper())
Run Code Online (Sandbox Code Playgroud)

获取您将通过level参数传递给basicConfig()

这是什么意思?没有例子,如果有人能给一个就好了。

我可以像这样设置日志记录级别吗?

logging --log=INFO
Run Code Online (Sandbox Code Playgroud)

python logging

3
推荐指数
1
解决办法
671
查看次数

如果在声明之前调用 logging.info(),Python 中的 logging.basicConfig 将不起作用

基于此答案,启用详细日志记录的更简单方法

让我们以这个 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 的尝试将完全禁用任何日志记录。 …

python logging python-logging

1
推荐指数
2
解决办法
1894
查看次数

标签 统计

logging ×6

python ×6

argparse ×1

option ×1

python-3.x ×1

python-logging ×1

stderr ×1