2017-05-17 8 views
0

私はPythonを使ってメッセージキューから読み込むサービスを書いています。各メッセージについて、プロセスを実行し、完了するとキューから別のメッセージを取得します。ログ情報、警告、およびエラーを記録するためにログパッケージを使用しています。プロセスが何らかの理由で失敗した場合、プロセスはエラーをキャッチして、トレースバックで電子メールを送信します。アプリケーションがメッセージの処理を開始したときのログもメールに含めたいと思います。明確にするには - 私はまだアプリケーションがすぐにログに記録するのが好きです。しかし、アプリケーションが失敗し、正常に例外をキャッチした場合は、電子メールにもログを送信したいと思います。私はPythonのloggingパッケージが追加する他の情報を見たい除い失敗時のPythonロギングダンプ

while True: 
    # Grab the message here 
    log_list = [] 
    try: 
    log_msg = "Some log message here" 
    log_list.append(log_msg) 
    ... 
    except: 
    # send email here using log_list 

これは一種の私の問題を解決するだろう:

私が最初に考えたのはちょうどそのような文字列をログ救うリストを使用していましたタイムスタンプのようなメッセージを記録する私は手動でこれを入れて、それを自分のlog_listオブジェクトに追加するだけでいいのではないかと思います。

import logging 
logger = logging.getLogger() 
while True: 
    logger.reset() 
    # Grab the message here 
    try: 
    logger.info("Some log message here") 
    ... 
    except: 
    # send email here using something like logger.dump() 

そう...私の質問は - ここで私は私のログを保存して、のような他のログイン情報を保存するために、リストを使用して回避することができ、このついて行くには別の方法があります:私は何をしたいのですタイムスタンプ、ロギングレベルなど?

+0

は理にかなって拡張。私はまだそれがすぐにログに記録されることを望むでしょう。私は、失敗時に送信される電子メールのログを集めたいだけです。 – archeezee

+2

これは、ロガーに追加された追加のカスタムロギングハンドラーのようなものです。 – chepner

+0

私は、最後にログに記録されたいくつかのメッセージを記憶し、これらの行を抽出して送信する循環バッファ( 'deque'を使って)を持つカスタムログハンドラを追加したいと思います。 – 9000

答えて

0

私はriscnotciscの提案を使用して終了しますが、私はlogging.Loggerクラス

from logging import Logger 
import logging 
import datetime 

class CustomLogger(Logger): 
    def __init__(self, process_name): 
     self.process_name = process_name 
     super(CustomLogger, self).__init__(process_name) 
     self.log_list = [] 

     ch = logging.StreamHandler() 
     ch.setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')) 
     self.handlers.append(ch) 

    def info(self, message, *args, **kwargs): 
     self.log_list.append('{} - {} - INFO - {}'.format(datetime.datetime.now(), self.process_name, message)) 
     super(CustomLogger, self).info(message, *args, **kwargs) 

    def debug(self, message, *args, **kwargs): 
     self.log_list.append('{} - {} - DEBUG - {}'.format(datetime.datetime.now(), self.process_name, message)) 
     super(CustomLogger, self).debug(message, *args, **kwargs) 

    def warning(self, message, *args, **kwargs): 
     self.log_list.append('{} - {} - WARNING - {}'.format(datetime.datetime.now(), self.process_name, message)) 
     super(CustomLogger, self).warning(message, *args, **kwargs) 

    def dump(self): 
     return '\n'.join(self.log_list) 

    def reset(self): 
     self.log_list = [] 
0

カスタムログクラスを試してみてください。 何かのように:

import time 

class Log: 
    msgs = [] 
    def __init__(self): 
     pass 

    def addLog(self,msg): 
     self.msgs.append("LOG AT "+str(time.time())+":\n"+msg) 

    def dumpLog(self): 
     s = "" 
     for each in self.msgs: 
      s+= each+"\n------------------------\n" 
     return s 

私は、ロギングモジュールに精通していないことだし、それはほとんどのユースケースのために複雑な上に見えます。

+0

ありがとう!私は実際にすでにロガーモジュールの拡張クラスを作成しています。だから私はおそらくそれに少しの機能性を追加することになるでしょう。 – archeezee

関連する問題