60 lines
1.9 KiB
JavaScript
60 lines
1.9 KiB
JavaScript
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);
|
|
|
|
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();
|
|
};
|
|
}
|