Есть ли возможность залогировать подключение?

Например, мне нужно, поднять json-server, и когда например я отправил запрос на сервер, могу ли как-то залогировать этот запрос в file.txt на стороне сервера?


Ответы (2 шт):

Автор решения: DiD

Да, сможете. Только логировать лучше средствами ОС. Например, в последних модных линуксах c systemd за это отвечает journald. А сервер легко поднять, например, используя ws.

→ Ссылка
Автор решения: nörbörnën

В 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
        })
);
→ Ссылка