2016-10-14 8 views
-2

私はの代わりにロギングモジュールを使用したいと思います。コンテキストPythonは印刷よりもロギングモジュールを使用しています

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 

これは正しいアプローチですか?

+0

は私が、私は2行 –

+0

fileConfig( "logging.conf") 交換PPRINT(ジョブ)(仕事を)logging.infoする、これが正しいアプローチであるを追加しました,, logging.config輸入fileConfigからロギングと をインポートしますか? –

+0

コメントに返信する代わりに投稿を編集してください。 –

答えて

0

あなたが達成したいことは、私にはまだ明確ではありません - 特に、ここでロガーを使用する理由は何ですか?あなたのスクリプトの目的はジョブリストを出力することですね?もしそうなら、それをstdoutに印刷するのはおそらくRightThing(tm)でした。

一般的に、コマンドラインアプリケーションの場合、stdoutは通常のプログラム出力用です。stderrはエラー報告/デバッグトレース用です。

ログは通常複雑なアプリケーション(GUI、デーモンなど)、よく書かれたライブラリコード、ライブラリコードロギングのみで使用され、ロギング設定部分はアプリケーションに残されます(ライブラリコードはどのようなコンテキストで使用されるか)、レポート(エラー、警告、デバッグトレースなど)に使用されるため、管理者や開発者はアプリケーションの動作を分析して、

IOW、ロギングを使用して= 40行のクイックスクリプトを実際には意味をなさないし、スクリプトの出力をstdoutに送るのは実際にはwtf(私のフランス語を赦してください) 。

ここでもう1つの質問であるロギングモジュールを「どのように」使用するかについての洞察がありました。

最初に述べたように、loggingモジュールのポイントの1つは、ロギングの設定を切り離すことです(できるだけ早くアプリケーションのエントリーポイントで行う必要があります。とにかく、アプリケーションのデベロッパー - basicConfigdictConfigまたは一般的な手動構成)を使用してログを記録する(アプリケーションとライブラリのコード内で発生する)。通常、これは単にロギングなどを設定し、環境変数/コマンドライン引数などをチェックし、アプリケーションコード(それ自体が必要なライブラリをインポートする)をインポートし、アプリケーションを実行する非常に単純なメインスクリプト( "アプリケーションエントリポイント" 。

この場合、各モジュール(アプリケーションモジュールまたはライブラリモジュールのいずれか)は、__name__のロガー名として提供されるモジュールの名前(つまりmyapp.mypackage.mymodule)を使用して独自のロガーを要求します。これは、ロガーの "ツリー"を構築します(ルートからリーフまで、 'root' - > 'myapp' - > 'mypackage' - > 'mymodule')、それぞれは特別に設定することも、親ロガーに依存させることもできますconfig。適切なレベルを使用して、関連すると思われるものをログに記録するのは、モジュールの開発者としての責任です。

関連する問題