Django Log Lens is a dependency-free, lightweight, and easy-to-use logging app for Django. It provides an interface to supervise log data while also serving as a useful tool for debugging. As a unique feature, it allows clients to send console logs to the server out of the box, working with any frontend framework by simply adding a single line of code to include the required script.
Want to try it out? →Get started!
- Click on a path in the log message to copy it to the clipboard
- Click on the ↑ button to open the referenced line in VS Code
- Adjust the Path Splitter and the Path Prefix to match your project structure
Example:
Say, the remote project root is /web/my-project
(as in the example above) and your local project root is /home/user/MY-PROJECT
.
- Set the Path Prefix to
/home/user/MY-PROJECT
- Set the Path Splitter to
/my-project
→ Now, by clicking on the path
/web/my-project/django/dvenv/lib/python3.10/site-packages/django/http/request.py:151
,
/home/user/MY-PROJECT/django/dvenv/lib/python3.10/site-packages/django/http/request.py:151
will be opened by VS Code instead.
Allows clients to send console logs to the server.
<!DOCTYPE html>
<html>
...
<body>
{% csrf_token %}
<!-- it's not necessary to render the CSRF token more than once,
so if you use it anywhere in your template, you can skip the line above -->
{% include 'js-logger.html' %}
<!-- include the script to send console logs to the server.
It will simply override the console methods (debug, info, warn...) in a
way they behave the same as before but also send the logs to the server.
Thus, the script does not interfere with your frontend framework and
can be used out-of-the-box. -->
...
</body>
<script>
throw new Error("Hello, Django Log Lens!");
/* You will find this error, including its stack trace, in a log file
if you configured django log lens as described below. */
</script>
</html>
pip install django-log-lens
# file: settings.py
INSTALLED_APPS = [
'django_log_lens',
...
]
# file: urls.py
from django.urls import include
urlpatterns = [
path('logs/', include('django_log_lens.urls')),
...
]
Follow the instructions from the official Django documentation to configure the logging system or use the example below.
# file: settings.py
from django_log_lens import LOG_FORMAT
LOG_FOLDER = BASE_DIR / "logs"
if not os.path.exists(LOG_FOLDER):
os.makedirs(LOG_FOLDER)
LOGGING = {
"version": 1,
"disable_existing_loggers": False,
"formatters": {"default": {"format": LOG_FORMAT}},
"handlers": {
"log_collector": {
"level": "WARNING",
"class": "logging.FileHandler",
"filename": str(LOG_FOLDER / "collector.log"),
"formatter": "default",
},
"client_logger": {
"level": "DEBUG",
"class": "logging.FileHandler",
"filename": str(LOG_FOLDER / "client.log"),
"formatter": "default",
},
},
"loggers": {
"django_log_lens.client": {"handlers": ["client_logger"], "level": "DEBUG", "propagate": True},
"django" : {"handlers": ["log_collector"], "level": "DEBUG", "propagate": True},
}
}
ALLOW_JS_LOGGING = DEBUG # it's recommendable not to allow client logging in production
You can now visit Django Log Lens by navigating to {% url 'django_log_lens:view' %}
(code for your template) -
if you configured the URL pattern as shown above, this would be logs/view
-
Why is are my logs not colored according to the log level?
Make sure to set the
LOG_FORMAT
in yoursettings.py
as shown in the example above. -
Can I use my own logging format?
Basically, yes. Just make sure prefix the loglevel to the log message as shown in the following example:
from django_log_lens import LEVEL_PREFIX MY_LOG_FORMAT = "%(levelname)s - %(message)s" # adjust to your needs MY_LOG_LENS_FORMAT = LEVEL_PREFIX + MY_LOG_FORMAT
-
Which handlers are recognized by Django Log Lens?
The following handlers will be recognized automatically:
FileHandler
,RotatingFileHandler
,TimedRotatingFileHandler
,WatchedFileHandler
As a side note, be aware that the
WatchedFileHandler
is inappropriate for use under windows as open files cannot be moved or renamed. -
What if I want to use a custom handler?
Assume you have a custom handler called
CustomHandler
in the filemyapp/handlers.py
:from logging.handlers import TimedRotatingFileHandler class CustomFileHandler(TimedRotatingFileHandler): # could also inherit from any other handler pass # add your custom logic here
Add the following lines to the logging configuration in your
settings.py
:from django_log_lens import add_handler # add your custom handler by its fully qualified class name: add_handler("myapp.handlers.CustomFileHandler")
Now, the custom handler will be recognized by Django Log Lens and you can view the logs in the web interface.
This project uses the Dracula theme by Zeno Rocha which is licensed under the MIT License