def test_guess_message_level(msg): setup_logging(capture_print=True, guess_level=True) level, msg = msg print(msg) log_data = log.read_text().splitlines()[-1].lower() assert log_data.count(level) == 2
def test_basic_function(capsys): setup_logging() logger.debug('my debug') logger.info('my info') logger.warning('my warning') logger.error('my error') logger.critical('the market crashed') # check stdout captured = capsys.readouterr() stdout_data = captured.out assert 'my debug' not in stdout_data assert 'my info' in stdout_data assert 'my warning' in stdout_data assert 'my error' in stdout_data assert 'the market crashed' in stdout_data # check log.txt log_data = log.read_text() assert 'my debug' in log_data assert 'my info' in log_data assert 'my warning' in log_data assert 'my error' in log_data assert 'the market crashed' in log_data
def test_double_setup_logging(): # there should be a warning if setup_logging() is called multiple times with setup_logging() as log_config: with setup_logging() as log_config: pass log_data = log.read_text() assert "WARNING" in log_data
def test_capture_print_strict(capsys): setup_logging(capture_print=True, strict=True) print('This is my print') sys.stdout.write('This should be printed normally too') stdout_data = capsys.readouterr().out log_data = log.read_text() assert re.search('.*INFO.*This is my print', stdout_data) assert re.search('.*INFO.*This is my print', log_data) assert re.search('.*INFO.*This should be printed normally too', stdout_data) assert re.search('.*INFO.*This should be printed normally too', log_data)
def test_default_logger_submodule(): with setup_logging(): from tests.sub_module import run run() log_data = log.read_text() assert len(re.findall(r"tests.sub_module:\d+ INFO", log_data)) == 2
def test_suppress_logger2(capsys): # suppress by the code with setup_logging(suppress=['suppressed_logger']): logger = getLogger('suppressed_logger') logger.info('Ha ha, this should not be logged') stdout_data = capsys.readouterr().out assert 'INFO' not in stdout_data
def test_suppress_logger(capsys, level): setup_logging(suppress_level_below=level) from tests.exchangelib_logger import fox_run fox_run() stdout_data = capsys.readouterr().out assert 'DEBUG' not in stdout_data assert 'INFO' not in stdout_data if level == logging.WARNING: assert 'WARNING' in stdout_data elif level == logging.ERROR: assert 'WARNING' not in stdout_data assert 'ERROR' in stdout_data assert 'CRITICAL' in stdout_data
def test_default_logger_suppress(): with setup_logging() as log_config: from tests.sub_module import run log_config.suppress_loggers(['tests.sub_module']) run() log_data = log.read_text() assert len(re.findall(r"tests.sub_module:\d+ INFO", log_data)) == 0
def test_capture_print_not_strict(capsys): with setup_logging(capture_print=True): print('This is my print') sys.stdout.write('\n') sys.stdout.write('This should be printed normally') stdout_data = capsys.readouterr().out log_data = log.read_text() assert re.search('.*INFO.*This is my print', stdout_data) assert re.search('.*INFO.*This is my print', log_data) assert 'This should be printed normally' in stdout_data assert not re.search('.*INFO.*This should be printed normally', stdout_data) assert 'This should be printed normally' not in log_data
def test_default_logger(capsys): with setup_logging(): my_logger.debug('debug') my_logger.info('info') my_logger.warning('warning') my_logger.error('error') my_logger.critical('critical') stdout_data = capsys.readouterr().out assert 'debug' not in stdout_data assert 'info' in stdout_data assert 'warning' in stdout_data assert 'error' in stdout_data assert 'critical' in stdout_data log_data = log.read_text() assert re.search(r'test_simple:\d+.+debug', log_data) assert re.search(r'test_simple:\d+.+info', log_data) assert re.search(r'test_simple:\d+.+warning', log_data) assert re.search(r'test_simple:\d+.+error', log_data) assert re.search(r'test_simple:\d+.+critical', log_data)
def test_logging_disabled(capsys): with setup_logging(): logger.info('Secret process starts') with logging_disabled(): logger.debug('debug') logger.info('info') logger.warning('warning') logger.error('error') logger.critical('critical') logger.info('Secret process finished') stdout_data = capsys.readouterr().out assert 'debug' not in stdout_data assert 'info' not in stdout_data assert 'warning' not in stdout_data assert 'error' not in stdout_data assert 'critical' not in stdout_data log_data = log.read_text() assert 'debug' not in log_data assert 'info' not in log_data assert 'warning' not in log_data assert 'error' not in log_data assert 'critical' not in log_data
import time import sys from random import randint from multiprocessing import Process from logger_tt import setup_logging from logging import getLogger __author__ = "Duc Tin" logger = getLogger(__name__) setup_logging(use_multiprocessing=True) def worker(arg): logger.info(f'child process {arg}: started') time.sleep(randint(1, 5) / 10) logger.info(f'child process {arg}: stopped') if __name__ == '__main__': if len(sys.argv) > 1: proc_no = int(sys.argv[1]) else: proc_no = 7 all_processes = [] logger.info('Parent process is ready to spawn child') for i in range(proc_no): p = Process(target=worker, args=(i, )) all_processes.append(p) p.daemon = True
import sys from logger_tt import setup_logging from logging import getLogger __author__ = "Duc Tin" setup_logging(full_context=int(sys.argv[1])) logger = getLogger(__name__) class Base: def __init__(self): self.name = 'Nested dot' class Dummy: def __init__(self): self.value = 3 self.divisor = 0 self.base = Base() def details(self, arg): print(f'{self.value} {self.non_exist} {self.base.name}') def __str__(self): return 'Dummy(my dummy class)' def my_function(var_in, *arg, **kwargs): my_local_var = 345 var_in.details(my_local_var)
from logging import getLogger from logger_tt import setup_logging __author__ = "Duc Tin" setup_logging(capture_print=True) logger = getLogger(__name__) class Dummy: def __str__(self): return f"Ahahaha\n ehehe \n lalala" class Tummy: def __init__(self): self.dummy = Dummy() def aloha(a): b = Dummy() c = b / a.dummy if __name__ == '__main__': a = Tummy() aloha(a)
from logger_tt import setup_logging from logging import getLogger __author__ = "Duc Tin" setup_logging(full_context=1) logger = getLogger(__name__) class Dummy: def __init__(self): self.value = 3 self.divisor = 0 def __str__(self): return 'Dummy(my dummy class)' def my_function(var_in, *arg, **kwargs): my_local_var = 345 raise RuntimeError if __name__ == '__main__': a = Dummy() my_function(a, 456, 789, my_kw='hello', another_kw='world')
from logger_tt import setup_logging from logging import getLogger __author__ = "Duc Tin" setup_logging(full_context=True) logger = getLogger(__name__) class Base: def __init__(self): self.name = 'Nested dot' class Dummy: def __init__(self): self.value = 3 self.divisor = 0 self.base = Base() def details(self, arg): print(f'{self.value} {self.non_exist} {self.base.name}') def __str__(self): return 'Dummy(my dummy class)' def my_function(var_in, *arg, **kwargs): my_local_var = 345 var_in.details(my_local_var)
from logger_tt import setup_logging from logging import getLogger __author__ = "Duc Tin" setup_logging() logger = getLogger(__name__) class Dummy: def __init__(self): self.value = 3 self.divisor = 0 if __name__ == '__main__': a = Dummy() res = a.value / a.divisor print(res)
def test_multiprocessing_error(value): with pytest.raises(ValueError) as e: setup_logging(use_multiprocessing=value) assert f'Expected a bool or a multiprocessing start_method name, but got: {value}' in str(e)