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

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. この記事へのトラックバックはありません。

スポンサード リンク

カテゴリー

スポンサード リンク