いろんなものはつながっている

pythonでログを出力する

pythonでの計算途中でログやデータをダンプしたい。

ログはlogging、ダンプはpickleを使えと友人に教えてもらった。

logginの使い方

loggingの使い方を調べてみると、動作させるための情報はたくさんあるけど、では、実際どう使ったらいいのか、皆はどう使っているのかの情報がなかなかない。

自分の要望は、
・複数のクラスにログ出力の部品を持たせて、共通のファイルにログを出力できるようにしたい。
・クラスごとにログレベルを変更したい予定もいまのところない。
・ただ、クラス毎にログ部品を定義して、、、なんてことは避けたい。

上記を実現する方法として、調べたなかでは、これが一番近いか。

metaクラスのほうはプライベート変数にアクセスしてしまっていいのかわからなかったので、@propertyのほうを使用することにした。

この方法がベストなのか、そもそも自分の要望自体がおかしいのか、確認すべきことは多々あるがが、考えているだけでは先に進まないのでまずはこれでログを出力するようにしよう。継続的に勉強していって、間違いに気づいたらその時点で修正しよう。

ちなみにloggingの仕組みについてはここがわかりやすかった。

こんなmixinを用意して

import logging, logging.config
import yaml
import pickle

class LoggerMixin(object):
_logger_configured = False
@property
def logger(self):
if not self._logger_configured:
with open(r'..\config\log_config.yaml', 'rt') as f:
config = yaml.load(f.read())
logging.config.dictConfig(config)
self._logger_configured = True
name = '.'.join([self.__class__.__name__])
return logging.getLogger(name)

使う側では、
self.logger.info(“XXXX”)
というように呼び出す。

設定ファイルであるyamlはここを参考に用意した。

version: 1
disable_existing_loggers: False

# Configuring the default (root) logger is highly recommended
root:
level: WARNING
handlers: [console]

# Configuration for logger set with logging.getLogger(NAME)
loggers:
PowerDetector:
level: DEBUG
handlers: [file]
propagate: no
Parent:
level: DEBUG
handlers: [console]
propagate: no

formatters:
simple:
format: "%(message)s"
normal:
format: "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
fmt1:
format: '%(asctime)s,%(name)s,%(levelname)s,%(message)s'

handlers:
console:
class: logging.StreamHandler
level: INFO
formatter: simple
stream: ext://sys.stdout
file:
class: logging.FileHandler
level: DEBUG
formatter: fmt1
filename: '..\log\sample.log'

pickleの使い方

ここを参考にした。

データをダンプするには、単に
pickle.dump(sample_list,f)
とするだけでいいのか。

関連記事

コメント

  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

スポンサード リンク

カテゴリー

スポンサード リンク