초기 커밋: Docker/PostgreSQL 이관, 구글 OAuth 제거, Gitea 푸시 스크립트 추가
This commit is contained in:
@@ -0,0 +1,43 @@
|
||||
import csv
|
||||
import json
|
||||
import os
|
||||
from datetime import datetime
|
||||
from zoneinfo import ZoneInfo
|
||||
|
||||
|
||||
LOG_DIR = "logs"
|
||||
EVENT_LOG_PATH = os.path.join(LOG_DIR, "event_log.csv")
|
||||
LOG_COLUMNS = ["date", "time", "user", "action", "status", "details"]
|
||||
KST = ZoneInfo("Asia/Seoul")
|
||||
|
||||
|
||||
def user_label(user) -> str:
|
||||
if not user:
|
||||
return ""
|
||||
return getattr(user, "email", None) or getattr(user, "name", None) or str(getattr(user, "id", ""))
|
||||
|
||||
|
||||
def log_event(user, action: str, status: str = "success", details: dict | str | None = None):
|
||||
os.makedirs(LOG_DIR, exist_ok=True)
|
||||
now = datetime.now(KST)
|
||||
file_exists = os.path.exists(EVENT_LOG_PATH)
|
||||
details_text = ""
|
||||
if isinstance(details, dict):
|
||||
details_text = json.dumps(details, ensure_ascii=False)
|
||||
elif details is not None:
|
||||
details_text = str(details)
|
||||
|
||||
with open(EVENT_LOG_PATH, "a", encoding="utf-8-sig", newline="") as f:
|
||||
writer = csv.DictWriter(f, fieldnames=LOG_COLUMNS)
|
||||
if not file_exists or os.path.getsize(EVENT_LOG_PATH) == 0:
|
||||
writer.writeheader()
|
||||
writer.writerow(
|
||||
{
|
||||
"date": now.strftime("%Y-%m-%d"),
|
||||
"time": now.strftime("%H:%M:%S"),
|
||||
"user": user_label(user),
|
||||
"action": action,
|
||||
"status": status,
|
||||
"details": details_text,
|
||||
}
|
||||
)
|
||||
Reference in New Issue
Block a user