def setup_logging(app, logfile, debug=False): cmdslog = TimedRotatingFileHandler(logfile, when='D', interval=1, backupCount=7) if debug: env = logging.DEBUG cmdslog.setFormatter(logging.Formatter( "%(name)s: [%(levelname)s] %(filename)s:%(lineno)d - %(message)s")) else: env = logging.INFO cmdslog.setFormatter(logging.Formatter( "%(name)s: [%(levelname)s] %(message)s")) cmdslog.setLevel(env) logger = logging.getLogger(app) logger.setLevel(env) logger.addHandler(cmdslog) if os.path.exists('/dev/log'): st_mode = os.stat('/dev/log').st_mode if stat.S_ISSOCK(st_mode): syslog_h = SysLogHandler(address='/dev/log') syslog_h.set_name(app) logger.addHandler(syslog_h) return _log(app, logger)
def syslog_handler( host: Optional[str] = 'localhost', facility: Optional[str] = 'user', formatter: Optional[logging.Formatter] = None, # in 3.8 Literal[] could be used level: Optional[str] = 'INFO', name: Optional[str] = 'sh', port: Optional[int] = 514, # in 3.8 Literal[] could be used socktype: Optional[str] = 'UDP', ) -> SysLogHandler: """Return a configured instance of a syslog handler with sane defaults. Args: host: The syslog hostname/ip. facility: The syslog facility. formatter: A logging formatter to format logging handler. Defaults to a sane formatter with module/lineno. level: The logging level for the handler. name: The handler name. port: The syslog port. socktype: The socket type. Either TCP or UDP. Returns: SyslogHandler: A configured instance of the SyslogHandler. """ # build address from host and port address = (host, int(port)) # set socktype if socktype.upper() == 'TCP': socktype = socket.SOCK_STREAM elif socktype.upper() == 'UDP': socktype = socket.SOCK_DGRAM # default else: # pragma: no cover raise RuntimeError(f'{socktype} is not a valid socktype.') # create the handler lh = SysLogHandler(address=address, facility=facility, socktype=socktype) lh.setLevel(get_level(level.upper())) if formatter is None: formatter = logging.Formatter( '%(asctime)s - %(name)s - %(levelname)s - %(message)s ' '[%(module)s:%(funcName)s:%(lineno)d]') lh.setFormatter(formatter) lh.set_name(name) return lh
def setup_logging(app, logfile, debug=True): old_factory = logging.getLogRecordFactory() def spell_record_factory(*args, **kwargs): record = old_factory(*args, **kwargs) if record.name != 'conjure-up': record.filename = '{}: {}'.format(record.name, record.filename) spell_name = app.config.get('spell', consts.UNSPECIFIED_SPELL) record.name = 'conjure-up/{}'.format(spell_name) return record logging.setLogRecordFactory(spell_record_factory) cmdslog = TimedRotatingFileHandler(logfile, when='D', interval=1, backupCount=7) cmdslog.setFormatter( logging.Formatter("%(asctime)s [%(levelname)s] %(name)s - " "%(filename)s:%(lineno)d - %(message)s")) root_logger = logging.getLogger() app_logger = logging.getLogger('conjure-up') if debug: app_logger.setLevel(logging.DEBUG) root_logger.setLevel(logging.DEBUG) else: # always use DEBUG level for app, for now app_logger.setLevel(logging.DEBUG) root_logger.setLevel(logging.INFO) root_logger.addHandler(cmdslog) if os.path.exists('/dev/log'): st_mode = os.stat('/dev/log').st_mode if stat.S_ISSOCK(st_mode): syslog_h = SysLogHandler(address='/dev/log') syslog_h.set_name('conjure-up') app_logger.addHandler(syslog_h) return app_logger