Есть ли возможность залогировать подключение?
Например, мне нужно, поднять json-server, и когда например я отправил запрос на сервер, могу ли как-то залогировать этот запрос в file.txt на стороне сервера?
Ответы (2 шт):
Да, сможете. Только логировать лучше средствами ОС. Например, в последних модных линуксах c systemd за это отвечает journald. А сервер легко поднять, например, используя ws.
В json-server для логирования запросов используется библиотека morgan - это легко увидеть, заглянув в исходники.
morgan умеет писать в файл, но проблема в том, что мы не можем передать в jsonServer.defaults() параметры для подключения morgan:
const logger = require('morgan')
...
// Logger
if (opts.logger) {
arr.push(
logger('dev', {
skip: req =>
process.env.NODE_ENV === 'test' || req.path === '/favicon.ico'
})
)
}
Ну, не беда, мы же можем написать свою middleware?
const fs = require('fs');
const path = require('path');
const jsonServer = require('json-server');
const morgan = require('morgan');
const server = jsonServer.create();
const middlewares = jsonServer.defaults({ logger: false, readOnly: true });
const accessLogStream = fs.createWriteStream(path.join(__dirname, '../access.log'), { flags: 'a' });
middlewares.push(
morgan('dev', {
skip: (req) => process.env.NODE_ENV === 'test' || req.path === '/favicon.ico',
stream: accessLogStream
})
);
server.use(middlewares)
server.use((req, res, next) => {
console.log('requiest handler');
res.header('X-Hello', 'World').json({ok: 1});
next();
});
server.listen(3000, () => console.log('JSON Server is running'));
Так мы перенаправим логирование запросов в файл access.log. Код проверен.
Но только логирование запросов. Если же в лог нужно перенаправить и стандартный вывод (console.log) то тут стоит задуматься о более сложных инструментах.
На en.so есть вопрос, ответы на который прекрасно показывают как задружить morgan и winston
Node.js - logging / Use morgan and winston
let logger = new (winston.Logger)({
exitOnError: false,
level: 'info',
transports: [
new (winston.transports.Console)(),
new (winston.transports.File)({ filename: 'app.log'})
]
});
logger.stream = {
write: (message, encoding) => logger.info(message)
};
middlewares.push(
morgan('dev', {
skip: (req) => process.env.NODE_ENV === 'test' || req.path === '/favicon.ico',
stream: logger.stream
})
);