def setup_console_logger(log_level='error', log_format=None, date_format=None): ''' Setup the console logger ''' if is_console_configured(): logging.getLogger(__name__).warning('Console logging already configured') return # Remove the temporary logging handler __remove_temp_logging_handler() if log_level is None: log_level = 'warning' level = LOG_LEVELS.get(log_level.lower(), logging.ERROR) setLogRecordFactory(SaltColorLogRecord) handler = None for handler in logging.root.handlers: if handler is LOGGING_STORE_HANDLER: continue if not hasattr(handler, 'stream'): # Not a stream handler, continue continue if handler.stream is sys.stderr: # There's already a logging handler outputting to sys.stderr break else: handler = StreamHandler(sys.stderr) handler.setLevel(level) # Set the default console formatter config if not log_format: log_format = '[%(levelname)-8s] %(message)s' if not date_format: date_format = '%H:%M:%S' formatter = logging.Formatter(log_format, datefmt=date_format) handler.setFormatter(formatter) logging.root.addHandler(handler) global __CONSOLE_CONFIGURED global __LOGGING_CONSOLE_HANDLER __CONSOLE_CONFIGURED = True __LOGGING_CONSOLE_HANDLER = handler
return __MP_LOGGING_LISTENER_CONFIGURED def is_mp_logging_configured(): return __MP_LOGGING_LISTENER_CONFIGURED def is_extended_logging_configured(): return __EXTERNAL_LOGGERS_CONFIGURED # Store a reference to the temporary queue logging handler LOGGING_NULL_HANDLER = TemporaryLoggingHandler(logging.WARNING) # Store a reference to the temporary console logger LOGGING_TEMP_HANDLER = StreamHandler(sys.stderr) # Store a reference to the "storing" logging handler LOGGING_STORE_HANDLER = TemporaryLoggingHandler() class SaltLogQueueHandler(QueueHandler): pass class SaltLogRecord(logging.LogRecord): def __init__(self, *args, **kwargs): logging.LogRecord.__init__(self, *args, **kwargs) # pylint: disable=E1321 self.bracketname = '[%-17s]' % self.name self.bracketlevel = '[%-8s]' % self.levelname
def test_exc_info_on_loglevel(self): def raise_exception_on_purpose(): 1 / 0 # pylint: disable=pointless-statement log = saltlog.SaltLoggingClass(__name__) # Only stream2 should contain the traceback stream1 = StringIO() stream2 = StringIO() handler1 = StreamHandler(stream1) handler2 = StreamHandler(stream2) handler1.setLevel(logging.INFO) handler2.setLevel(logging.DEBUG) log.addHandler(handler1) log.addHandler(handler2) try: raise_exception_on_purpose() except ZeroDivisionError as exc: log.error('Exception raised on purpose caught: ZeroDivisionError', exc_info_on_loglevel=logging.DEBUG) try: self.assertIn( 'Exception raised on purpose caught: ZeroDivisionError', stream1.getvalue()) self.assertNotIn('Traceback (most recent call last)', stream1.getvalue()) self.assertIn( 'Exception raised on purpose caught: ZeroDivisionError', stream2.getvalue()) self.assertIn('Traceback (most recent call last)', stream2.getvalue()) finally: log.removeHandler(handler1) log.removeHandler(handler2) # Both streams should contain the traceback stream1 = StringIO() stream2 = StringIO() handler1 = StreamHandler(stream1) handler2 = StreamHandler(stream2) handler1.setLevel(logging.INFO) handler2.setLevel(logging.DEBUG) log.addHandler(handler1) log.addHandler(handler2) try: raise_exception_on_purpose() except ZeroDivisionError as exc: log.error('Exception raised on purpose caught: ZeroDivisionError', exc_info_on_loglevel=logging.INFO) try: self.assertIn( 'Exception raised on purpose caught: ZeroDivisionError', stream1.getvalue()) self.assertIn('Traceback (most recent call last)', stream1.getvalue()) self.assertIn( 'Exception raised on purpose caught: ZeroDivisionError', stream2.getvalue()) self.assertIn('Traceback (most recent call last)', stream2.getvalue()) finally: log.removeHandler(handler1) log.removeHandler(handler2) # No streams should contain the traceback stream1 = StringIO() stream2 = StringIO() handler1 = StreamHandler(stream1) handler2 = StreamHandler(stream2) handler1.setLevel(logging.ERROR) handler2.setLevel(logging.INFO) log.addHandler(handler1) log.addHandler(handler2) try: raise_exception_on_purpose() except ZeroDivisionError as exc: log.error('Exception raised on purpose caught: ZeroDivisionError', exc_info_on_loglevel=logging.DEBUG) try: self.assertIn( 'Exception raised on purpose caught: ZeroDivisionError', stream1.getvalue()) self.assertNotIn('Traceback (most recent call last)', stream1.getvalue()) self.assertIn( 'Exception raised on purpose caught: ZeroDivisionError', stream2.getvalue()) self.assertNotIn('Traceback (most recent call last)', stream2.getvalue()) finally: log.removeHandler(handler1) log.removeHandler(handler2)
def test_exc_info_on_loglevel(self): def raise_exception_on_purpose(): 1/0 # pylint: disable=pointless-statement log = saltlog.SaltLoggingClass(__name__) # Only stream2 should contain the traceback stream1 = StringIO() stream2 = StringIO() handler1 = StreamHandler(stream1) handler2 = StreamHandler(stream2) handler1.setLevel(logging.INFO) handler2.setLevel(logging.DEBUG) log.addHandler(handler1) log.addHandler(handler2) try: raise_exception_on_purpose() except ZeroDivisionError as exc: log.error('Exception raised on purpose caught: ZeroDivisionError', exc_info_on_loglevel=logging.DEBUG) try: self.assertIn( 'Exception raised on purpose caught: ZeroDivisionError', stream1.getvalue() ) self.assertNotIn('Traceback (most recent call last)', stream1.getvalue()) self.assertIn( 'Exception raised on purpose caught: ZeroDivisionError', stream2.getvalue() ) self.assertIn('Traceback (most recent call last)', stream2.getvalue()) finally: log.removeHandler(handler1) log.removeHandler(handler2) # Both streams should contain the traceback stream1 = StringIO() stream2 = StringIO() handler1 = StreamHandler(stream1) handler2 = StreamHandler(stream2) handler1.setLevel(logging.INFO) handler2.setLevel(logging.DEBUG) log.addHandler(handler1) log.addHandler(handler2) try: raise_exception_on_purpose() except ZeroDivisionError as exc: log.error('Exception raised on purpose caught: ZeroDivisionError', exc_info_on_loglevel=logging.INFO) try: self.assertIn( 'Exception raised on purpose caught: ZeroDivisionError', stream1.getvalue() ) self.assertIn('Traceback (most recent call last)', stream1.getvalue()) self.assertIn( 'Exception raised on purpose caught: ZeroDivisionError', stream2.getvalue() ) self.assertIn('Traceback (most recent call last)', stream2.getvalue()) finally: log.removeHandler(handler1) log.removeHandler(handler2) # No streams should contain the traceback stream1 = StringIO() stream2 = StringIO() handler1 = StreamHandler(stream1) handler2 = StreamHandler(stream2) handler1.setLevel(logging.ERROR) handler2.setLevel(logging.INFO) log.addHandler(handler1) log.addHandler(handler2) try: raise_exception_on_purpose() except ZeroDivisionError as exc: log.error('Exception raised on purpose caught: ZeroDivisionError', exc_info_on_loglevel=logging.DEBUG) try: self.assertIn( 'Exception raised on purpose caught: ZeroDivisionError', stream1.getvalue() ) self.assertNotIn('Traceback (most recent call last)', stream1.getvalue()) self.assertIn( 'Exception raised on purpose caught: ZeroDivisionError', stream2.getvalue() ) self.assertNotIn('Traceback (most recent call last)', stream2.getvalue()) finally: log.removeHandler(handler1) log.removeHandler(handler2)