Make logging setup consistent between redbot and redbot-setup (#6695)

Co-authored-by: Michael Oliveira <34169552+Flame442@users.noreply.github.com>
This commit is contained in:
Jakub Kuczys
2026-04-19 21:41:50 +02:00
committed by GitHub
parent 2ea4c766ad
commit 70faa8cd52
3 changed files with 40 additions and 26 deletions

View File

@@ -317,7 +317,10 @@ async def run_bot(red: Red, cli_flags: Namespace) -> None:
redbot.logging.init_logging( redbot.logging.init_logging(
level=cli_flags.logging_level, level=cli_flags.logging_level,
location=data_manager.core_data_path() / "logs", location=data_manager.core_data_path() / "logs",
cli_flags=cli_flags, rich_logging=cli_flags.rich_logging,
rich_tracebacks=cli_flags.rich_tracebacks,
rich_traceback_extra_lines=cli_flags.rich_traceback_extra_lines,
rich_traceback_show_locals=cli_flags.rich_traceback_show_locals,
) )
log.debug("====Basic Config====") log.debug("====Basic Config====")

View File

@@ -282,7 +282,20 @@ class RedRichHandler(RichHandler):
self.console.print(traceback) self.console.print(traceback)
def init_logging(level: int, location: pathlib.Path, cli_flags: argparse.Namespace) -> None: _FILE_FORMATTER = logging.Formatter(
"[{asctime}] [{levelname}] {name}: {message}", datefmt="%Y-%m-%d %H:%M:%S", style="{"
)
def init_logging(
level: int,
*,
location: Optional[pathlib.Path] = None,
rich_logging: Optional[bool] = None,
rich_tracebacks: bool = False,
rich_traceback_extra_lines: int = 0,
rich_traceback_show_locals: bool = False,
) -> None:
root_logger = logging.getLogger() root_logger = logging.getLogger()
root_logger.setLevel(level) root_logger.setLevel(level)
# DEBUG logging for discord.py is a bit too ridiculous :) # DEBUG logging for discord.py is a bit too ridiculous :)
@@ -312,24 +325,21 @@ def init_logging(level: int, location: pathlib.Path, cli_flags: argparse.Namespa
enable_rich_logging = False enable_rich_logging = False
if isatty(0) and cli_flags.rich_logging is None: if isatty(0) and rich_logging is None:
# Check if the bot thinks it has a active terminal. # Check if the bot thinks it has a active terminal.
enable_rich_logging = True enable_rich_logging = True
elif cli_flags.rich_logging is True: elif rich_logging is True:
enable_rich_logging = True enable_rich_logging = True
file_formatter = logging.Formatter(
"[{asctime}] [{levelname}] {name}: {message}", datefmt="%Y-%m-%d %H:%M:%S", style="{"
)
if enable_rich_logging is True: if enable_rich_logging is True:
rich_formatter = logging.Formatter("{message}", datefmt="[%X]", style="{") rich_formatter = logging.Formatter("{message}", datefmt="[%X]", style="{")
stdout_handler = RedRichHandler( stdout_handler = RedRichHandler(
rich_tracebacks=cli_flags.rich_tracebacks, rich_tracebacks=rich_tracebacks,
show_path=False, show_path=False,
highlighter=NullHighlighter(), highlighter=NullHighlighter(),
tracebacks_extra_lines=cli_flags.rich_traceback_extra_lines, tracebacks_extra_lines=rich_traceback_extra_lines,
tracebacks_show_locals=cli_flags.rich_traceback_show_locals, tracebacks_show_locals=rich_traceback_show_locals,
tracebacks_theme=( tracebacks_theme=(
PygmentsSyntaxTheme(FixedMonokaiStyle) PygmentsSyntaxTheme(FixedMonokaiStyle)
if rich_console.color_system == "truecolor" if rich_console.color_system == "truecolor"
@@ -339,11 +349,22 @@ def init_logging(level: int, location: pathlib.Path, cli_flags: argparse.Namespa
stdout_handler.setFormatter(rich_formatter) stdout_handler.setFormatter(rich_formatter)
else: else:
stdout_handler = logging.StreamHandler(sys.stdout) stdout_handler = logging.StreamHandler(sys.stdout)
stdout_handler.setFormatter(file_formatter) stdout_handler.setFormatter(_FILE_FORMATTER)
root_logger.addHandler(stdout_handler) root_logger.addHandler(stdout_handler)
logging.captureWarnings(True) logging.captureWarnings(True)
if location is not None:
init_file_logging(location)
if not enable_rich_logging and rich_tracebacks:
log.warning(
"Rich tracebacks were requested but they will not be enabled"
" as Rich logging is not active."
)
def init_file_logging(location: pathlib.Path) -> None:
if not location.exists(): if not location.exists():
location.mkdir(parents=True, exist_ok=True) location.mkdir(parents=True, exist_ok=True)
# Rotate latest logs to previous logs # Rotate latest logs to previous logs
@@ -379,12 +400,7 @@ def init_logging(level: int, location: pathlib.Path, cli_flags: argparse.Namespa
encoding="utf-8", encoding="utf-8",
) )
root_logger = logging.getLogger()
for fhandler in (latest_fhandler, all_fhandler): for fhandler in (latest_fhandler, all_fhandler):
fhandler.setFormatter(file_formatter) fhandler.setFormatter(_FILE_FORMATTER)
root_logger.addHandler(fhandler) root_logger.addHandler(fhandler)
if not enable_rich_logging and cli_flags.rich_tracebacks:
log.warning(
"Rich tracebacks were requested but they will not be enabled"
" as Rich logging is not active."
)

View File

@@ -14,6 +14,7 @@ from typing import Dict, Any, Optional, Union
import click import click
import redbot.logging
from redbot.core._cli import confirm from redbot.core._cli import confirm
from redbot.core.utils._internal_utils import ( from redbot.core.utils._internal_utils import (
safe_delete, safe_delete,
@@ -436,15 +437,9 @@ def cli(
overwrite_existing_instance: bool, overwrite_existing_instance: bool,
) -> None: ) -> None:
"""Create a new instance.""" """Create a new instance."""
level = cli_level_to_log_level(debug) level = cli_level_to_log_level(debug)
base_logger = logging.getLogger("red") redbot.logging.init_logging(level)
base_logger.setLevel(level)
formatter = logging.Formatter(
"[{asctime}] [{levelname}] {name}: {message}", datefmt="%Y-%m-%d %H:%M:%S", style="{"
)
stdout_handler = logging.StreamHandler(sys.stdout)
stdout_handler.setFormatter(formatter)
base_logger.addHandler(stdout_handler)
if ctx.invoked_subcommand is None: if ctx.invoked_subcommand is None:
basic_setup( basic_setup(