Skip to content

Commit 717bde9

Browse files
committed
updated to use env variables passed in constructor
1 parent 559bbf9 commit 717bde9

File tree

5 files changed

+79
-153
lines changed

5 files changed

+79
-153
lines changed

README.md

Lines changed: 20 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,14 @@ Get the host & token by creating a new source at https://telemetry.betterstack.c
2222

2323
3. **Initialize once** in your main file
2424
```python
25-
from fewsats_logger.core import setup_logging
26-
setup_logging()
25+
import os
26+
from dotenv import load_dotenv
27+
from fewsats_logger.core import setup_logging
28+
29+
load_dotenv()
30+
setup_logging(env=os.environ.get("ENV", "dev"),
31+
host=os.environ.get("BETTER_STACK_HOST"),
32+
token=os.environ.get("BETTER_STACK_SOURCE_TOKEN"))
2733
```
2834

2935
4. **Use standard logging** anywhere in your code
@@ -52,43 +58,26 @@ That's it. Logs will appear in Better Stack dashboard and console.
5258

5359
```python
5460
logger.info("Processing order", extra={
55-
"order_id": "12345",
61+
"external_id": "12345",
5662
"customer_id": "67890"
5763
})
5864
```
5965

60-
### Integration Examples
61-
62-
#### FastAPI
66+
you can add it to multiple statements like this:
6367

6468
```python
65-
from fastapi import FastAPI
66-
from fewsats_logger import setup_logging
67-
68-
setup_logging()
69-
app = FastAPI()
70-
```
71-
72-
#### Flask
7369

74-
```python
75-
from flask import Flask
76-
from fewsats_logger import setup_logging
70+
with logtail.context(order={"external_id": "12345" }):
71+
logger.info('Processing order')
72+
# More code here ...
73+
logger.info('Done.')
7774

78-
setup_logging()
79-
app = Flask(__name__)
8075
```
8176

82-
#### Command Line
83-
84-
```python
85-
from fewsats_logger import setup_logging
86-
import logging
87-
88-
def main():
89-
setup_logging()
90-
logger = logging.getLogger(__name__)
91-
logger.info("Starting application")
77+
## Issues
9278

93-
if __name__ == "__main__":
94-
main()
79+
⚠️ **WARNING**: When using FastAPI, you may encounter server initialization issues:
80+
- The server may get blocked when started with `python server/main.py`
81+
- But works fine with `uvicorn server.main:app --reload --host 0.0.0.0`
82+
- This appears to be related to logging in the `__main__` scope
83+
- Avoid using logging statements directly in the main module scope or in `if __name__ == "__main__":` blocks

fewsats_logger/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = "0.0.1"
1+
__version__ = "0.0.3"

fewsats_logger/core.py

Lines changed: 21 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -6,63 +6,35 @@
66
__all__ = ['setup_logging']
77

88
# %% ../nbs/00_core.ipynb 3
9-
from logtail import LogtailHandler
10-
import logging
11-
import os
9+
import logging.config
10+
from logtail import LogtailHandler, LogtailContext
11+
import sys
1212

1313
# %% ../nbs/00_core.ipynb 4
14-
def setup_logging():
15-
"""
16-
Configure logging to use Better Stack's LogtailHandler
17-
with env context included automatically.
18-
19-
This should be called once at application startup.
20-
"""
21-
env = os.environ.get("ENV", "development")
22-
source_token = os.environ.get("BETTER_STACK_SOURCE_TOKEN")
23-
host = os.environ.get("BETTER_STACK_HOST")
24-
25-
if not source_token or not host:
26-
# If Better Stack credentials are not available, fall back to basic config
27-
logging.basicConfig(level=logging.INFO)
28-
logging.warning("Better Stack credentials not found, using basic logging config")
29-
return
30-
31-
# Configure the root logger first to set the minimum level
14+
def setup_logging(env, host, token):
3215
root_logger = logging.getLogger()
3316
root_logger.setLevel(logging.INFO)
3417

35-
# Remove any existing handlers to avoid duplicates
36-
for handler in root_logger.handlers[:]:
37-
root_logger.removeHandler(handler)
18+
# Clear existing handlers to avoid duplicates if called multiple times
19+
root_logger.handlers = []
3820

39-
# Add a console handler for local development
40-
console = logging.StreamHandler()
41-
root_logger.addHandler(console)
42-
43-
try:
44-
# Set up the Logtail handler
45-
handler = LogtailHandler(
46-
source_token=source_token,
47-
host=host
21+
# Add Logtail handler for cloud logging
22+
logtail_handler = LogtailHandler(
23+
source_token=token,
24+
host=host,
25+
context=LogtailContext().context(
26+
environment={'name': env}
4827
)
49-
50-
# Override LogRecord factory to add env to all records
51-
old_factory = logging.getLogRecordFactory()
52-
def record_factory(*args, **kwargs):
53-
record = old_factory(*args, **kwargs)
54-
record.env = env
55-
return record
56-
logging.setLogRecordFactory(record_factory)
57-
58-
# Add the handler to the root logger
59-
root_logger.addHandler(handler)
60-
61-
logging.info(f"Better Stack logging configured with env: {env}")
62-
except Exception as e:
63-
logging.error(f"Failed to configure Better Stack logging: {e}")
64-
28+
)
29+
root_logger.addHandler(logtail_handler)
30+
6531

32+
console_handler = logging.StreamHandler(sys.stdout)
33+
console_formatter = logging.Formatter(
34+
'%(asctime)s - %(name)s - %(levelname)s - %(message)s'
35+
)
36+
console_handler.setFormatter(console_formatter)
37+
root_logger.addHandler(console_handler)
6638

6739
# %% ../nbs/00_core.ipynb 5
6840
# If this file is run directly, test the logging

nbs/00_core.ipynb

Lines changed: 23 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,9 @@
3535
"outputs": [],
3636
"source": [
3737
"#| export\n",
38-
"from logtail import LogtailHandler\n",
39-
"import logging\n",
40-
"import os"
38+
"import logging.config\n",
39+
"from logtail import LogtailHandler, LogtailContext\n",
40+
"import sys"
4141
]
4242
},
4343
{
@@ -46,59 +46,32 @@
4646
"metadata": {},
4747
"outputs": [],
4848
"source": [
49-
"\n",
5049
"#| export\n",
51-
"def setup_logging():\n",
52-
" \"\"\"\n",
53-
" Configure logging to use Better Stack's LogtailHandler\n",
54-
" with env context included automatically.\n",
55-
" \n",
56-
" This should be called once at application startup.\n",
57-
" \"\"\"\n",
58-
" env = os.environ.get(\"ENV\", \"development\")\n",
59-
" source_token = os.environ.get(\"BETTER_STACK_SOURCE_TOKEN\")\n",
60-
" host = os.environ.get(\"BETTER_STACK_HOST\")\n",
61-
" \n",
62-
" if not source_token or not host:\n",
63-
" # If Better Stack credentials are not available, fall back to basic config\n",
64-
" logging.basicConfig(level=logging.INFO)\n",
65-
" logging.warning(\"Better Stack credentials not found, using basic logging config\")\n",
66-
" return\n",
67-
" \n",
68-
" # Configure the root logger first to set the minimum level\n",
50+
"\n",
51+
"def setup_logging(env, host, token):\n",
6952
" root_logger = logging.getLogger()\n",
7053
" root_logger.setLevel(logging.INFO)\n",
7154
" \n",
72-
" # Remove any existing handlers to avoid duplicates\n",
73-
" for handler in root_logger.handlers[:]:\n",
74-
" root_logger.removeHandler(handler)\n",
75-
" \n",
76-
" # Add a console handler for local development\n",
77-
" console = logging.StreamHandler()\n",
78-
" root_logger.addHandler(console)\n",
55+
" # Clear existing handlers to avoid duplicates if called multiple times\n",
56+
" root_logger.handlers = []\n",
7957
" \n",
80-
" try:\n",
81-
" # Set up the Logtail handler\n",
82-
" handler = LogtailHandler(\n",
83-
" source_token=source_token,\n",
84-
" host=host\n",
58+
" # Add Logtail handler for cloud logging\n",
59+
" logtail_handler = LogtailHandler(\n",
60+
" source_token=token, \n",
61+
" host=host,\n",
62+
" context=LogtailContext().context(\n",
63+
" environment={'name': env}\n",
8564
" )\n",
86-
" \n",
87-
" # Override LogRecord factory to add env to all records\n",
88-
" old_factory = logging.getLogRecordFactory()\n",
89-
" def record_factory(*args, **kwargs):\n",
90-
" record = old_factory(*args, **kwargs)\n",
91-
" record.env = env\n",
92-
" return record\n",
93-
" logging.setLogRecordFactory(record_factory)\n",
94-
" \n",
95-
" # Add the handler to the root logger\n",
96-
" root_logger.addHandler(handler)\n",
97-
" \n",
98-
" logging.info(f\"Better Stack logging configured with env: {env}\")\n",
99-
" except Exception as e:\n",
100-
" logging.error(f\"Failed to configure Better Stack logging: {e}\")\n",
101-
"\n"
65+
" )\n",
66+
" root_logger.addHandler(logtail_handler)\n",
67+
" \n",
68+
"\n",
69+
" console_handler = logging.StreamHandler(sys.stdout)\n",
70+
" console_formatter = logging.Formatter(\n",
71+
" '%(asctime)s - %(name)s - %(levelname)s - %(message)s'\n",
72+
" )\n",
73+
" console_handler.setFormatter(console_formatter)\n",
74+
" root_logger.addHandler(console_handler)"
10275
]
10376
},
10477
{

settings.ini

Lines changed: 14 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,39 @@
11
[DEFAULT]
2-
# All sections below are required unless otherwise specified.
3-
# See https://github.com/AnswerDotAI/nbdev/blob/main/settings.ini for examples.
4-
5-
### Python library ###
62
repo = fewsats-logger-py
73
lib_name = fewsats-logger
8-
version = 0.0.1
4+
version = 0.0.3
95
min_python = 3.9
106
license = apache2
117
black_formatting = False
12-
13-
### nbdev ###
148
doc_path = _docs
159
lib_path = fewsats_logger
1610
nbs_path = nbs
1711
recursive = True
1812
tst_flags = notest
1913
put_version_in_init = True
2014
update_pyproject = True
21-
22-
### Docs ###
2315
branch = main
2416
custom_sidebar = False
25-
doc_host = https://%(user)s.github.io
26-
doc_baseurl = /%(repo)s
27-
git_url = https://github.com/%(user)s/%(repo)s
28-
title = %(lib_name)s
29-
30-
### PyPI ###
17+
doc_host = https://Fewsats.github.io
18+
doc_baseurl = /fewsats-logger-py
19+
git_url = https://github.com/Fewsats/fewsats-logger-py
20+
title = fewsats-logger
3121
audience = Developers
3222
author = Pol Alvarez
3323
author_email = pol.avms@gmail.com
34-
copyright = 2025 onwards, %(author)s
24+
copyright = 2025 onwards, Pol Alvarez
3525
description = Python Logger based on BetterStack
3626
keywords = nbdev jupyter notebook python
3727
language = English
3828
status = 3
3929
user = Fewsats
40-
4130
requirements = logtail-python
31+
readme_nb = index.ipynb
32+
allowed_metadata_keys =
33+
allowed_cell_metadata_keys =
34+
jupyter_hooks = False
35+
clean_ids = True
36+
clear_all = False
37+
cell_number = True
38+
skip_procs =
4239

43-
### Optional ###
44-
# dev_requirements =
45-
# console_scripts =
46-
# conda_user =
47-
# package_data =

0 commit comments

Comments
 (0)