# Better Stack Python logging


## Start logging in 3 steps

Where do you want to collect your logs from?

- [Django application](#logging-from-django)
- [Python code](#logging-from-python)
- [AWS Lambda](https://betterstack.com/docs/logs/aws-lambda/#logging-in-aws-lambda-running-python)

## Logging from Django

Collect logs from your Django application.

### 1. Install

Install Better Stack Python PyPI package:

```bash
[label Install Logtail Python]
pip3 install logtail-python
```

### 2. Setup

Set up Django Better Stack handler in `settings.py`:

```python
[label Set up Logtail handler]
LOGGING = {
    "version": 1,
    "disable_existing_loggers": False,
    'handlers': {
        'logtail': {
            'class': 'logtail.LogtailHandler',
            'source_token': '$SOURCE_TOKEN',
            'host': 'https://$INGESTING_HOST',
        },
    },
    "loggers": {
        "": {
            "handlers": [
                "logtail",
            ],
            "level": "INFO",
        },
    },
}
```

### 3. Start logging 🎉

Use Python logger as usual:

```python
[label Send logs to Logtail]
import logging
logger = logging.getLogger(__name__)
logger.error('Something bad happened.')
logger.info('Log message with structured logging.', extra={
    'item': "Orange Soda",
    'price': 100.00
})
```

You should see your logs in [Better Stack → Live tail](https://telemetry.betterstack.com/team/0/tail ";_blank").

[warning]
**Python version 3.7 or higher is required.**  
Pip version 20.0.2 or higher is required.
[/warning]


## Logging from Python

Collect logs from your Python code.

### 1. Install

Install Better Stack Python PyPI package:

```bash
[label Install Logtail Python]
pip3 install logtail-python
```

### 2. Setup

Set up Python logger with Better Stack:

```python
[label Set up Logtail handler]
from logtail import LogtailHandler
import logging

handler = LogtailHandler(
    source_token='$SOURCE_TOKEN', 
    host='https://$INGESTING_HOST',
)
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
logger.handlers = []
logger.addHandler(handler)
``` 



### 3. Start logging 🎉

Use Python logger as usual:

```python
[label Send logs to Logtail]
logger.error('Something bad happened.')
logger.info('Log message with structured logging.', extra={
    'item': "Orange Soda",
    'price': 100.00
})
```

You should see your logs in [Better Stack → Live tail](https://telemetry.betterstack.com/team/0/tail ";_blank").

[warning]
**Python version 3.7 or higher is required.**  
Pip version 20.0.2 or higher is required.
[/warning]


## Need help?

Please let us know at hello@betterstack.com.  
We're happy to help! 🙏


## Additional information

Interested in learning more about **Python log levels** and **using formatters** to customize your logs? 
Check out our [Comprehensive Guide to Logging in Python](https://betterstack.com/community/guides/logging/how-to-start-logging-with-python/).

### Missing logs from the end of your application run?

Make sure your application terminates gracefully, giving the logger enough time to finish the request to Better Stack.

Use `sys.exit()` to end your application.

Using `os._exit()` would terminate all threads immediately, potentially dropping your logs.

### Enrich log context

Add custom data to multiple log lines using `with` block:

```python
[label Enrich logs with context]

with logtail.context(user={ 'id': 123 }):
    logger.info('User logged in.')
    # More code here ...
    logger.info('User bought a python.')
```

### Log exceptions

Use `logger.exception()` to log exceptions with traceback:

```python
[label Log exception traceback]
try:
    nonexisting_function()
except Exception as Argument:
    logger.exception("Error occurred while calling non-existing function.")
```

### Example project

Want to try a more detailed example?  
See our [Python Logtail example project on GitHub](https://github.com/logtail/logtail-python/tree/master/example-project).
