def log_some_messages(self, logger_name, q): thread = threading.get_ident() logger = logging.getLogger(logger_name) with context(thread=thread): logger.info("[thread=%r] outside message #%d", thread, 1) q.put( ("[thread=%r] outside message #1" % thread, {"thread": thread}) ) time.sleep(0.1) for i in range(1, 3): with context(scope="inner", num=i): logger.info( "[thread=%r] message in inner scope #%d", thread, i ) q.put( ( "[thread=%r] message in inner scope #%d" % (thread, i), {"thread": thread, "scope": "inner", "num": i}, ) ) time.sleep(0.1) logger.info("[thread=%r] outside message #%d", thread, 2) q.put( ("[thread=%r] outside message #2" % thread, {"thread": thread}) )
def process_lines(lines): for index, line in enumerate(lines): line = line.strip() with context(current_line=index + 1): log.debug("processing line: %s", line) if not line: log.error("empty line!") continue log.info("processed line: %s", line)
def process_files(filenames): log.debug("starting...") for filename in filenames: with context(current_file=filename): log.info("processing file: %s", filename) with open(filename, "r") as f: process_lines(f) log.info("processed file: %s", filename) log.debug("work is complete!")
def log_some_messages(self, logger_name): logger = logging.getLogger(logger_name) logger.info("outside message #%d", 1) with context(scope="outer"): logger.info("message in outer scope #%d", 1) for i in range(1, 3): with context(scope="inner", num=i): logger.info("message in inner scope #%d", i) logger.info("message in outer scope #%d", 2) logger.info("outside message #%d", 2) expected_output = [ ("outside message #1", {}), ("message in outer scope #1", {"scope": "outer"}), ("message in inner scope #1", {"scope": "inner", "num": 1}), ("message in inner scope #2", {"scope": "inner", "num": 2}), ("message in outer scope #2", {"scope": "outer"}), ("outside message #2", {}), ] return expected_output
def logging_context_of_the_test(self, request, initialized_context): with context(test=request.node.name): yield
if not line: log.error("empty line!") continue log.info("processed line: %s", line) def process_files(filenames): log.debug("starting...") for filename in filenames: with context(current_file=filename): log.info("processing file: %s", filename) with open(filename, "r") as f: process_lines(f) log.info("processed file: %s", filename) log.debug("work is complete!") if __name__ == "__main__": formatter = logging.Formatter( "%(current_file)s:%(current_line)s:%(levelname)s: %(message)s") handler = logging.StreamHandler(stream=sys.stdout) handler.setFormatter(formatter) handler.setLevel(logging.DEBUG) handler.addFilter(LoggingContextFilter()) # it's that simple logging.basicConfig(handlers=[handler], level=logging.DEBUG) with context(current_file="-", current_line="-"): # The context above sets default value, so that the formatter does # not crash, when they are not defined. process_files(sys.argv[1:])