Reusable Django logging configuration helpers.
Project description
django-logkit
django-logkit provides reusable Django logging configs with:
- plain, color, or JSON output
- optional rotating file logging
- request / trace / tenant context via middleware + logging filter
- per-logger level overrides
- Celery-oriented default logger coverage
Install
Local checkout:
pip install -e .
Published package:
pip install django-logkit
Optional color support:
pip install "django-logkit[color]"
Optional high-performance JSON support:
pip install "django-logkit[json]"
Basic
Use the package in two steps:
- Register
RequestContextMiddlewarein DjangoMIDDLEWARE - Configure
LOGGINGwithget_logger_config(...)
Quick JSON setup:
from pathlib import Path
from django_logkit import RequestContextMiddleware, get_logger_config
BASE_DIR = Path(__file__).resolve().parent
MIDDLEWARE = [
"django.middleware.security.SecurityMiddleware",
"django.contrib.sessions.middleware.SessionMiddleware",
"django.middleware.common.CommonMiddleware",
"django.contrib.auth.middleware.AuthenticationMiddleware",
"django_logkit.middleware.RequestContextMiddleware",
]
LOGGING = get_logger_config(
log_level="INFO",
base_dir=BASE_DIR,
enable_file_logging=True,
log_file_name="application.log",
console_style="json",
file_style="json",
include_request_id=True,
include_django_server_logs=False,
text_field_defaults={"user_id": "anonymous", "tenant": "public"},
json_field_defaults={"tenant": "-", "user_id": "-"},
)
Ready-to-copy files:
Advanced
Public API
from pathlib import Path
from django_logkit import (
RequestContextMiddleware,
RequestIdMiddleware,
RequestLogMiddleware,
bind_drf_context,
bind_log_context,
bind_log_context_from_task,
bind_request_context,
bind_request_id,
bind_request_id_from_task,
bind_trace_context,
build_celery_headers,
clear_request_context_resolvers,
extract_log_context_from_task,
get_log_context,
get_logger_config,
get_logger_config_from_file,
get_logger_config_with_file,
get_logger_config_without_file,
register_request_context_resolver,
wrap_with_drf_context,
wrap_with_log_context,
wrap_with_request_context,
wrap_with_request_id,
wrap_with_trace_context,
)
BASE_DIR = Path(__file__).resolve().parent
Config Reference
from pathlib import Path
BASE_DIR = Path(__file__).resolve().parent
LOGGING = get_logger_config(
log_level="INFO",
base_dir=BASE_DIR,
enable_file_logging=True,
log_file_name="application.log",
console_style="json",
file_style="json",
include_request_id=True,
include_django_server_logs=False,
log_format="[%(asctime)s] [%(levelname)s] [%(name)s] %(message)s",
log_colors={"INFO": "green", "ERROR": "red"},
json_fields={"ts": "timestamp", "level": "levelname", "msg": "message", "rid": "request_id"},
json_field_defaults={"tenant": "-", "user_id": "-"},
django_server_message_mode="event",
log_timezone="UTC",
app_loggers=["payments", "notifications"],
logger_levels={
"django.db.backends": "WARNING",
"payments": "DEBUG",
},
)
Arguments:
log_level: default level for configured named loggersbase_dir: required whenlog_file_nameis providedenable_file_logging: explicitly enables or disables the file handler; if omitted, file logging is enabled only whenlog_file_nameis providedlog_file_name: enables timed rotating file logging underBASE_DIR/logs/console_style:plain,color, orjsonfile_style:plain,color, orjsonlog_backup: rotated file retention count, default100log_when: rotation schedule, one ofS,M,H,D,MIDNIGHT,W0-W6app_loggers: additional logger names to configurelogger_levels: per-logger level overridesinclude_request_id: adds request-context filter support to handlersinclude_django_server_logs: include or suppress Django'sdjango.serveraccess loggerlog_format: optional override for the plain/color formatter stringlog_colors: optional override for color formatter level-to-color mappingjson_fields: optional override for JSON output fields as{output_key: record_field_name}text_field_defaults: optional fallback values for plain/color record fieldsjson_field_defaults: optional fallback values for configured JSON output keysdjango_server_message_mode:request_lineoreventfor normalizeddjango.serverJSONmessagelog_timezone: optional timezone applied to plain, color, and JSON timestamps; defaults toUTC, and also accepts values likelocalorAsia/Kolkata
Logger Behavior
log_level
log_level is the default level applied to every named logger configured by django-logkit.
That includes:
- built-in logger names such as
celery,celery.task,django.request, andmain - any extra logger names added through
app_loggers
It does not change the root logger level. The root logger stays at WARNING.
Example:
LOGGING = get_logger_config(
log_level="INFO",
app_loggers=["payments"],
)
This makes these named loggers use INFO unless overridden:
celerycelery.taskdjango.requestmainpayments
app_loggers
app_loggers adds extra logger names to the configured logger set.
Behavior:
- entries are appended to the built-in default logger list
- duplicate names are ignored
- each added logger gets the same handlers as the rest of the configured named loggers
- each added logger uses
log_levelunless overridden bylogger_levels
Example:
LOGGING = get_logger_config(
log_level="INFO",
app_loggers=["payments", "notifications", "payments"],
)
Effective result:
paymentsis added oncenotificationsis added- both get the configured handlers and default to
INFO
logger_levels
logger_levels overrides the level for specific logger names.
Behavior:
- values in
logger_levelstake precedence overlog_level - keys from
logger_levelsare also added to the configured logger set, even if they are not listed inapp_loggers - this is the mechanism to tune noisy modules such as
django.db.backends
Example:
LOGGING = get_logger_config(
log_level="INFO",
app_loggers=["payments"],
logger_levels={
"payments": "DEBUG",
"django.db.backends": "WARNING",
},
)
Effective result:
- built-in loggers still default to
INFO paymentsis configured and usesDEBUGdjango.db.backendsis configured and usesWARNING, even though it was not listed inapp_loggers
Precedence Summary
- The package starts with the built-in logger names.
app_loggersadds more logger names.logger_levelscan add more logger names and override levels for any configured logger.- Any named logger without a specific
logger_levelsentry useslog_level. - The root logger remains
WARNING.
File Logging Behavior
get_logger_config(...) supports both console-only and console+file logging.
Console only:
LOGGING = get_logger_config(
log_level="INFO",
console_style="plain",
enable_file_logging=False,
)
Console + file:
from pathlib import Path
BASE_DIR = Path(__file__).resolve().parent
LOGGING = get_logger_config(
log_level="INFO",
base_dir=BASE_DIR,
enable_file_logging=True,
log_file_name="application.log",
console_style="json",
file_style="json",
)
Rules:
- if
enable_file_logging=False, no file handler is created - if
enable_file_logging=True, bothbase_dirandlog_file_nameare required - if
enable_file_loggingis omitted, file logging is enabled only whenlog_file_nameis provided - file logs are written to
BASE_DIR/logs/<log_file_name>
Default log_format:
"[%(asctime)s] [%(process)s:%(thread)s] [%(levelname)s] [%(name)s:%(lineno)d %(funcName)s()] %(message)s"
Default log_colors:
{
"DEBUG": "blue",
"INFO": "bold_white",
"WARNING": "yellow",
"ERROR": "red",
"CRITICAL": "bold_red",
}
Backward-Compatible Helpers
LOGGING = get_logger_config_without_file(
log_level="INFO",
log_color=True,
app_loggers=["payments"],
logger_levels={"payments": "DEBUG"},
include_request_id=True,
)
from pathlib import Path
BASE_DIR = Path(__file__).resolve().parent
LOGGING = get_logger_config_with_file(
base_dir=BASE_DIR,
log_level="INFO",
log_file_name="application.log",
log_color_console=True,
log_color_file=False,
app_loggers=["payments"],
logger_levels={"payments": "DEBUG"},
include_request_id=True,
)
INI Config File
If you want logging config to live outside Python code, use:
from django_logkit import get_logger_config_from_file
LOGGING = get_logger_config_from_file("/path/to/django-logkit.ini")
Ready-to-copy sample files are included at:
- django-logkit.sample.ini for JSON-oriented output
- django-logkit.plain.sample.ini for plain/color output
- .env.json.example for JSON-oriented environment variables
- .env.plain.example for plain/color environment variables
The file must contain a [django-logkit] section. Example:
[django-logkit]
log_level = INFO
base_dir = /srv/app
enable_file_logging = true
log_file_name = application.log
console_style = json
file_style = plain
include_request_id = true
include_django_server_logs = false
app_loggers = payments, notifications
log_backup = 7
log_when = D
log_timezone = UTC
django_server_message_mode = event
[logger_levels]
payments = DEBUG
django.db.backends = WARNING
[log_colors]
info = green
error = red
[json_fields]
ts = timestamp
msg = message
rid = request_id
[json_field_defaults]
tenant = -
user_id = null
[text_field_defaults]
user_id = anonymous
tenant = public
Supported sections:
[django-logkit]for scalar options such aslog_level,base_dir,console_style,file_style,include_request_id,include_django_server_logs,django_server_message_mode,log_format, andlog_timezone[logger_levels]for per-logger level overrides[log_colors]for color formatter mappings[json_fields]for JSON output field mappings[text_field_defaults]for plain/color formatter fallback values[json_field_defaults]for JSON fallback values; usenullto map to JSONnull
Notes:
log_levelis requiredapp_loggersaccepts comma-separated or newline-separated logger names- boolean values accept
true/false,yes/no,on/off, or1/0
Advanced Middleware
Add the middleware if you want request-scoped log context in logs:
MIDDLEWARE = [
# ...
"django_logkit.middleware.RequestContextMiddleware",
]
Yes, you need to register the middleware in your Django MIDDLEWARE setting if you want automatic request-scoped values.
Register it once. If the same middleware is added multiple times, you can get duplicate request / response logs or mismatched request IDs. The middleware now guards against accidental double application on the same request, but it should still appear only once in MIDDLEWARE.
RequestContextMiddleware is the preferred name because it binds request-scoped context beyond request_id. RequestIdMiddleware remains available as a backward-compatible alias.
RequestLogMiddleware is also available when you want request / response logging decoupled from context binding.
The middleware implementation is sync-only today; on ASGI deployments Django will run it through its sync middleware path, which adds a sync/async boundary per request.
Without the middleware:
request_idis not generated automaticallytrace_id,span_id,tenant, anduser_idare not pulled from the requestduration_msis not measured automatically- you can still use
bind_log_context(...),wrap_with_log_context(...),bind_request_id(...), orwrap_with_request_id(...)manually
Recommended placement:
- put it after authentication / tenant resolution middleware if you want
user_idandtenantto be available automatically - put it before application middleware or views that emit logs so those logs receive the bound context
Typical example:
MIDDLEWARE = [
"django.middleware.security.SecurityMiddleware",
"django.contrib.sessions.middleware.SessionMiddleware",
"django.middleware.common.CommonMiddleware",
"django.contrib.auth.middleware.AuthenticationMiddleware",
"your_project.middleware.TenantMiddleware",
"django_logkit.middleware.RequestContextMiddleware",
# other middleware that should see request_id / trace_id / tenant / user_id
]
The middleware supports these request-scoped fields:
request_idtrace_idspan_idproject_idorg_iduser_idtenantduration_ms
Behavior:
request_idis read from the configured request header if present, otherwise generated automaticallytrace_id,span_id,project_id,org_id, andtenantare read from configured request headers when presentuser_idis resolved fromrequest.user_idorrequest.user.pk/request.user.idwhen availableduration_msis measured automatically for the request lifecycle- every field is optional; you can use any one of them without the others
- the request ID is written back to the response header using the configured request ID header name
trace_id,span_id,project_id,org_id, andtenantcan also be written back to response headers when their propagation flags are enabledtrace_id/span_idfall back to the active OpenTelemetry span when headers are absent and OpenTelemetry is installed- custom field resolvers can be registered for
request_id,trace_id,span_id,project_id,org_id,tenant, anduser_id - optional request / response logging can be enabled independently through environment variables
Default request header names:
HTTP_X_REQUEST_IDHTTP_X_TRACE_IDHTTP_X_SPAN_IDHTTP_X_PROJECT_IDHTTP_X_ORG_IDHTTP_X_TENANT
Environment variable overrides:
DJANGO_LOGKIT_REQUEST_ID_HEADERDJANGO_LOGKIT_TRACE_ID_HEADERDJANGO_LOGKIT_SPAN_ID_HEADERDJANGO_LOGKIT_PROJECT_ID_HEADERDJANGO_LOGKIT_ORG_ID_HEADERDJANGO_LOGKIT_TENANT_HEADER
Optional request / response logging flags:
DJANGO_LOGKIT_LOG_REQUESTSDJANGO_LOGKIT_LOG_REQUEST_HEADERSDJANGO_LOGKIT_LOG_RESPONSE_HEADERSDJANGO_LOGKIT_LOG_REQUEST_BODYDJANGO_LOGKIT_LOG_RESPONSE_BODYDJANGO_LOGKIT_REQUEST_LOGGERDJANGO_LOGKIT_BODY_MAX_LENGTHDJANGO_LOGKIT_REDACT_HEADERSDJANGO_LOGKIT_PROPAGATE_TRACE_IDDJANGO_LOGKIT_PROPAGATE_SPAN_IDDJANGO_LOGKIT_PROPAGATE_PROJECT_IDDJANGO_LOGKIT_PROPAGATE_ORG_IDDJANGO_LOGKIT_PROPAGATE_TENANT
Example:
export DJANGO_LOGKIT_REQUEST_ID_HEADER=HTTP_X_CORRELATION_ID
export DJANGO_LOGKIT_TRACE_ID_HEADER=HTTP_X_B3_TRACE_ID
export DJANGO_LOGKIT_SPAN_ID_HEADER=HTTP_X_B3_SPAN_ID
export DJANGO_LOGKIT_PROJECT_ID_HEADER=HTTP_X_PROJECT
export DJANGO_LOGKIT_ORG_ID_HEADER=HTTP_X_ORGANIZATION
export DJANGO_LOGKIT_TENANT_HEADER=HTTP_X_ACCOUNT
Request / response logging example:
export DJANGO_LOGKIT_LOG_REQUESTS=true
export DJANGO_LOGKIT_LOG_REQUEST_HEADERS=true
export DJANGO_LOGKIT_LOG_RESPONSE_HEADERS=true
export DJANGO_LOGKIT_LOG_REQUEST_BODY=false
export DJANGO_LOGKIT_LOG_RESPONSE_BODY=false
export DJANGO_LOGKIT_REQUEST_LOGGER=django.request
export DJANGO_LOGKIT_BODY_MAX_LENGTH=4096
Custom request-context resolvers:
from django_logkit import register_request_context_resolver
register_request_context_resolver("tenant", lambda request: getattr(request, "account_slug", None))
register_request_context_resolver("project_id", lambda request: request.headers.get("X-Project"))
Resolvers are read from the live registry on each request, so registrations made after Django builds the middleware stack still take effect.
Behavior:
- all request / response logging is disabled by default
- each log type can be enabled independently
- the summary log is emitted at
INFO - headers and bodies are emitted at
DEBUG - middleware-emitted logs include an
eventfield so request and response logs can be distinguished reliably - sensitive headers are redacted by default:
Authorization,Cookie,Set-Cookie,X-Api-Key,Proxy-Authorization - you can override the redacted header list with
DJANGO_LOGKIT_REDACT_HEADERSas a comma-separated list
Request / response log events:
request_summaryrequest_headersresponse_headersrequest_bodyresponse_body
Plain / color formatter behavior:
- middleware-emitted request / response logs are rendered as readable event lines
- use
text_field_defaultswhen you want placeholders such as%(user_id)sor%(tenant)sto render with custom fallback values - for example, plain output will look like:
[2026-04-03 20:05:05.672+00:00] [INFO] [django.request] request_summary method=GET path=/api/health/ status_code=500 [request_id=6f80a469-349e-495a-8a1a-374173aa66f9]
[2026-04-03 20:05:05.672+00:00] [DEBUG] [django.request] request_headers method=GET path=/api/health/ headers={'Host': 'localhost:8000'} [request_id=6f80a469-349e-495a-8a1a-374173aa66f9]
[2026-04-03 20:05:05.672+00:00] [DEBUG] [django.request] response_headers method=GET path=/api/health/ status_code=500 headers={'Content-Type': 'text/html; charset=utf-8'} [request_id=6f80a469-349e-495a-8a1a-374173aa66f9]
Threads And Executors
For threads, executors, background jobs, or standalone log enrichment, bind only the fields you need:
from concurrent.futures import ThreadPoolExecutor
from django_logkit import (
bind_drf_context,
bind_log_context,
bind_request_context,
bind_request_id,
bind_trace_context,
wrap_with_drf_context,
wrap_with_log_context,
wrap_with_request_context,
wrap_with_request_id,
wrap_with_trace_context,
)
def do_work(order_id):
logger.info("processing order", extra={"order_id": order_id})
with bind_request_id("req-123"):
do_work(1)
executor = ThreadPoolExecutor(max_workers=4)
executor.submit(wrap_with_request_id(do_work), 2)
with bind_log_context(trace_id="trace-123"):
logger.info("trace-only log")
with bind_trace_context("trace-456", "span-456"):
logger.info("trace + span log")
with bind_request_context(request_id="req-789", tenant="tenant-acme", project_id="project-1"):
logger.info("request context log")
with bind_drf_context(view="OrderViewSet", action="list", serializer="OrderSerializer"):
logger.info("drf log")
with bind_log_context(duration_ms=18):
logger.info("duration-only log")
executor.submit(
wrap_with_log_context(do_work, tenant="tenant-acme", user_id="user-42"),
3,
)
executor.submit(wrap_with_trace_context(do_work, trace_id="trace-789", span_id="span-789"), 4)
executor.submit(wrap_with_request_context(do_work, request_id="req-999", tenant="tenant-zeta"), 5)
executor.submit(wrap_with_drf_context(do_work, view="InvoiceViewSet", action="retrieve"), 6)
JSON Logging
When console_style="json" or file_style="json", logs are emitted as JSON with fields including:
timestamplevelhostnameloggereventmessagemodulefunctionlineprocessthreadmethodpathheadersbodyrequest_idtrace_idspan_idproject_idorg_iduser_idtenantduration_msexception
Optional service metadata can be added with environment variables:
DJANGO_LOGKIT_SERVICE_NAMEDJANGO_LOGKIT_ENVIRONMENT
If orjson is installed through the optional json extra, JSON logs are serialized with orjson. Otherwise the formatter falls back to Python's standard json module.
By default the JSON formatter emits a fixed set of fields, but you can override that with json_fields.
Configured keys preserve case when loaded from INI files.
Example:
LOGGING = get_logger_config(
log_level="INFO",
console_style="json",
json_fields={
"ts": "timestamp",
"severity": "levelname",
"logger": "name",
"msg": "message",
"request_id": "request_id",
},
log_timezone="UTC",
)
Supported dynamic field values include any standard logging.LogRecord attribute, plus:
timestampmessagehostnameeventmethodpathheadersbodyrequest_idtrace_idspan_idproject_idorg_iduser_idtenantduration_msdrf_viewdrf_actiondrf_serializer
Common examples from Python logging:
namelevelnolevelnamepathnamefilenamemodulelinenofuncNamecreatedasctimemsecsrelativeCreatedthreadthreadNametaskNameprocessprocessName
For json_fields, use the raw field names above, not %-style placeholders.
Use json_field_defaults when you want configured keys to stay present even when a record value is missing.
Example:
LOGGING = get_logger_config(
log_level="INFO",
console_style="json",
json_fields={
"logger": "name",
"level": "levelname",
"path": "pathname",
"line": "lineno",
"function": "funcName",
"time": "asctime",
"pid": "process",
"thread_name": "threadName",
"message": "message",
"request_id": "request_id",
},
log_timezone="Asia/Kolkata",
)
Formatter Fields
For log_format, you can use standard Python logging record attributes such as:
%(name)s%(levelno)s%(levelname)s%(pathname)s%(filename)s%(module)s%(lineno)d%(funcName)s%(created)f%(asctime)s%(msecs)d%(relativeCreated)d%(thread)d%(threadName)s%(taskName)s%(process)d%(processName)s%(message)s
Custom fields added by django-logkit:
%(request_id)s%(trace_id)s%(span_id)s%(project_id)s%(org_id)s%(user_id)s%(tenant)s%(duration_ms)s
Example:
LOGGING = get_logger_config(
log_level="INFO",
console_style="plain",
include_request_id=True,
log_format="[%(levelname)s] [%(name)s] [%(request_id)s] %(message)s",
)
Sample Output
Plain / file output:
[2026-03-25 18:42:11,245] [42110:140735197184768] [INFO] [payments.service:87 create_invoice()] invoice created
Plain / file output with request ID:
[2026-03-25 18:42:11,245] [42110:140735197184768] [INFO] [payments.service:87 create_invoice()] invoice created [request_id=req-123]
Color console output uses the same structure as plain output, with ANSI color applied to the log level prefix.
JSON output:
{"timestamp": "2026-03-25T13:12:11.245000+00:00", "level": "INFO", "hostname": "app-worker-01", "logger": "payments.service", "event": "request_summary", "message": "request_summary", "module": "service", "function": "create_invoice", "line": 87, "process": 42110, "thread": 140735197184768, "method": "GET", "path": "/api/health/", "request_id": "req-123", "trace_id": "trace-123", "span_id": "span-123", "project_id": "project-123", "org_id": "org-123", "user_id": "user-42", "tenant": "tenant-acme", "duration_ms": 18, "service": "billing-api", "environment": "production"}
Celery Notes
Default configured logger names include:
celerycelery.app.tracecelery.redirectedcelery.taskbilliardkombu
That gives worker and task execution logs the same handler and formatter setup as the rest of the project.
To propagate request context into Celery tasks:
from django_logkit import bind_log_context_from_task, bind_request_id_from_task, build_celery_headers
some_task.apply_async(args=[123], headers=build_celery_headers())
@shared_task(bind=True)
def some_task(self, order_id):
with bind_log_context_from_task(self):
logger.info("processing order", extra={"order_id": order_id})
Example settings.py
from pathlib import Path
from django_logkit import get_logger_config
BASE_DIR = Path(__file__).resolve().parent
MIDDLEWARE = [
"django.middleware.security.SecurityMiddleware",
"django.contrib.sessions.middleware.SessionMiddleware",
"django.middleware.common.CommonMiddleware",
"django.contrib.auth.middleware.AuthenticationMiddleware",
"django_logkit.middleware.RequestContextMiddleware",
]
LOGGING = get_logger_config(
log_level="INFO",
base_dir=BASE_DIR,
enable_file_logging=True,
log_file_name="application.log",
console_style="json",
file_style="json",
include_request_id=True,
include_django_server_logs=False,
app_loggers=["payments", "notifications"],
logger_levels={
"django.db.backends": "WARNING",
"payments": "DEBUG",
},
)
Notes
- File logging uses UTF-8 and
delay=True. - Color output falls back to plain formatting if
colorlogis not installed, and emits a runtime warning. - JSON output uses
orjsonwhen installed via the optionaljsonextra, otherwise it falls back to the standard library. log_file_name,log_when,log_backup, and log styles are validated before config is returned.MIDNIGHTis normalized correctly forTimedRotatingFileHandler.- The root logger stays at
WARNINGto limit noisy third-party logs.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file django_logkit-0.1.0.tar.gz.
File metadata
- Download URL: django_logkit-0.1.0.tar.gz
- Upload date:
- Size: 38.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fc818cd4457827471b9abc3df4a10997335da75b82638e68add4092666200cb6
|
|
| MD5 |
b502560d8c0b9d76748aab7b6a4ff27a
|
|
| BLAKE2b-256 |
606cd6e87d5668ab00ff3e181cc93d458cdf03fea23220fc71f28dcc0f41fb89
|
Provenance
The following attestation bundles were made for django_logkit-0.1.0.tar.gz:
Publisher:
publish.yml on Amogha-Hegde/django-logkit
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
django_logkit-0.1.0.tar.gz -
Subject digest:
fc818cd4457827471b9abc3df4a10997335da75b82638e68add4092666200cb6 - Sigstore transparency entry: 1353237390
- Sigstore integration time:
-
Permalink:
Amogha-Hegde/django-logkit@d24b3f3231fb68d6ba934c5d607482b4aa975cb9 -
Branch / Tag:
refs/tags/0.1.0 - Owner: https://github.com/Amogha-Hegde
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@d24b3f3231fb68d6ba934c5d607482b4aa975cb9 -
Trigger Event:
push
-
Statement type:
File details
Details for the file django_logkit-0.1.0-py3-none-any.whl.
File metadata
- Download URL: django_logkit-0.1.0-py3-none-any.whl
- Upload date:
- Size: 24.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
38e7759b3c5a186031d7e0160cff7c15e06466c0581016a50e19bdf26c570d78
|
|
| MD5 |
4a257c5a0c3282fcfaa38e337f91ab79
|
|
| BLAKE2b-256 |
a8be01a946b290db20f219a51f7359ec09312c9ae6dffcadd8a71889801e39fe
|
Provenance
The following attestation bundles were made for django_logkit-0.1.0-py3-none-any.whl:
Publisher:
publish.yml on Amogha-Hegde/django-logkit
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
django_logkit-0.1.0-py3-none-any.whl -
Subject digest:
38e7759b3c5a186031d7e0160cff7c15e06466c0581016a50e19bdf26c570d78 - Sigstore transparency entry: 1353237528
- Sigstore integration time:
-
Permalink:
Amogha-Hegde/django-logkit@d24b3f3231fb68d6ba934c5d607482b4aa975cb9 -
Branch / Tag:
refs/tags/0.1.0 - Owner: https://github.com/Amogha-Hegde
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@d24b3f3231fb68d6ba934c5d607482b4aa975cb9 -
Trigger Event:
push
-
Statement type: