Attaches to the logging module and captures log messages for each test.
| 654 | |
| 655 | |
| 656 | class LoggingPlugin: |
| 657 | """Attaches to the logging module and captures log messages for each test.""" |
| 658 | |
| 659 | def __init__(self, config: Config) -> None: |
| 660 | """Create a new plugin to capture log messages. |
| 661 | |
| 662 | The formatter can be safely shared across all handlers so |
| 663 | create a single one for the entire test session here. |
| 664 | """ |
| 665 | self._config = config |
| 666 | |
| 667 | # Report logging. |
| 668 | self.formatter = self._create_formatter( |
| 669 | get_option_ini(config, "log_format"), |
| 670 | get_option_ini(config, "log_date_format"), |
| 671 | get_option_ini(config, "log_auto_indent"), |
| 672 | ) |
| 673 | self.log_level = get_log_level_for_setting(config, "log_level") |
| 674 | self.caplog_handler = LogCaptureHandler() |
| 675 | self.caplog_handler.setFormatter(self.formatter) |
| 676 | self.report_handler = LogCaptureHandler() |
| 677 | self.report_handler.setFormatter(self.formatter) |
| 678 | |
| 679 | # File logging. |
| 680 | self.log_file_level = get_log_level_for_setting( |
| 681 | config, "log_file_level", "log_level" |
| 682 | ) |
| 683 | log_file = get_option_ini(config, "log_file") or os.devnull |
| 684 | if log_file != os.devnull: |
| 685 | directory = os.path.dirname(os.path.abspath(log_file)) |
| 686 | if not os.path.isdir(directory): |
| 687 | os.makedirs(directory) |
| 688 | |
| 689 | self.log_file_mode = get_option_ini(config, "log_file_mode") or "w" |
| 690 | self.log_file_handler = _FileHandler( |
| 691 | log_file, mode=self.log_file_mode, encoding="UTF-8" |
| 692 | ) |
| 693 | log_file_format = get_option_ini(config, "log_file_format", "log_format") |
| 694 | log_file_date_format = get_option_ini( |
| 695 | config, "log_file_date_format", "log_date_format" |
| 696 | ) |
| 697 | |
| 698 | log_file_formatter = DatetimeFormatter( |
| 699 | log_file_format, datefmt=log_file_date_format |
| 700 | ) |
| 701 | self.log_file_handler.setFormatter(log_file_formatter) |
| 702 | |
| 703 | # CLI/live logging. |
| 704 | self.log_cli_level = get_log_level_for_setting( |
| 705 | config, "log_cli_level", "log_level" |
| 706 | ) |
| 707 | if self._log_cli_enabled(): |
| 708 | terminal_reporter = config.pluginmanager.get_plugin("terminalreporter") |
| 709 | # Guaranteed by `_log_cli_enabled()`. |
| 710 | assert terminal_reporter is not None |
| 711 | capture_manager = config.pluginmanager.get_plugin("capturemanager") |
| 712 | # if capturemanager plugin is disabled, live logging still works. |
| 713 | self.log_cli_handler: ( |