Skip to content

Debug logs duplication due to incorrect configuration #3944

Open
@nkhitrov

Description

@nkhitrov

How do you use Sentry?

Self-hosted/on-premise

Version

2.19.2

Steps to Reproduce

Sentry duplicates log records when you set debug mode via sentry_sdk.init() and configure handler in root logger only.

In my project I use structlog so full code example with it

import logging
import sys

import structlog

LOG_LEVEL = logging.DEBUG


def remove_processors_meta(
    _,
    __,
    event_dict,
):
    del event_dict["_record"]
    del event_dict["_from_structlog"]
    event_dict.pop("positional_args", None)
    return event_dict


structlog.configure_once(
    processors=[
        structlog.stdlib.ProcessorFormatter.wrap_for_formatter,
    ],
    logger_factory=structlog.stdlib.LoggerFactory(),
    wrapper_class=structlog.stdlib.BoundLogger,
    cache_logger_on_first_use=True,
)
formatter = structlog.stdlib.ProcessorFormatter(
    pass_foreign_args=True,
    processors=[
        structlog.stdlib.add_logger_name,
        structlog.stdlib.add_log_level,
        structlog.processors.TimeStamper(fmt="%Y-%m-%d %H:%M:%S", utc=True),
        structlog.dev.set_exc_info,
        remove_processors_meta,
        structlog.dev.ConsoleRenderer(
            event_key="message",
            exception_formatter=structlog.dev.better_traceback,
        ),
    ],
)

handler = logging.StreamHandler(stream=sys.stdout)
handler.setFormatter(formatter)

root_logger = logging.getLogger()
root_logger.addHandler(handler)
root_logger.setLevel(LOG_LEVEL)


l = logging.getLogger(__name__)
l.info("test1", extra={"extra": "one"})

import sentry_sdk  # must be after configuration of logging and structlog
from sentry_sdk.utils import logger

sentry_sdk.init("https://123@localhost/1", debug=True)

Expected Result

Sentry does not write log records via own stream handler and use parent (root) logger configuration

Output:

2025-01-18 06:44:33 [info     ] [__main__] event=test1
2025-01-18 06:44:33 [debug    ] [sentry_sdk.errors] event=Setting up integrations (with default = True)
2025-01-18 06:44:33 [debug    ] [sentry_sdk.errors] event=Did not import default integration sentry_sdk.integrations.anthropic.AnthropicIntegration: Anthropic not installed
Image

Actual Result

Output:

 [sentry] DEBUG: Setting up integrations (with default = True)
2025-01-18 06:11:54 [debug    ] Setting up integrations (with default = True) [sentry_sdk.errors] func_name=setup_integrations module=__init__ pathname=/<...>/.venv/lib/python3.11/site-packages/sentry_sdk/integrations/__init__.py process=69509 process_name=MainProcess thread=8643448640 thread_name=MainThread
Image

Possible fix

In debug.py we should change configuration check and use special logger method to check parent handlers too

from this

def init_debug_support():
    # type: () -> None
    if not logger.handlers:
        configure_logger()

to this

def init_debug_support():
    # type: () -> None

    if not logger.hasHandlers():  # check parent handlers
        configure_logger()

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    Status

    No status

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions