structlog-sentry
| What | Where |
|---|---|
| Documentation | https://github.com/kiwicom/structlog-sentry |
| Maintainer | @kiwicom/platform |
Based on https://gist.github.com/hynek/a1f3f92d57071ebc5b91
Installation
Install the package with pip:
pip install structlog-sentry
Usage
This module is intended to be used with structlog like this:
import sentry_sdk
import structlog
from structlog_sentry import SentryProcessor
sentry_sdk.init() # pass dsn in argument or via SENTRY_DSN env variable
structlog.configure(
processors=[
structlog.stdlib.add_logger_name, # optional, must be placed before SentryProcessor()
structlog.stdlib.add_log_level, # required before SentryProcessor()
SentryProcessor(event_level=logging.ERROR),
],
logger_factory=structlog.stdlib.LoggerFactory(),
wrapper_class=structlog.stdlib.BoundLogger,
)
log = structlog.get_logger()
Do not forget to add the structlog.stdlib.add_log_level and optionally the
structlog.stdlib.add_logger_name processors before SentryProcessor. The
SentryProcessor class takes the following arguments:
levelEvents of this or higher levels will be reported as Sentry breadcrumbs. Default islogging.INFO.event_levelEvents of this or higher levels will be reported to Sentry as events. Default islogging.WARNING.activeA flag to make this processor enabled/disabled.as_contextSendevent_dictas extra info to Sentry. Default isTrue.ignore_breadcrumb_dataA list of data keys that will be excluded from breadcrumb data. Defaults to keys which are already sent separately, i.e.level,logger,eventandtimestamp. All other data inevent_dictwill be sent as breadcrumb data.tag_keysA list of keys. If any if these keys appear inevent_dict, the key and its corresponding value inevent_dictwill be used as Sentry event tags. use"__all__"to report all key/value pairs of event as tags.ignore_loggersA list of logger names to ignore any events from.verboseReport the action taken by the logger in theevent_dict. Default isFalse.scopeOptionally specifysentry_sdk.Client(instructlog-sentry<2.2this corresponds tohub: sentry_sdk.Hub).
Now events are automatically captured by Sentry with log.error():
try:
1/0
except ZeroDivisionError:
log.error("zero divsiion")
try:
resp = requests.get(f"https://api.example.com/users/{user_id}/")
resp.raise_for_status()
except RequestException:
log.error("request error", user_id=user_id)
This won't automatically collect sys.exc_info() along with the message, if you want
to enable this behavior, just pass exc_info=True.
When you want to use structlog's built-in
format_exc_info
processor, make that the SentryProcessor comes before format_exc_info!
Otherwise, the SentryProcessor won't have an exc_info to work with, because
it's removed from the event by format_exc_info.
Logging calls with no sys.exc_info() are also automatically captured by Sentry
either as breadcrumbs (if configured by the level argument) or as events:
log.info("info message", scope="accounts")
log.warning("warning message", scope="invoices")
log.error("error message", scope="products")
If you do not want to forward a specific logs into Sentry, you can pass the
sentry_skip=True optional argument to logger methods, like this:
log.error("error message", sentry_skip=True)
Sentry Tags
You can set some or all of key/value pairs of structlog event_dict as sentry tags:
structlog.configure(
processors=[
structlog.stdlib.add_logger_name,
structlog.stdlib.add_log_level,
SentryProcessor(event_level=logging.ERROR, tag_keys=["city", "timezone"]),
],...
)
log.error("error message", city="Tehran", timezone="UTC+3:30", movie_title="Some title")
this will report the error and the sentry event will have city and timezone tags.
If you want to have all event data as tags, create the SentryProcessor with tag_keys="__all__".
structlog.configure(
processors=[
structlog.stdlib.add_logger_name,
structlog.stdlib.add_log_level,
SentryProcessor(event_level=logging.ERROR, tag_keys="__all__"),
],...
)
Skip Context
By default SentryProcessor will send event_dict key/value pairs as contextual info to sentry.
Sometimes you may want to skip this, specially when sending the event_dict as sentry tags:
structlog.configure(
processors=[
structlog.stdlib.add_logger_name,
structlog.stdlib.add_log_level,
SentryProcessor(event_level=logging.ERROR, as_context=False, tag_keys="__all__"),
],...
)
Ignore specific loggers
If you want to ignore specific loggers from being processed by the SentryProcessor just pass
a list of loggers when instantiating the processor:
structlog.configure(
processors=[
structlog.stdlib.add_logger_name,
structlog.stdlib.add_log_level,
SentryProcessor(event_level=logging.ERROR, ignore_loggers=["some.logger"]),
],...
)
Logging as JSON
If you want to configure structlog to format the output as JSON (maybe for
elk-stack) you have to disable standard logging
integration in Sentry SDK by passing the LoggingIntegration(event_level=None, level=None)
instance to sentry_sdk.init method. This prevents duplication of an event reported to sentry:
from sentry_sdk.integrations.logging import LoggingIntegration
INTEGRATIONS = [
# ... other integrations
LoggingIntegration(event_level=None, level=None),
]
sentry_sdk.init(integrations=INTEGRATIONS)
This integration tells sentry_sdk to ignore standard logging and captures the events manually.
Testing
To run all tests:
tox
Contributing
Create a merge request and tag @kiwicom/platform for review.
Metadata
Release files for structlog-sentry 2.2.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| structlog_sentry-2.2.1.tar.gz | 6.9 kB | Without provenance | Details for structlog_sentry-2.2.1.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| structlog_sentry-2.2.1-py3-none-any.whl | Python 3 | none | any | Details for structlog_sentry-2.2.1-py3-none-any.whl |
Total release size: 18.1 kB
Release files / structlog_sentry-2.2.1.tar.gz
| Download URL | structlog_sentry-2.2.1.tar.gz |
|---|---|
| Size | 6.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
78cf8751c7712e361d9d5e82fcde6c3f692a67e3e67068ccdd46448014636138
|
|
BLAKE2b-256 checksum How to use checksums |
a9c8a6d66c4a691a47c9c572ab84640012bb70c8c4f710763bd544236d98f278
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/5.1.1 CPython/3.9.20
|
Release files / structlog_sentry-2.2.1-py3-none-any.whl
| Download URL | structlog_sentry-2.2.1-py3-none-any.whl |
|---|---|
| Size | 11.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
868c82348bc18b7d51ef8f878c57e82835c1758dba38f7589fa02a267096a95d
|
|
BLAKE2b-256 checksum How to use checksums |
e3ba1b1226db704c16426d59e1fcbeaf5138dbc5a50d424aab92b453d33add47
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/5.1.1 CPython/3.9.20
|
Security for structlog-sentry 2.2.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.