2016-09-02 2 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 

어떻게하면됩니까?

편집 --------------------------- 내가 만들고 파일 이름을하는 방법을 요구하고 있지 않다

.

logging을 계승하고 무시하는 것과 같은 일을하는 Python logging 패키지를 직면하고 싶습니다.

답변

2

내가 상속 파이썬 로깅 핸들러의 RotatingFileHandler 우선합니다.

RotatingFileHandler 핸들러 (이것은 첫 번째 파일을 생성 할 때 또는 롤오버가 발생했을 때) 처리기 로그 롤오버 또는 안 경우

self.shouldRollover() 방법, 그것을 확인 로그한다. 만들 self.baseFilename를 사용할 것이다 self.baseFilename 값을 갖는다.

이 방법이 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는 이미 시간을 처리하고 파일을 생성하지만 내가 원하는 것은 파이썬 로깅 기능을 facilating 파이썬 로깅 함께하는 방법을 알고

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

같은 로그 파일을 만듭니다. 그것은 로깅 클래스를 상속하고 로깅 메소드를 무시하는 것과 같을 수 있습니다. – SangminKim

관련 문제