簡體   English   中英

如何從命令行設置日志記錄級別

[英]how to set logging level from command line

我正在使用 argparse 從命令行獲取日志記錄級別,然后將其作為 logging.basicConfig 的輸入傳遞。 但是,我試圖實現這一點的方式不起作用。 有什么建議嗎?

期望行為,來自命令行:

python main.py -log=DEBUG

欲望輸出

DEBUG:__main__: Debug is working

代碼

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')

將這些組合放在一起,允許用戶用大寫或小寫命名級別,只允許指定一個級別,並從字典中選擇顯式級別,默認為警告級別:

import argparse
import logging
parser = argparse.ArgumentParser()
parser.add_argument(
    "-log", 
    "--log", 
    default="warning",
    help=(
        "Provide logging level. "
        "Example --log debug', default='warning'"),
    ),
)

options = parser.parse_args()
levels = {
    'critical': logging.CRITICAL,
    'error': logging.ERROR,
    'warn': logging.WARNING,
    'warning': logging.WARNING,
    'info': logging.INFO,
    'debug': logging.DEBUG
}
level = levels.get(options.log.lower())
if level is None:
    raise ValueError(
        f"log level given: {options.log}"
        f" -- must be one of: {' | '.join(levels.keys())}")
logging.basicConfig(level=level)
logger = logging.getLogger(__name__)

級別應該是來自logging的變量,而不是字符串,例如logging.DEBUG 我認為你必須創建一個匹配給定參數和日志變量的字典:

level_config = {'debug': logging.DEBUG, 'info': logging.INFO} # etc.
log_level = level_config[parser.parse_args().log[0].lower()]

您還可以在add_argument調用中添加add_argument choices=['debug', 'info', 'warning']

basicConfig函數可以為level接受一個字符串參數,它會為您檢查其有效性,因此代碼可以比 BarryPye 的答案簡單得多。

import argparse
import logging

parser = argparse.ArgumentParser()
parser.add_argument( '-log',
                     '--loglevel',
                     default='warning',
                     help='Provide logging level. Example --loglevel debug, default=warning' )

args = parser.parse_args()

logging.basicConfig( level=args.loglevel.upper() )
logging.info( 'Logging now setup.' )

log_level = 'logging.'+log_level[0]這只是使字符串'logging.DEBUG'不是 basicConfig 理解的。 它想要的是logging.DEBUG常量,您可以通過getattr(logging, log_level[0]) 較新版本的python實際上也接受文本表示,您可以將'DEBUG'作為級別傳遞。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM