Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python';s logging.config.dictConfig()应用记录器';s的配置设置?_Python_Json_Python 3.x_Logging - Fatal编程技术网

Python';s logging.config.dictConfig()应用记录器';s的配置设置?

Python';s logging.config.dictConfig()应用记录器';s的配置设置?,python,json,python-3.x,logging,Python,Json,Python 3.x,Logging,我一直在尝试实现一个基本的记录器,它在Python3.5中写入文件,从JSON配置文件加载设置。 我将首先显示我的代码 log\u config.json { "version": 1, "disable_existing_loggers": "false", "logging": { "formatters": { "basic": { "class": "logging.Formatter",

我一直在尝试实现一个基本的记录器,它在Python3.5中写入文件,从JSON配置文件加载设置。 我将首先显示我的代码

log\u config.json

{
    "version": 1,
    "disable_existing_loggers": "false",
    "logging": {
        "formatters": {
            "basic": {
                "class": "logging.Formatter",
                "style": "%",
                "datefmt": "%I:%M:%S",
                "format": "[%(asctime)] %(levelname:<8s): (name:<4s): %(message)"
            }
        },

        "handlers": {
            "file": {
                "class": "logging.handlers.FileHandler",
                "level": "DEBUG",
                "formatter": "basic",
                "filename": "test.log",
                "mode": "a",
                "encoding": "utf-8"
            }
        },

        "loggers": { },

        "root": {
            "handlers": ["file"],
            "level": "DEBUG"
        }
    }
}
当使用
python3 logger.py运行时,会产生输出(在终端中)

第一,;看着。30是“警告”的默认日志记录级别。这与我在处理程序和根记录器中设置的
级别
属性的设置相矛盾。JSON似乎不正确,或者我错过了应用它的函数调用

第二;这让我想到,尽管我使用调用
dictConfig()
加载配置,但我仍然需要在
logger.py
文件中通过进一步调用将其应用于日志记录。这似乎有点多余,你有配置,然后必须详细应用每个设置无论如何

此外;当我试着使用它时,它就像我想的那样工作。即,;通过一个函数调用加载文件,并能够直接进行日志调用。这令人困惑,因为为什么与此格式一起使用的较旧的
fileConfig()
调用比使用JSON或YAML的
dictConfig()
调用提供更精简的功能

最后,我有点困惑,想弄明白这一点。我感谢你的时间和帮助

编辑:根据Alex.p的评论,我在
log\u config.json
中添加了以下处理程序,并将根处理程序改为它

"console": {
            "class": "logging.StreamHandler",
            "level": "DEBUG",
            "formatter": "basic",
            "stream": "ext://sys.stdout"
        },

检查输出,与上面相同。

啊,我找出了问题所在。原来是JSON。 我的工作就是基于此,它在JSON中有一个额外的
logging
属性,它封装了所有记录器、处理程序等

删除该属性并使层次结构更像YAML文件(我也测试了它,并且工作正常),它可以按预期工作。我甚至可以在我的
logger.py
中删除对
basicConfig
的额外调用

最终JSON

{
    "version": 1,
    "disable_existing_loggers": "false",
    "formatters": {
        "basic": {
            "class": "logging.Formatter",
            "datefmt": "%I:%M:%S",
            "format": "%(asctime)s %(levelname)s %(name)s %(message)s"
        }
    },

    "handlers": {
        "console": {
            "class": "logging.StreamHandler",
            "level": "DEBUG",
            "formatter": "basic",
            "stream": "ext://sys.stdout"
        },
        "file": {
            "class": "logging.FileHandler",
            "level": "DEBUG",
            "formatter": "basic",
            "filename": "test.log",
            "mode": "w",
            "encoding": "utf-8"
        }
    },

    "loggers": { },

    "root": {
        "handlers": ["console", "file"],
        "level": "DEBUG"
    }
}

我现在无法测试它,但我认为您只设置了到文件的日志记录,而没有设置到控制台,因此日志记录可能使用
警告
作为登录到终端的默认值。尝试将
logging.StreamHandler
作为一个类添加另一个处理程序。@Alex.P谢谢您的输入。我添加了一个输出到控制台的处理程序,不幸的是它给出了相同的输出。有关我添加到JSON文件的内容,请参见我的编辑。注意,我打算将日志写入一个文件。我不知道dictconfig中可以有一个“root”字段。我从您那里了解到,如果代码在具有不同字符集的其他计算机上运行,则必须指定utf-8。
"console": {
            "class": "logging.StreamHandler",
            "level": "DEBUG",
            "formatter": "basic",
            "stream": "ext://sys.stdout"
        },
{
    "version": 1,
    "disable_existing_loggers": "false",
    "formatters": {
        "basic": {
            "class": "logging.Formatter",
            "datefmt": "%I:%M:%S",
            "format": "%(asctime)s %(levelname)s %(name)s %(message)s"
        }
    },

    "handlers": {
        "console": {
            "class": "logging.StreamHandler",
            "level": "DEBUG",
            "formatter": "basic",
            "stream": "ext://sys.stdout"
        },
        "file": {
            "class": "logging.FileHandler",
            "level": "DEBUG",
            "formatter": "basic",
            "filename": "test.log",
            "mode": "w",
            "encoding": "utf-8"
        }
    },

    "loggers": { },

    "root": {
        "handlers": ["console", "file"],
        "level": "DEBUG"
    }
}