ホームページ >バックエンド開発 >Python チュートリアル >シンプルな Python ロギング - 依存関係、信頼、コードのコピー/ペーストに関する余談
ヘッダー画像 (C) Tai Kedzierski
スニペットに移動
この投稿には意見が含まれています。
Python のデフォルトのログ設定は役に立ちません。それは、私たちが期待する「バッテリー付属」アプローチに反して機能します。
有用なログメッセージから、いつ、どのレベルで、どのような情報が知りたい。コンソール上に保存したい場合もあれば、ファイルに保存したい場合もあります。
これは簡単なはずです - しかし、Python では、カスタム ファイル処理と文字列書式設定を備えた完全なログ ユーティリティを作成する方法を毎回調べる必要があります。
logger = getLogger() と同じくらい単純であるべきですが、何らかの不明な理由により、デフォルトの動作ではまったく役に立たない書式設定が提供され、賢明なデフォルトの略語は提供されません。
そのためには、出所不明の pip パッケージをダウンロードし、名前がハイジャックされていないことを信頼するか、難読化された抽出を行う必要があります。 2016 年のレフトパッド事件と、2024 年の Revival ハイジャック攻撃が思い浮かびますが、これは別のリポジトリ システムで本質的に同じ問題でした。
実際、名前空間のないユーザー リポジトリは、これに対して脆弱です。例を挙げると、Node の npm、Python の pip、Arch の AUR、Canonical の snap... ユーザーに何でもアップロードさせるだけのいくつかの例です。名前空間でさえ信頼を保証するものではありません。私は、プロジェクト名ではなく、任意の開発者のモニッカーを介してこれらのチャネルを通じてソフトウェアを配布しているプロジェクトに遭遇しました。そのため、パッケージの信頼性について疑問が生じています。作業環境での syncthing の使用に関する以前の投稿で、ソースを信頼するかどうかを決定する方法についての思考プロセスを説明しました。
ユーザー制御のリポジトリの外部依存関係は悪魔であり、問題の解決策が複雑な場合にのみ考慮する必要があります。そして一般に、単純な解決策はコード ベースに直接存在する必要があります。理想的には自分で作成するものですが、問題が「十分に面倒な」領域に単に入り込み、依存関係が合理的であると同時に不快に感じられることもあります。
🎜>
答え: 一度書いたら、Github Gist または独自の「便利なスニペット」リポジトリに隠しておきます。コピーして貼り付けます。コピーペーストしますか?えー!
コードの「コピー アンド ペースト」は、おそらく経験豊富なプログラマーにとって警鐘を鳴らしているでしょう。 「同じことを繰り返さない」、「パッケージマネージャーを使用する」、「一度書いたらどこでも更新する」。これらは優れた本能ですが、ケースバイケースで、コピー&ペーストが望ましい
の場合を知っておくことも重要です。この場合、要件は、単純なニーズに対する単純な解決策のために、不必要な外部依存関係を回避することです。このミニロガーと同様に、左パッドで必要なコード スニペットは 短く かつ 理解しやすい です。必要に応じて再実装しても損はありません。また、適切にライセンスされています (はい、単なるスニペットである可能性があります。ただし、コピーしている内容が実際に許可されていることを確認するために推奨されていることに変わりはありません。コードのランダムな塊をコピーすることには注意してください。)
最小限の構成で 1 回の呼び出しを可能にするミニロガー ユーティリティのコード スニペットを以下に示します。
from minilog import SimpleLogger LOG = SimpleLogger(name="mylog", level=SimpleLogger.INFO) LOG.info("this is useful")
コンソールに出力されるもの:
2024-11-20 10:43:44,567 | INFO | mylog : this is useful
これをプロジェクトの minilogger.py ファイルにコピーします。多田 - 外部依存は必要ありません。何もせずに放置しておくと、永遠に同じ状態が続きます。名前乗っ取りじゃないよ。サプライチェーンへの注入はありません。
# For completeness: # (C) Tai Kedzierski - Provided under MIT license. Go wild. import logging class SimpleLogger(logging.Logger): FORMAT_STRING = '%(asctime)s | %(levelname)s | %(name)s : %(message)s' ERROR = logging.ERROR WARN = logging.WARN INFO = logging.INFO DEBUG = logging.DEBUG def __init__(self, name="main", fmt_string=FORMAT_STRING, level=logging.WARNING, console=True, files=None): logging.Logger.__init__(self, name, level) formatter_obj = logging.Formatter(fmt_string) if files is None: files = [] elif isinstance(files, str): files = [files] def _add_stream(handler:logging.Handler, **kwargs): handler = handler(**kwargs) handler.setLevel(level) handler.setFormatter(formatter_obj) self.addHandler(handler) if console is True: _add_stream(logging.StreamHandler, stream=sys.stdout) for filepath in files: _add_stream(logging.FileHandler, filename=filepath)
MIT ライセンスでは、基本的に「これを使って何でもできる」ことが許可されています。制約はありません。
そこにいます。単純なログ ?
以上がシンプルな Python ロギング - 依存関係、信頼、コードのコピー/ペーストに関する余談の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。