feat: add heartbeat check for bug report API and enhance logging throughout the application
This commit is contained in:
@@ -1,7 +1,18 @@
|
||||
import type { Handle } from '@sveltejs/kit';
|
||||
import { lucia } from '$lib/server/auth';
|
||||
import { initLogger, Log } from '$lib/server/logger';
|
||||
|
||||
// Initialize dashboard logger
|
||||
initLogger();
|
||||
|
||||
export const handle: Handle = async ({ event, resolve }) => {
|
||||
const ip =
|
||||
event.request.headers.get('x-forwarded-for')?.split(',')[0]?.trim() ||
|
||||
event.request.headers.get('x-real-ip') ||
|
||||
event.getClientAddress?.() ||
|
||||
'unknown';
|
||||
Log('HTTP', `${event.request.method} ${event.url.pathname} from ${ip}`);
|
||||
|
||||
const sessionId = event.cookies.get(lucia.sessionCookieName);
|
||||
|
||||
if (!sessionId) {
|
||||
@@ -21,6 +32,7 @@ export const handle: Handle = async ({ event, resolve }) => {
|
||||
}
|
||||
|
||||
if (!session) {
|
||||
Log('AUTH', `Invalid session from ip=${ip}`);
|
||||
const sessionCookie = lucia.createBlankSessionCookie();
|
||||
event.cookies.set(sessionCookie.name, sessionCookie.value, {
|
||||
path: '.',
|
||||
@@ -30,6 +42,7 @@ export const handle: Handle = async ({ event, resolve }) => {
|
||||
|
||||
// If user is disabled, invalidate their session and clear cookie
|
||||
if (session && user && !user.enabled) {
|
||||
Log('AUTH', `Disabled user rejected: username=${user.username} ip=${ip}`);
|
||||
await lucia.invalidateSession(session.id);
|
||||
const sessionCookie = lucia.createBlankSessionCookie();
|
||||
event.cookies.set(sessionCookie.name, sessionCookie.value, {
|
||||
|
||||
42
server/dashboard/src/lib/server/logger.ts
Normal file
42
server/dashboard/src/lib/server/logger.ts
Normal file
@@ -0,0 +1,42 @@
|
||||
import { mkdirSync, appendFileSync, existsSync } from "fs";
|
||||
import { join } from "path";
|
||||
|
||||
let logFilePath: string | null = null;
|
||||
|
||||
/**
|
||||
* Initialize the logger. Creates the logs/ directory if needed
|
||||
* and opens the log file in append mode.
|
||||
*/
|
||||
export function initLogger(filename = "dashboard.log"): void {
|
||||
const logsDir = join(process.cwd(), "logs");
|
||||
if (!existsSync(logsDir)) {
|
||||
mkdirSync(logsDir, { recursive: true });
|
||||
}
|
||||
logFilePath = join(logsDir, filename);
|
||||
Log("LOGGER", "Logger initialized. Writing to:", logFilePath);
|
||||
}
|
||||
|
||||
/**
|
||||
* Log a timestamped, source-tagged message to stdout and the log file.
|
||||
* Format: [YYYY-MM-DD] - [HH:MM:SS] - [source] - message
|
||||
*/
|
||||
export function Log(source: string, ...args: unknown[]): void {
|
||||
const now = new Date();
|
||||
const date = now.toISOString().slice(0, 10);
|
||||
const time = now.toTimeString().slice(0, 8);
|
||||
const msg = args
|
||||
.map((a) => (typeof a === "object" ? JSON.stringify(a) : String(a)))
|
||||
.join(" ");
|
||||
|
||||
const line = `[${date}] - [${time}] - [${source}] - ${msg}`;
|
||||
|
||||
console.log(line);
|
||||
|
||||
if (logFilePath) {
|
||||
try {
|
||||
appendFileSync(logFilePath, line + "\n");
|
||||
} catch {
|
||||
// If file write fails, stdout logging still works
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user