# log-console-file.py. import logging import sys #from pathlib import Path log_file = './log.file' format = '%(filename)s:%(lineno)d %(name)s:%(levelname)7s - %(message)s' # Equivalent of '%(module)s)' format string. #logger_name = Path( Path( __file__ ).name ).stem # logger_name = '/Effect of logger level/' log = logging.getLogger( logger_name ) def show_log_file(): print( f'\n# Contents of {log_file} ...' ) with open( log_file, 'r', encoding = 'utf-8', errors = 'strict' ) as fh: for line in fh: print( line, end = '' ) return def set_handler( console_level, file_level ): # Default is "sys.stderr". stream_handler = logging.StreamHandler( sys.stdout ) print( f'# Setting stream_handler level to {console_level}' ) stream_handler.setLevel( console_level ) file_handler = logging.FileHandler( log_file, mode = 'w' ) print( f'# Setting file_handler level to {file_level}' ) file_handler.setLevel( file_level ) for handler in [ stream_handler, file_handler ]: handler.setFormatter( logging.Formatter( format ) ) log.addHandler( handler ) return def remove_handler(): if log.hasHandlers: log.handlers = list() return for level in [ logging.DEBUG, logging.INFO, logging.WARNING, logging.ERROR ]: set_handler( logging.DEBUG, logging.INFO ) print( f'# With log level {level} ...' ) log.setLevel( level ) log.debug( 'Debug until cannot debug no more' ) log.info( 'Here, have some info' ) log.warning( 'Oh Nose!' ) log.error( 'BREAK GLASS!' ) show_log_file() print( '- -' * 10 ) remove_handler()