class RotatingFileLogger(JSONLogger): """RotatingFileLogger The :class:`RotatingFileLogger` JSON logs SBP messages to a rotating file handler that's turned over at a specified time interval (defaults to 30 minutes). Intended to be a very low-overhead, cross-platform rolling logger for field testing. Parameters ---------- filename : string Path to file to write SBP messages to. when : str Specifies a type of interval interval : int Specifies length of interval backupCount : int Number of backups to keep around tags : dict Tags to add to SBP message envelope dispatcher: dict SBP dispatch table """ def __init__(self, filename, when='M', interval=30, backupCount=3, tags={}, dispatcher=dispatch): self.handler = TimedRotatingFileHandler(filename, when, interval, backupCount) self.logger = logging.getLogger("Rotating Log") self.logger.setLevel(logging.INFO) self.logger.addHandler(_mk_async_emit(self.handler)) self.dispatcher = dispatcher self.base_time = time.time() self.tags = tags def __call__(self, msg): self.call(msg) def flush(self): self.handler.flush() def close(self): self.handler.close() def call(self, msg): self.logger.info(self.dump(msg))
class RotatingFileLogger(JSONLogger): """RotatingFileLogger The :class:`RotatingFileLogger` JSON logs SBP messages to a rotating file handler that's turned over at a specified time interval (defaults to 30 minutes). Intended to be a very low-overhead, cross-platform rolling logger for field testing. Parameters ---------- filename : string Path to file to write SBP messages to. when : str Specifies a type of interval interval : int Specifies length of interval backupCount : int Number of backups to keep around tags : dict Tags to add to SBP message envelope dispatcher: dict SBP dispatch table """ def __init__(self, filename, when='M', interval=30, backupCount=3, **kwargs): super(RotatingFileLogger, self).__init__(None, **kwargs) self.handler = TimedRotatingFileHandler(filename, when, interval, backupCount) self.logger = logging.getLogger("Rotating Log") self.logger.setLevel(logging.INFO) self.logger.addHandler(self.handler) def __call__(self, msg, **metadata): self.call(msg, **metadata) def flush(self): self.handler.flush() def close(self): self.handler.close() def call(self, msg, **metadata): self.logger.info(self.dump(msg, **metadata))
def write_log(self, log_level, log_message): """ 解决实例化对象作为参数,再取实例化对象参数时参数变为元组情况 """ if isinstance(self.logFlag, tuple): self.logFlag = ''.join(self.logFlag) if isinstance(self.logFile, tuple): self.logFile = ''.join(self.logFile) ###创建一个logger logger = logging.getLogger(self.logFlag) logger.setLevel(logging.DEBUG) ###建立日志目录 log_dir = os.path.dirname(self.logFile) if not os.path.isdir(log_dir): os.makedirs(log_dir) ###创建一个handler用于写入日志文件 handler = TimedRotatingFileHandler(self.logFile, when='D', interval=1, backupCount=7) handler.setLevel(logging.DEBUG) ###设置后缀名称,跟strftime的格式一样 handler.suffix = "%Y%m%d.log" ###定义handler的输出格式 formatter = logging.Formatter('%(asctime)s %(name)s %(levelname)s %(message)s') handler.setFormatter(formatter) ###将相应的handler添加在logger对象中 logger.addHandler(handler) ###开始记录日志 level_dic = {'debug': logger.debug, 'info': logger.info, 'warning': logger.warning, 'error': logger.error, 'critical': logger.critical} ##最终如:logger.debug(log_message) level_dic[log_level](log_message) ###删除重复记录 handler.flush() logger.removeHandler(handler)
import fileinput import json import argparse import sys from logging.handlers import TimedRotatingFileHandler class NoFormatter(): def format(self, record): return record.strip() if __name__ == '__main__': parser = argparse.ArgumentParser() parser.add_argument("logdir") args = parser.parse_args() logger = TimedRotatingFileHandler(args.logdir + '/reqlog.jl', when='h', utc=True) formatter = NoFormatter() logger.setFormatter(formatter) for line in sys.stdin: logger.emit(line) logger.flush()
class loggingUtils(Singleton): def __init__(self, logfile): self.logger = logging.getLogger(logfile) if not self.logger.handlers: self.hdlr = TimedRotatingFileHandler( 'D:/code/pythoneod/log/%s.log' % logfile, when="d", interval=1, backupCount=7) formatter = logging.Formatter( '%(levelname)s %(asctime)s %(filename)s[line:%(lineno)d] %(message)s', '%Y-%m-%d %H:%M:%S') self.hdlr.setFormatter(formatter) self.logger.addHandler(self.hdlr) self.logger.setLevel(logging.INFO) # 定义一个Handler打印INFO及以上级别的日志到sys.stderr console = logging.StreamHandler() console.setLevel(logging.INFO) # 设置日志打印格式 formatter = logging.Formatter( '%(levelname)s %(asctime)s %(filename)s[line:%(lineno)d] %(message)s', '%Y-%m-%d %H:%M:%S') console.setFormatter(formatter) # 将定义好的console日志handler添加到root logger self.logger.addHandler(console) def info(self, msg): self.logger.info(msg) self.hdlr.flush() def debug(self, msg): self.logger.debug(msg) self.hdlr.flush() def error(self, msg): self.logger.error(msg) self.hdlr.flush() def exception(self, msg): self.logger.exception(msg) self.hdlr.flush() def error_sys(self, limit=None): exceptionType, exceptionValue, exceptionTraceback = sys.exc_info() if limit is None: if hasattr(sys, 'tracebacklimit'): limit = sys.tracebacklimit n = 0 eline = 'n' while exceptionTraceback is not None and (limit is None or n < limit): f = exceptionTraceback.tb_frame lineno = exceptionTraceback.tb_lineno co = f.f_code filename = co.co_filename name = co.co_name eline += ' File "%s", line %d, in %s n ' % (filename, lineno, name) exceptionTraceback = exceptionTraceback.tb_next n = n + 1 eline += "n".join( traceback.format_exception_only(exceptionType, exceptionValue)) self.logger.error(eline) self.hdlr.flush()