Python使用日志模块而不是打印

Python使用日志模块而不是打印,python,logging,beautifulsoup,python-requests,Python,Logging,Beautifulsoup,Python Requests,我想用一个日志模块来代替print(),如果您能给我一些建议,我将不胜感激 上下文中的代码 from bs4 import BeautifulSoup, Tag import requests from pprint import pprint import sys import logging from logging.config import fileConfig fileConfig("logging.conf") url = "http://hortonworks.com/care

我想用一个日志模块来代替
print()
,如果您能给我一些建议,我将不胜感激

上下文中的代码

from bs4 import BeautifulSoup, Tag
import requests
from pprint import pprint
import sys
import logging
from logging.config import fileConfig

fileConfig("logging.conf")

url = "http://hortonworks.com/careers/open-positions/"

response = requests.get(url)

if response.status_code != 200:
    print("Request failed with http code {}".format(response.status_code))
    sys.exit(1)

soup = BeautifulSoup(response.text, "html.parser")

jobs = []
div_main = soup.select("div#careers_list")

for div in div_main:
    for element in div:
        if isinstance(element, Tag) and "class" in element.attrs:
            if "department_title" in element.attrs["class"]:
                department_title = element.get_text().strip()
            elif "career" in element.attrs["class"]:
                location = element.select("div.location")[0].get_text().strip()
                title = element.select("div.title")[0].get_text().strip()
                job = {
                    "job_location": location,
                    "job_title": title,
                    "job_dept": department_title
                }
                jobs.append(job)

logging.info(jobs)
我用logging.info替换了
pprint

我的logging.conf文件

[loggers]
keys=root

[handlers]
keys=hand01

[formatters]
keys=form01

[logger_root]
level=DEBUG
handlers=hand01

[handler_hand01]
level=DEBUG
class=StreamHandler
args=(sys.stdout,)
formatter=form01

[formatter_form01]
format= %(processName)s %(asctime)s %(pathname)s %(levelname)-9s %(message)s
datefmt=%Y-%m-%d %H:%M:%S
class=logging.Formatter

这是正确的方法吗?

我仍然不太清楚您想要实现什么-特别是,为什么要在这里使用记录器。看起来脚本的目标是输出作业列表?如果是,那么将其打印到stdout可能是正确的选择(tm)

作为一般规则:对于命令行应用程序,stdout用于正常程序输出,stderr用于错误报告/调试跟踪

日志记录通常用于复杂的应用程序(GUI、守护进程等),并且由编写良好的库代码使用,只记录库代码,将日志记录配置部分留给应用程序(因为库代码无法知道它将在哪个上下文中使用),并用于报告(错误、警告、调试跟踪…)因此,管理员和/或开发人员可以分析应用程序的行为,并最终在出现问题时跟踪问题

注意,在一个=~40行的快速脚本中使用日志记录甚至没有函数,这真的没有意义,而使用它将脚本的输出发送到stdout实际上是一个wtf(请原谅我的法语)

现在,如果您想了解“如何”使用日志模块,那是另一个问题

首先,如上所述,
日志记录
模块的要点之一是解耦日志记录配置(这应该由应用程序的入口点尽快完成,并且可以以应用程序开发人员喜欢的任何方式完成-使用
basicConfig
dictConfig
或普通手动配置)从日志记录使用(发生在应用程序的代码库和代码库中)。通常这意味着您有一个非常简单的主脚本(“应用程序入口点”),它只需设置日志记录等,检查环境变量/命令行参数等,导入应用程序代码(它本身将导入所需的LIB)并运行应用程序


在此上下文中,每个模块(无论是应用程序模块还是库模块)都将请求它自己的记录器,通常使用
\uuu name\uu
魔术变量提供的模块名称(即
myapp.mypackage.mymodule
)作为记录器名称。这将构建记录器的“树”(从根到叶,使用“根”->“myapp”->“mypackage”->“mymodule”),每个都可以专门配置或在其父logger config上重新登录。然后,作为模块的开发人员,您可以使用适当的级别记录您认为相关的内容。

I导入日志记录并从logging.config导入文件配置,然后添加2行文件配置(“logging.conf”)来替换pprint(作业)这是正确的方法吗?请编辑你的帖子,而不是在评论中回答。另外:你对修改后的代码有什么问题?编辑完毕。我不确定我是否正确。因为这是我第一次使用此日志记录代码。请纠正我。