36 lines
1.3 KiB
Python
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
|