Skip to content

Commit 328b136

Browse files
committed
add attach to existing logger feature
1 parent e155078 commit 328b136

File tree

6 files changed

+113
-4
lines changed

6 files changed

+113
-4
lines changed

README.md

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,38 @@ logger.send_log(
5353
)
5454
```
5555

56+
### 🔌 Attaching to Existing logging.loggers
57+
58+
Want to supercharge your existing logger with Telegram powers? We've got you covered! Use the `attach_to_logger` function to add Telegram logging to any logger instance:
59+
60+
```python
61+
import logging
62+
from telegram_logger_client import attach_to_logger
63+
64+
# Basic configuration for console output
65+
logging.basicConfig(level=logging.DEBUG)
66+
67+
# Create your logger
68+
logger = logging.getLogger("your_logger_name")
69+
70+
# Set up Telegram logging
71+
attach_to_logger(logger)
72+
73+
# Use the logger as usual
74+
logger.info("This will be sent to Telegram Logger and output to stdout")
75+
```
76+
77+
The `attach_to_logger` function is like a magic wand that adds Telegram logging capabilities to your existing logger. It takes care of all the behind-the-scenes work, so you can focus on what really matters - logging your heart out!
78+
79+
Parameters for `attach_to_logger`:
80+
81+
- `logger`: Your existing logger instance (required)
82+
- `base_url`: The URL where your Telegram Logger service lives (optional if set in environment)
83+
- `x_id`: Your secret Telegram Logger handshake (optional if set in environment)
84+
- `level`: Set a specific logging level for Telegram logging (optional)
85+
86+
Don't forget to set your `TELEGRAM_LOGGER_BASE_URL` and `TELEGRAM_LOGGER_X_ID` environment variables, or pass them directly to `attach_to_logger`. Now go forth and log like a boss! 🚀📝
87+
5688
### 🖥️ Command Line Magic
5789

5890
First, set up your secret lair:

telegram_logger_client/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
1-
from .telegram_logger_client import TelegramLoggerClient
1+
from ._telegram_logger_client import TelegramLoggerClient
2+
from ._logging_handler import attach_to_logger

telegram_logger_client/__main__.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
import os
44
import sys
55
import logging
6-
from .telegram_logger_client import TelegramLoggerClient
6+
from ._telegram_logger_client import TelegramLoggerClient
7+
from ._constants import ENV_VAR_TELEGRAM_LOGGER_BASE_URL, ENV_VAR_TELEGRAM_LOGGER_X_ID
78

89

910
def setup_logging(debug=False):
@@ -47,8 +48,8 @@ def main():
4748
logger.debug(f"Parsed arguments: {args}")
4849

4950
# Get base_url and x_id from environment variables or command-line arguments
50-
base_url = args.base_url or os.environ.get("TELEGRAM_LOGGER_BASE_URL")
51-
x_id = args.x_id or os.environ.get("TELEGRAM_LOGGER_X_ID")
51+
base_url = args.base_url or os.environ.get(ENV_VAR_TELEGRAM_LOGGER_BASE_URL)
52+
x_id = args.x_id or os.environ.get(ENV_VAR_TELEGRAM_LOGGER_X_ID)
5253

5354
logger.debug(f"Base URL: {base_url}")
5455
logger.debug(
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
ENV_VAR_TELEGRAM_LOGGER_BASE_URL = "TELEGRAM_LOGGER_BASE_URL"
2+
ENV_VAR_TELEGRAM_LOGGER_X_ID = "TELEGRAM_LOGGER_X_ID"
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
import logging
2+
import os
3+
from typing import Optional
4+
from ._telegram_logger_client import TelegramLoggerClient
5+
from ._constants import (
6+
ENV_VAR_TELEGRAM_LOGGER_BASE_URL,
7+
ENV_VAR_TELEGRAM_LOGGER_X_ID,
8+
)
9+
10+
11+
class TelegramLoggerHandler(logging.Handler):
12+
def __init__(self, base_url: str, x_id: str, *args, **kwargs):
13+
super(TelegramLoggerHandler, self).__init__(*args, **kwargs)
14+
self.client = TelegramLoggerClient(base_url, x_id)
15+
16+
def emit(self, record):
17+
try:
18+
message = record.getMessage()
19+
data = {
20+
"file": f"{record.pathname}:{record.lineno}",
21+
}
22+
if record.exc_info:
23+
data["exception"] = self.formatter.formatException(record.exc_info)
24+
25+
self.client.send_log(
26+
caller=record.name,
27+
level=record.levelname.lower(),
28+
message=message,
29+
error=record.exc_text if record.exc_info else None,
30+
request_id=getattr(record, "request_id", None),
31+
trace_id=getattr(record, "trace_id", None),
32+
span_id=getattr(record, "span_id", None),
33+
data=data,
34+
)
35+
except Exception as e:
36+
self.handleError(record)
37+
38+
39+
class TelegramLogFormatter(logging.Formatter):
40+
def format(self, record):
41+
# This formatter is now only used for console output, if needed
42+
return super().format(record)
43+
44+
45+
def attach_to_logger(
46+
logger: logging.Logger,
47+
base_url: Optional[str] = None,
48+
x_id: Optional[str] = None,
49+
level: Optional[int] = None,
50+
):
51+
"""
52+
Set up Telegram logging for an existing logger instance.
53+
:param logger: The logger instance to modify
54+
:param base_url: The base URL of the Telegram Logger service (optional)
55+
:param x_id: The X-ID token for authentication (optional)
56+
:param level: The logging level for the Telegram Logger handler (optional)
57+
"""
58+
base_url = base_url or os.environ.get(ENV_VAR_TELEGRAM_LOGGER_BASE_URL)
59+
x_id = x_id or os.environ.get(ENV_VAR_TELEGRAM_LOGGER_X_ID)
60+
61+
if not base_url or not x_id:
62+
raise ValueError(
63+
"Both base_url and x_id must be provided either as arguments or through environment variables."
64+
)
65+
66+
telegram_handler = TelegramLoggerHandler(base_url, x_id)
67+
telegram_handler.setFormatter(TelegramLogFormatter())
68+
69+
if level is not None:
70+
telegram_handler.setLevel(level)
71+
72+
logger.addHandler(telegram_handler)
73+
return logger
File renamed without changes.

0 commit comments

Comments
 (0)