Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Debug logs duplication due to incorrect configuration #3944

Open
nkhitrov opened this issue Jan 18, 2025 · 1 comment
Open

Debug logs duplication due to incorrect configuration #3944

nkhitrov opened this issue Jan 18, 2025 · 1 comment

Comments

@nkhitrov
Copy link

nkhitrov commented Jan 18, 2025

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()
@getsantry getsantry bot moved this to Waiting for: Product Owner in GitHub Issues with 👀 3 Jan 18, 2025
@szokeasaurusrex
Copy link
Member

Good idea @nkhitrov

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
Status: No status
Development

No branches or pull requests

2 participants