logutils.py (3332B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\brennivin\logutils.py 2 import fnmatch as _fnmatch 3 import logging as _logging 4 import os as _os 5 import time as _time 6 try: 7 NullHandler = _logging.NullHandler 8 except AttributeError: 9 10 class NullHandler(_logging.Handler): 11 12 def emit(self, record): 13 pass 14 15 16 _logging.NullHandler = NullHandler 17 18 class Fmt(object): 19 NTLM = '%(name)s %(asctime)s %(levelname)s: %(message)s' 20 FMT_NTLM = _logging.Formatter(NTLM) 21 LM = '%(levelname)s: %(message)s' 22 FMT_LM = _logging.Formatter(LM) 23 24 25 class MultiLineIndentFormatter(_logging.Formatter): 26 27 def __init__(self, fmt = None, datefmt = None, sep = ' '): 28 _logging.Formatter.__init__(self, fmt, datefmt) 29 self.sep = sep 30 31 def format(self, record): 32 formattedRecord = _logging.Formatter.format(self, record) 33 header, footer = formattedRecord.split(record.msg) 34 s = formattedRecord.replace('\n', '\n' + self.sep * len(header)) 35 return s 36 37 38 def timestamped_filename(filename, fmt = '%Y-%m-%d-%H-%M-%S', timestruct = None, sep = '_'): 39 head, ext = _os.path.splitext(filename) 40 timestr = timestamp(fmt, timestruct) 41 return '%s%s%s%s' % (head, 42 sep, 43 timestr, 44 ext) 45 46 47 def timestamp(fmt, timestruct = None): 48 return _time.strftime(fmt, timestruct or _time.gmtime()) 49 50 51 def get_timestamped_logfilename(folder, basename = None, ext = '.log', fmt = '%Y-%m-%d-%H-%M-%S', timestruct = None, _getpid = _os.getpid): 52 if basename is None: 53 basename = _os.path.basename(folder) 54 timestamped = timestamp(fmt, timestruct) 55 pid = _getpid() 56 logname = '{basename}_{timestamped}_pid{pid}{ext}'.format(**locals()) 57 logfilename = _os.path.join(folder, logname) 58 try: 59 remove_old_files(folder, '*{basename}_*{ext}'.format(**locals()), 15) 60 except OSError: 61 pass 62 63 return logfilename 64 65 66 def get_filenames_from_loggers(loggers = None, _loggingmodule = None): 67 _loggingmodule = _loggingmodule or _logging 68 if loggers is None: 69 loggers = [_loggingmodule.root] 70 loggers.extend(_loggingmodule.Logger.manager.loggerDict.values()) 71 allfilenames = set() 72 for logger in filter(lambda lo: hasattr(lo, 'handlers'), loggers): 73 filenames = [ getattr(h, 'baseFilename', None) for h in logger.handlers ] 74 for f in filter(None, filenames): 75 allfilenames.add(_os.path.abspath(f)) 76 77 return tuple(allfilenames) 78 79 80 def remove_old_files(root, namepattern = '*', maxfiles = 1): 81 if maxfiles < 0: 82 raise ValueError('maxfiles must be >= 0, got %s' % maxfiles) 83 lstFiles = [] 84 for f in _os.listdir(root): 85 if _fnmatch.fnmatch(f, namepattern): 86 fileName = _os.path.join(root, f) 87 lstFiles.append(fileName) 88 89 lstFiles.sort(key=_os.path.getmtime, reverse=True) 90 for f in lstFiles[maxfiles:]: 91 try: 92 _os.remove(f) 93 except (OSError, IOError): 94 pass 95 96 97 def wrap_line(s, maxlines, maxlen = 254, pfx = '- '): 98 e = len(s) 99 if e <= maxlen: 100 yield s 101 else: 102 i = maxlen 103 maxlen -= len(pfx) 104 maxlines -= 1 105 yield s[:i] 106 while i < e and maxlines: 107 yield pfx + s[i:i + maxlen] 108 i += maxlen 109 maxlines -= 1