Spaces:
Running
Running
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(); | |
}; | |
} | |