diff --git a/freqtrade/loggers/__init__.py b/freqtrade/loggers/__init__.py index 5753ad825..bb29f2403 100644 --- a/freqtrade/loggers/__init__.py +++ b/freqtrade/loggers/__init__.py @@ -4,14 +4,17 @@ from logging.handlers import RotatingFileHandler, SysLogHandler from pathlib import Path from rich.console import Console -from rich.logging import RichHandler from freqtrade.constants import Config from freqtrade.exceptions import OperationalException from freqtrade.loggers.buffering_handler import FTBufferingHandler +from freqtrade.loggers.ft_rich_handler import FtRichHandler from freqtrade.loggers.set_log_levels import set_loggers +# from freqtrade.loggers.std_err_stream_handler import FTStdErrStreamHandler + + logger = logging.getLogger(__name__) LOGFORMAT = "%(asctime)s - %(name)s - %(levelname)s - %(message)s" @@ -37,13 +40,16 @@ def setup_logging_pre() -> None: logging handlers after the real initialization, because we don't know which ones the user desires beforehand. """ - rh = RichHandler(console=error_console) + rh = FtRichHandler(console=error_console) rh.setFormatter(Formatter("%(message)s")) logging.basicConfig( level=logging.INFO, format=LOGFORMAT, - # handlers=[FTStdErrStreamHandler(), bufferHandler] - handlers=[rh, bufferHandler], + handlers=[ + # FTStdErrStreamHandler(), + rh, + bufferHandler, + ], ) diff --git a/freqtrade/loggers/ft_rich_handler.py b/freqtrade/loggers/ft_rich_handler.py new file mode 100644 index 000000000..184273b5c --- /dev/null +++ b/freqtrade/loggers/ft_rich_handler.py @@ -0,0 +1,33 @@ +from datetime import datetime +from logging import Handler +from typing import Any + +from rich.text import Text + + +class FtRichHandler(Handler): + def __init__(self, console, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self._console = console + + def emit(self, record): + try: + msg = self.format(record) + # Format log message + log_time = Text( + datetime.fromtimestamp(record.created).strftime("%Y-%m-%d %H:%M:%S,%f")[:-3], + style="gray46", + ) + name = Text(record.name) + log_level = Text(record.levelname, style=f"logging.level.{record.levelname.lower()}") + gray_sep = Text(" - ", style="gray46") + + self._console.print( + Text() + log_time + gray_sep + name + gray_sep + log_level + gray_sep + msg + ) + + self.flush() + except RecursionError: + raise + except Exception: + self.handleError(record) diff --git a/freqtrade/optimize/hyperopt/hyperopt.py b/freqtrade/optimize/hyperopt/hyperopt.py index 253691d4a..ae493d95f 100644 --- a/freqtrade/optimize/hyperopt/hyperopt.py +++ b/freqtrade/optimize/hyperopt/hyperopt.py @@ -16,11 +16,11 @@ from typing import Any import rapidjson from joblib import Parallel, cpu_count, delayed, wrap_non_picklable_objects from joblib.externals import cloudpickle -from rich.console import Console from freqtrade.constants import FTHYPT_FILEVERSION, LAST_BT_RESULT_FN, Config from freqtrade.enums import HyperoptState from freqtrade.exceptions import OperationalException +from freqtrade.loggers import error_console from freqtrade.misc import file_dump_json, plural from freqtrade.optimize.hyperopt.hyperopt_logger import logging_mp_handle, logging_mp_setup from freqtrade.optimize.hyperopt.hyperopt_optimizer import HyperOptimizer @@ -281,13 +281,13 @@ class Hyperopt: with Parallel(n_jobs=config_jobs) as parallel: jobs = parallel._effective_n_jobs() logger.info(f"Effective number of parallel workers used: {jobs}") - console = Console( - color_system="auto" if self.print_colorized else None, - ) + # console = Console( + # color_system="auto" if self.print_colorized else None, + # ) # Define progressbar with get_progress_tracker( - console=console, + console=error_console, cust_callables=[self._hyper_out], ) as pbar: task = pbar.add_task("Epochs", total=self.total_epochs)