コード例 #1
0
 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})
         )
コード例 #2
0
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)
コード例 #3
0
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!")
コード例 #4
0
    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
コード例 #5
0
 def logging_context_of_the_test(self, request, initialized_context):
     with context(test=request.node.name):
         yield
コード例 #6
0
            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:])