This repository has been archived on 2026-04-27. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
website/src/nercone_website/logger.py
T
2026-04-08 18:14:11 +09:00

36 lines
1.3 KiB
Python

import uuid
import json
from pathlib import Path
from starlette.types import Scope
from datetime import datetime, timezone
access_log_path = Path.cwd().joinpath("logs", "access.log")
access_log_path.parent.mkdir(parents=True, exist_ok=True)
# TODO: ステータスコードとかも含めたい でもそれにはレスポンスが出来上がってからログを書く必要があるので/echoとかを残すには工夫がいりそう
def log_access(scope: Scope, write: bool = True):
client = scope.get("client") or ("", 0)
server = scope.get("server") or ("", 0)
headers = dict(scope.get("headers", []))
hostname = headers.get(b"host", b"").decode().split(":")[0].strip()
log = {
"id": str(uuid.uuid4()),
"timestamp": datetime.now(timezone.utc).isoformat(),
"from": {
"address": client[0],
"port": client[1]
},
"to": {
"scheme": scope.get("scheme", "https"),
"host": hostname,
"port": server[1]
},
"method": scope.get("method", "GET"),
"path": scope.get("path", "/"),
"headers": {k.decode(): v.decode() for k, v in headers.items()}
}
if write:
with access_log_path.open("a", encoding="utf-8") as f:
f.write(json.dumps(log, ensure_ascii=False) + "\n")
return log