@@ -153,9 +153,12 @@ class FileHandler(Handler):
153153 """File handler which supports reopening of logs.
154154 """
155155
156- def __init__ (self , filename , mode = 'ab' ):
156+ def __init__ (self , filename , mode = 'ab' , fmt = None ):
157157 Handler .__init__ (self )
158158
159+ if fmt is not None :
160+ self .setFormat (fmt )
161+
159162 try :
160163 self .stream = open (filename , mode )
161164 except OSError as e :
@@ -187,7 +190,7 @@ def remove(self):
187190
188191class RotatingFileHandler (FileHandler ):
189192 def __init__ (self , filename , mode = 'ab' , maxBytes = 512 * 1024 * 1024 ,
190- backupCount = 10 ):
193+ backupCount = 10 , fmt = None ):
191194 """
192195 Open the specified file and use it as the stream for logging.
193196
@@ -210,7 +213,7 @@ def __init__(self, filename, mode='ab', maxBytes=512*1024*1024,
210213 """
211214 if maxBytes > 0 :
212215 mode = 'ab' # doesn't make sense otherwise!
213- FileHandler .__init__ (self , filename , mode )
216+ FileHandler .__init__ (self , filename , mode , fmt )
214217 self .maxBytes = maxBytes
215218 self .backupCount = backupCount
216219 self .counter = 0
@@ -292,8 +295,17 @@ def asdict(self):
292295 msg = as_string (self .msg )
293296 if self .kw :
294297 msg = msg % self .kw
295- self .dictrepr = {'message' :msg , 'levelname' :levelname ,
296- 'asctime' :asctime }
298+ self .dictrepr = {
299+ 'message' : msg ,
300+ 'levelname' : levelname ,
301+ 'asctime' : asctime ,
302+ 'levelno' : self .level ,
303+ 'process' : os .getpid (),
304+ 'processName' : 'supervisord' ,
305+ 'threadName' : 'MainThread'
306+ }
307+ self .dictrepr .update (self .kw )
308+
297309 return self .dictrepr
298310
299311class Logger :
@@ -379,8 +391,18 @@ def emit(self, record):
379391 except :
380392 self .handleError ()
381393
382- def getLogger (level = None ):
383- return Logger (level )
394+ def getLogger (level = None , fmt = None ):
395+ logger = Logger (level )
396+ if fmt is not None :
397+ # Create a handler with the specified format
398+ handler = StreamHandler ()
399+ handler .setFormat (fmt )
400+ if level is not None :
401+ handler .setLevel (level )
402+ else :
403+ handler .setLevel (logger .level )
404+ logger .addHandler (handler )
405+ return logger
384406
385407_2MB = 1 << 21
386408
@@ -400,6 +422,13 @@ def handle_stdout(logger, fmt):
400422 handler .setLevel (logger .level )
401423 logger .addHandler (handler )
402424
425+ def handle_stderr (logger , fmt ):
426+ """Attach a new StreamHandler with stderr handler to an existing Logger"""
427+ handler = StreamHandler (sys .stderr )
428+ handler .setFormat (fmt )
429+ handler .setLevel (logger .level )
430+ logger .addHandler (handler )
431+
403432def handle_syslog (logger , fmt ):
404433 """Attach a new Syslog handler to an existing Logger"""
405434 handler = SyslogHandler ()
@@ -413,10 +442,28 @@ def handle_file(logger, filename, fmt, rotating=False, maxbytes=0, backups=0):
413442 if filename == 'syslog' : # TODO remove this
414443 handler = SyslogHandler ()
415444 else :
416- if rotating is False :
417- handler = FileHandler (filename )
418- else :
419- handler = RotatingFileHandler (filename , 'a' , maxbytes , backups )
420- handler .setFormat (fmt )
421- handler .setLevel (logger .level )
422- logger .addHandler (handler )
445+ if filename == 'stdout' :
446+ return handle_stdout (logger , fmt )
447+ if filename == 'stderr' :
448+ return handle_stderr (logger , fmt )
449+ if not os .path .exists (filename ):
450+ # touching the file
451+ try :
452+ open (filename , 'a' ).close ()
453+ except (IOError , OSError ):
454+ pass
455+ try :
456+ if rotating :
457+ handler = RotatingFileHandler (
458+ filename ,
459+ maxBytes = maxbytes ,
460+ backupCount = backups
461+ )
462+ else :
463+ handler = FileHandler (filename )
464+ handler .setFormat (fmt )
465+ handler .setLevel (logger .level )
466+ logger .addHandler (handler )
467+ return handler
468+ except (IOError , OSError ):
469+ logger .error ('Cannot open file %s for writing' % filename )
0 commit comments