2016-09-02 4 views
1

私は必要に応じて回転ログファイルの名前を付けたいと思う。Pythonで回転ログファイルの特定の名前に名前をつける

たとえば、RotatingFileHandlerを使用すると、以下のように特定のファイルサイズの名前がlog file name + extension numberingに達するとログファイルが分割されます。

filename.log  #first log file 
filename.log.1 #rotating log file1 
filename.log.2 #rotating log file2 

ただし、ログハンドラの作成時に毎回ログハンドラに名前を付けたいとします。 たとえば、

09-01-12-20.log #first log file 
09-01-12-43.log #rotating log file1 
09-01-15-00.log #rotating log file2 

どうすればいいですか?

編集---------------------------

私は、ファイルを作成し、名前を付ける方法を求めていないのです。

私はPython loggingパッケージを継承してオーバーライドするようなことをしています。logging

答えて

2

私はPythonロギングハンドラのRotatingFileHandlerを継承して上書きします。ハンドラがログファイルかロールオーバーするかどう

RotatingFileHandlerがself.baseFilename値を持って、ハンドラは、ログファイルを作成するためにself.baseFilenameを使用します。(それは最初のファイルを作成するとき、またはロールオーバーが発生した場合)

self.shouldRollover()方法を、それはチェックします。

return 1の場合は、ロールオーバーが発生するか、return 0となります。

これらをオーバーライドすることで、このハンドラがロールオーバーを行い、ロールオーバーによって新しいログファイルに使用する名前を定義します。

-----------------------------------------編集--- --------------------------------------

私はサンプルコードを投稿します。

from logging import handlers 

class DailyRotatingFileHandler(handlers.RotatingFileHandler): 

    def __init__(self, alias, basedir, mode='a', maxBytes=0, backupCount=0, encoding=None, delay=0): 
     """ 
     @summary: 
     Set self.baseFilename to date string of today. 
     The handler create logFile named self.baseFilename 
     """ 
     self.basedir_ = basedir 
     self.alias_ = alias 

     self.baseFilename = self.getBaseFilename() 

     handlers.RotatingFileHandler.__init__(self, self.baseFilename, mode, maxBytes, backupCount, encoding, delay) 

    def getBaseFilename(self): 
     """ 
     @summary: Return logFile name string formatted to "today.log.alias" 
     """ 
     self.today_ = datetime.date.today() 
     basename_ = self.today_.strftime("%Y-%m-%d") + ".log" + '.' + self.alias_ 
     return os.path.join(self.basedir_, basename_) 

    def shouldRollover(self, record): 
     """ 
     @summary: 
     Rollover happen 
     1. When the logFile size is get over maxBytes. 
     2. When date is changed. 

     @see: BaseRotatingHandler.emit 
     """ 

     if self.stream is None:     
      self.stream = self._open() 

     if self.maxBytes > 0 :     
      msg = "%s\n" % self.format(record) 
      self.stream.seek(0, 2) 
      if self.stream.tell() + len(msg) >= self.maxBytes: 
       return 1 

     if self.today_ != datetime.date.today(): 
      self.baseFilename = self.getBaseFilename() 
      return 1 

     return 0 

このDailyRotatingFileHandlerは

2016-10-05.log.alias 
2016-10-05.log.alias.1 
2016-10-05.log.alias.2 
2016-10-06.log.alias 
2016-10-06.log.alias.1 
2016-10-07.log.alias.1 
+0

これを行った方法のサンプルコードがありますか? – FredFury

+0

@FredFuryサンプルコードを追加します。それはあなたに役立つと期待しています。 – SangminKim

1

次のコードを確認し、役立つかどうか確認してください。あなたの問題がタイムスタンプに基づいてファイル名を達成することにあるのであれば、これはあなたのために働くでしょう。

import datetime, time 
# This return the epoch timestamp  
epochTime = time.time() 
# We generate the timestamp 
# as per the need 
timeStamp = datetime.datetime\ 
        .fromtimestamp(epochTime)\ 
        .strftime('%Y-%m-%d-%H-%M') 
# Create a log file 
# use timeStamp as filename 
fo = open(timeStamp+".log", "wb") 
fo.write("Log data") 
fo.close() 
+0

のようなログファイルを作成します。私はすでに時間を処理し、ファイルを作成する方法を知っているが、私が欲しいのはPythonはPythonのログ機能をfacilatingログインしています。ロギングクラスを継承し、ロギングメソッドをオーバーライドするようなものにすることができます。 – SangminKim

関連する問題