Skip to content

Commit cab3e85

Browse files
committed
Normalize and truncate job args in logging.
1 parent 9ec30c4 commit cab3e85

File tree

8 files changed

+51
-6
lines changed

8 files changed

+51
-6
lines changed

src/dreng/admin.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
from __future__ import annotations
22

3-
import logging
43
from typing import TYPE_CHECKING
54

65
from django.contrib import admin, messages
76
from django.db.models import QuerySet, TextChoices
87
from django.urls import reverse
98
from django.utils import timezone
109

10+
from . import logging
1111
from .constants import Priority
1212
from .models import BaseJob, FailedJob, Job
1313
from .utils import import_task

src/dreng/logging.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import logging
2+
from logging import INFO, WARNING
3+
4+
__all__ = ["INFO", "WARNING", "getLogger"]
5+
6+
7+
class JobArgsFilter(logging.Filter):
8+
def filter(self, record: logging.LogRecord) -> logging.LogRecord:
9+
if (job := getattr(record, "job", {})) and isinstance(job, dict) and "args" in job:
10+
job["args"] = str(job["args"])[:1000] # Avoid "overflowing" logging infrastructure.
11+
return record
12+
13+
14+
def getLogger(name: str = "dreng") -> logging.Logger:
15+
logger = logging.getLogger(name)
16+
logger.addFilter(JobArgsFilter())
17+
return logger

src/dreng/models.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
from __future__ import annotations
22

3-
import logging
43
from datetime import UTC, datetime, timedelta
54
from typing import TYPE_CHECKING, Final, Literal, TypedDict
65
from uuid import UUID, uuid4
@@ -9,6 +8,7 @@
98
from django.db import connection, models
109
from django.utils import timezone
1110

11+
from . import logging
1212
from .constants import STATUS_FAILURE
1313
from .utils import JSONDecoder, JSONEncoder, import_task
1414

src/dreng/scripts/start_repeating_tasks.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1-
import logging
21
from datetime import timedelta
32

43
import click
54

5+
from dreng import logging
6+
67
logger = logging.getLogger(__name__)
78

89

src/dreng/task.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
from __future__ import annotations
22

33
import datetime
4-
import logging
54
import random
65
from contextlib import ExitStack
76
from dataclasses import dataclass
@@ -13,6 +12,7 @@
1312
from django.db import models, transaction
1413
from django.utils import timezone
1514

15+
from . import logging
1616
from .exceptions import SilentFail
1717
from .signals import before_task_run
1818

src/dreng/utils.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import contextlib
55
import datetime
66
import json
7-
import logging
87
import signal
98
from dataclasses import dataclass
109
from datetime import timedelta
@@ -13,6 +12,7 @@
1312

1413
from django.utils.module_loading import import_string
1514

15+
from . import logging
1616
from .exceptions import TimeLimitReached
1717

1818
__all__ = ["Decoded", "JSONDecoder", "JSONEncoder", "TimeLimit", "get_claim_count_cache_key", "import_task"]

src/dreng/worker.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
# cspell: words noreload
22
from __future__ import annotations
33

4-
import logging
54
import signal
65
import time
76
from datetime import timedelta
@@ -13,6 +12,7 @@
1312
from django.utils import timezone
1413
from django.utils.module_loading import import_string
1514

15+
from . import logging
1616
from .constants import CLAIM_COUNT_LIMIT, STATUS_FAILURE, STATUS_SUCCESS
1717
from .models import FailedJob, Job
1818
from .signals import after_job_finished, after_task_imported

tests/logging.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
from typing import Any
2+
3+
import pytest
4+
5+
from dreng import logging
6+
7+
8+
@pytest.mark.parametrize(
9+
("extra", "expected_job"),
10+
[
11+
(
12+
{"slack": {"chill": True}, "job": {"some_number": 123, "args": [1, 2, 3]}},
13+
{"some_number": 123, "args": "[1, 2, 3]"},
14+
),
15+
(
16+
{"slack": {"chill": True}},
17+
{},
18+
),
19+
],
20+
)
21+
def test_JobArgsFilter(caplog: pytest.LogCaptureFixture, extra: dict[str, Any], expected_job: dict[str, Any]) -> None:
22+
logger = logging.getLogger("tests")
23+
logger.info("Working hard or hardly working?", extra=extra)
24+
(record,) = caplog.records
25+
assert hasattr(record, "slack")
26+
assert record.slack["chill"] is True
27+
assert getattr(record, "job", {}) == expected_job

0 commit comments

Comments
 (0)