diff --git a/.changes/unreleased/Fixes-20230208-154935.yaml b/.changes/unreleased/Fixes-20230208-154935.yaml new file mode 100644 index 00000000000..8b3d30242ce --- /dev/null +++ b/.changes/unreleased/Fixes-20230208-154935.yaml @@ -0,0 +1,6 @@ +kind: Fixes +body: Always flush stdout after logging +time: 2023-02-08T15:49:35.175874-05:00 +custom: + Author: peterallenwebb + Issue: "6901" diff --git a/core/dbt/events/eventmgr.py b/core/dbt/events/eventmgr.py index 10bf225bef7..c9c534aa70b 100644 --- a/core/dbt/events/eventmgr.py +++ b/core/dbt/events/eventmgr.py @@ -88,41 +88,40 @@ def __init__(self, event_manager: "EventManager", config: LoggerConfig) -> None: self.level: EventLevel = config.level self.event_manager: EventManager = event_manager self._python_logger: Optional[logging.Logger] = config.logger - self._stream: Optional[TextIO] = config.output_stream + + if config.output_stream is not None: + stream_handler = logging.StreamHandler(config.output_stream) + self._python_logger = self._get_python_log_for_handler(stream_handler) if config.output_file_name: - log = logging.getLogger(config.name) - log.setLevel(_log_level_map[config.level]) - handler = RotatingFileHandler( + file_handler = RotatingFileHandler( filename=str(config.output_file_name), encoding="utf8", maxBytes=10 * 1024 * 1024, # 10 mb backupCount=5, ) + self._python_logger = self._get_python_log_for_handler(file_handler) - handler.setFormatter(logging.Formatter(fmt="%(message)s")) - log.handlers.clear() - log.addHandler(handler) - - self._python_logger = log + def _get_python_log_for_handler(self, handler: logging.Handler): + log = logging.getLogger(self.name) + log.setLevel(_log_level_map[self.level]) + handler.setFormatter(logging.Formatter(fmt="%(message)s")) + log.handlers.clear() + log.addHandler(handler) + return log def create_line(self, msg: EventMsg) -> str: raise NotImplementedError() def write_line(self, msg: EventMsg): line = self.create_line(msg) - python_level = _log_level_map[EventLevel(msg.info.level)] if self._python_logger is not None: send_to_logger(self._python_logger, msg.info.level, line) - elif self._stream is not None and _log_level_map[self.level] <= python_level: - self._stream.write(line + "\n") def flush(self): if self._python_logger is not None: for handler in self._python_logger.handlers: handler.flush() - elif self._stream is not None: - self._stream.flush() class _TextLogger(_Logger):