Skip to content

Commit 0ab4a2b

Browse files
committed
refactor: add json logger
1 parent 544b891 commit 0ab4a2b

File tree

3 files changed

+43
-8
lines changed

3 files changed

+43
-8
lines changed

src/bunkr_uploader/api/__init__.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -169,20 +169,20 @@ async def upload_chunk(self, file: File, server: URL, chunk: Chunk) -> None:
169169
if not result["success"]:
170170
raise ChunkUploadError(file, chunk)
171171

172-
def _create_chunk_dataform(self, file_info: File, chunk: Chunk) -> FormData:
172+
def _create_chunk_dataform(self, file: File, chunk: Chunk) -> FormData:
173173
form = FormData()
174174
form.add_fields(
175-
("dzuuid", file_info.uuid),
175+
("dzuuid", file.uuid),
176176
("dzchunkindex", str(chunk.index)),
177-
("dztotalfilesize", str(file_info.size)),
177+
("dztotalfilesize", str(file.size)),
178178
("dzchunksize", str(self._chunk_size)),
179179
("dztotalchunkcount", str(chunk.total)),
180180
("dzchunkbyteoffset", str(chunk.offset)),
181181
)
182182
form.add_field(
183183
"files[]",
184184
chunk.data,
185-
filename=file_info.upload_name,
185+
filename=file.upload_name,
186186
content_type="application/octet-stream",
187187
)
188188
return form

src/bunkr_uploader/client.py

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,19 @@
22

33
import asyncio
44
import dataclasses
5+
import datetime
56
import logging
67
from typing import TYPE_CHECKING, Any, Self
78

89
import aiofiles
9-
from pydantic import ByteSize
10+
from pydantic import ByteSize, TypeAdapter
1011

1112
from bunkr_uploader.api import BunkrrAPI
1213
from bunkr_uploader.api._exceptions import ChunkUploadError, FileUploadError
1314
from bunkr_uploader.api._files import Chunk, File
1415
from bunkr_uploader.api._responses import UploadResponse
1516

17+
from .logger import json_logger
1618
from .progress import new_progress
1719

1820
if TYPE_CHECKING:
@@ -23,13 +25,25 @@
2325

2426
from bunkr_uploader.config import ConfigSettings
2527

28+
2629
logger = logging.getLogger(__name__)
2730

2831

32+
def _utc_now() -> datetime.datetime:
33+
return datetime.datetime.now().astimezone(datetime.UTC)
34+
35+
2936
@dataclasses.dataclass(slots=True)
3037
class FileUploadResult:
3138
file: File
3239
result: UploadResponse
40+
timestamp: datetime.datetime = dataclasses.field(init=False, default_factory=_utc_now)
41+
42+
def dumps(self) -> str:
43+
return _file_upload_result_serializer(self, indent=2).decode()
44+
45+
46+
_file_upload_result_serializer = TypeAdapter(FileUploadResult).dump_json
3347

3448

3549
class BunkrrUploader:
@@ -71,7 +85,7 @@ def _prepare_files(self, files: Iterable[Path]) -> Generator[File]:
7185
else:
7286
yield file
7387

74-
async def _upload_chunk(self, file: File, chunk: Chunk, server: URL) -> bool:
88+
async def _upload_chunk(self, file: File, server: URL, chunk: Chunk) -> bool:
7589
"""Upload a single chunk with retry mechanism."""
7690
for attempt in range(self.settings.chunk_retries):
7791
msg = f"uploading chunk {chunk.index} of file {file.original_name} (attempt {attempt + 1}/{self.settings.chunk_retries})"
@@ -113,7 +127,7 @@ async def _upload_file(self, file: File, server: URL) -> UploadResponse:
113127
return await self._api.direct_upload(file, server)
114128

115129
async for chunk in self._chunked_read(file):
116-
await self._upload_chunk(file, chunk, server)
130+
await self._upload_chunk(file, server, chunk)
117131

118132
return await self._api.finish_chunks(file, server)
119133

@@ -196,7 +210,9 @@ async def _upload(self, file: File, album_id: str | None) -> FileUploadResult:
196210
try:
197211
server = await self._get_server()
198212
response = await self._upload_file(file, server)
199-
return FileUploadResult(file, response)
213+
result = FileUploadResult(file, response)
214+
json_logger.info(result)
215+
return result
200216
finally:
201217
self._sem.release()
202218

src/bunkr_uploader/logger.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,18 @@
1+
from __future__ import annotations
2+
13
import logging
24

35
# from datetime import datetime
46
from pathlib import Path
7+
from typing import TYPE_CHECKING, cast
58

69
from rich.console import Console
710
from rich.logging import RichHandler
811
from rich.theme import Theme
912

13+
if TYPE_CHECKING:
14+
from bunkr_uploader.client import FileUploadResult
15+
1016
_CONSOLE_THEME = Theme(
1117
{
1218
"logging.level.warning": "yellow",
@@ -45,3 +51,16 @@ def setup_logger(name: str) -> None:
4551
console=Console(file=log_file_path.open("a", encoding="utf8"), width=280),
4652
)
4753
logger.addHandler(file_handler)
54+
55+
56+
class JsonFormatter(logging.Formatter):
57+
def format(self, record: logging.LogRecord) -> str:
58+
result: FileUploadResult = cast("FileUploadResult", record.msg)
59+
return result.dumps()
60+
61+
62+
json_logger = logging.getLogger("bunkr_output_json")
63+
json_file_handler = logging.FileHandler(Path("bunkr_upload.json"))
64+
json_file_handler.setFormatter(JsonFormatter())
65+
json_logger.addHandler(json_file_handler)
66+
json_logger.setLevel(10)

0 commit comments

Comments
 (0)