Spaces:
Paused
Paused
| import path from 'node:path'; | |
| import fs from 'node:fs'; | |
| import { getRealIpFromHeader } from '../express-common.js'; | |
| import { color, getConfigValue } from '../util.js'; | |
| const enableAccessLog = getConfigValue('logging.enableAccessLog', true, 'boolean'); | |
| const knownIPs = new Set(); | |
| export const getAccessLogPath = () => path.join(globalThis.DATA_ROOT, 'access.log'); | |
| export function migrateAccessLog() { | |
| try { | |
| if (!fs.existsSync('access.log')) { | |
| return; | |
| } | |
| const logPath = getAccessLogPath(); | |
| if (fs.existsSync(logPath)) { | |
| return; | |
| } | |
| fs.renameSync('access.log', logPath); | |
| console.log(color.yellow('Migrated access.log to new location:'), logPath); | |
| } catch (e) { | |
| console.error('Failed to migrate access log:', e); | |
| console.info('Please move access.log to the data directory manually.'); | |
| } | |
| } | |
| /** | |
| * Creates middleware for logging access and new connections | |
| * @returns {import('express').RequestHandler} | |
| */ | |
| export default function accessLoggerMiddleware() { | |
| return function (req, res, next) { | |
| const clientIp = getRealIpFromHeader(req); | |
| const userAgent = req.headers['user-agent']; | |
| if (!knownIPs.has(clientIp)) { | |
| // Log new connection | |
| console.info(color.yellow(`New connection from ${clientIp}; User Agent: ${userAgent}\n`)); | |
| knownIPs.add(clientIp); | |
| // Write to access log if enabled | |
| if (enableAccessLog) { | |
| const logPath = getAccessLogPath(); | |
| const timestamp = new Date().toISOString(); | |
| const log = `${timestamp} ${clientIp} ${userAgent}\n`; | |
| fs.appendFile(logPath, log, (err) => { | |
| if (err) { | |
| console.error('Failed to write access log:', err); | |
| } | |
| }); | |
| } | |
| } | |
| next(); | |
| }; | |
| } | |