484. Слишком тяжёлые логи

Не решаласьЛёгкая

У Лены есть сервер с 16 МБ оперативной памяти, на нём одновременно запущено 4 инстанса (экземпляра) одного и того же приложения. Каждый инстанс пишет логи в свой файл, размер файла в итоге может достигать 20 МБ, то есть больше, чем имеется оперативной памяти.

Помогите Лене написать скрипт, который она сможет запустить на своём сервере, чтобы собрать один общий файл из четырёх. Итоговый документ должен содержать все строчки из исходных четырёх файлов в хронологическом порядке, отсортированном по timestamp.

Шаблон решения

module.exports = async () => {
  // Ваше решение

  // Необходимо прочитать логи из файлов:
  // server_1.log
  // server_2.log
  // server_3.log
  // server_4.log

  // И записать один общий лог в output.log
};

Формат ввода

Один файл с логами представляет собой множество строчек. Гарантируется, что каждая отдельно взятая строчка может с запасом поместиться в оперативную память.

Одна строчка логов — JSON-объект, где есть множество разных полей, среди которых точно будет timestamp с одним числом — UNIX-временем.

Каждая новая строчка, в рамках одного файла с логами, имеет бо́льший timestamp, чем предыдущая.

Формат вывода

Необходимо экспортировать функцию с решением в виде CommonJS-модуля. Она должна прочитать данные из файлов server_1.log, server_2.log, server_3.log, server_4.log и записать в файл output.log один общий отсортированный лог.

Решение может быть как синхронным, так и асинхронным. Главное — чтобы в файле output.log был ответ до того, как ваш скрипт закончит исполнение.

Ограничения

Ограничение времени

10 с

Ограничение памяти

18 МБ

Пример 1

Ввод
server_1.log
{"timestamp": 170090, "message": "Event 6"}
{"timestamp": 170135, "message": "Event 9"}
{"timestamp": 170150, "message": "Event 10"}

server_2.log
{"timestamp": 170045, "message": "Event 3"}
{"timestamp": 170060, "message": "Event 4"}
{"timestamp": 170165, "message": "Event 11"}

server_3.log
{"timestamp": 170015, "message": "Event 1"}
{"timestamp": 170075, "message": "Event 5"}
{"timestamp": 170120, "message": "Event 8"}

server_4.log
{"timestamp": 170030, "message": "Event 2"}
{"timestamp": 170105, "message": "Event 7"}
{"timestamp": 170180, "message": "Event 12"}
Вывод
{"timestamp": 170015, "message": "Event 1"}
{"timestamp": 170030, "message": "Event 2"}
{"timestamp": 170045, "message": "Event 3"}
{"timestamp": 170060, "message": "Event 4"}
{"timestamp": 170075, "message": "Event 5"}
{"timestamp": 170090, "message": "Event 6"}
{"timestamp": 170105, "message": "Event 7"}
{"timestamp": 170120, "message": "Event 8"}
{"timestamp": 170135, "message": "Event 9"}
{"timestamp": 170150, "message": "Event 10"}
{"timestamp": 170165, "message": "Event 11"}
{"timestamp": 170180, "message": "Event 12"}

Пример 2

Ввод
server_1.log
{"timestamp": 170032, "reqid": 3, "pathname": "/foo", "request": ""}
{"timestamp": 170068, "reqid": 5, "pathname": "/login", "request": "login: cool_boy, password: 123456!"}
{"timestamp": 170079, "reqid": 3, "pathname": "/foo", "response": "bar"}
{"timestamp": 170127, "reqid": 6, "pathname": "/login", "request": "login: cool_boy, password: 123456$"}
{"timestamp": 170356, "reqid": 5, "pathname": "/login", "response": "Wrong password"}
{"timestamp": 170613, "reqid": 6, "pathname": "/login", "response": "Welcome, cool_boy"}

server_2.log
{"timestamp": 170015, "reqid": 1, "pathname": "/hello", "request": ""}
{"timestamp": 170018, "reqid": 2, "pathname": "/hello", "request": "Yandex"}
{"timestamp": 170042, "reqid": 1, "pathname": "/hello", "response": "Hello, world!"}
{"timestamp": 170721, "reqid": 2, "pathname": "/hello", "response": "Hello, Yandex!"}

server_3.log
{"timestamp": 170012, "reqid": 0, "pathname": "/ping", "request": ""}
{"timestamp": 170013, "reqid": 8, "pathname": "/secret", "request": ""}
{"timestamp": 170047, "reqid": 8, "pathname": "/secret", "response": "403 Forbidden"}
{"timestamp": 170051, "reqid": 0, "pathname": "/ping", "response": "pong"}

server_4.log
{"timestamp": 170044, "reqid": 4, "pathname": "/404", "request": ""}
{"timestamp": 170100, "reqid": 4, "pathname": "/404", "response": "404 Not Found"}
{"timestamp": 170650, "reqid": 7, "pathname": "/secret", "request": "cookies: user=cool_boy"}
{"timestamp": 170652, "reqid": 7, "pathname": "/secret", "response": "Here is you secret: 42"}
Вывод
{"timestamp": 170012, "pathname": "/ping", "reqid": 0, "request": ""}
{"timestamp": 170013, "pathname": "/secret", "reqid": 8, "request": ""}
{"timestamp": 170015, "pathname": "/hello", "reqid": 1, "request": ""}
{"timestamp": 170018, "pathname": "/hello", "reqid": 2, "request": "Yandex"}
{"timestamp": 170032, "pathname": "/foo", "reqid": 3, "request": ""}
{"timestamp": 170042, "pathname": "/hello", "reqid": 1, "response": "Hello, world!"}
{"timestamp": 170044, "pathname": "/404", "reqid": 4, "request": ""}
{"timestamp": 170047, "pathname": "/secret", "reqid": 8, "response": "403 Forbidden"}
{"timestamp": 170051, "pathname": "/ping", "reqid": 0, "response": "pong"}
{"timestamp": 170068, "pathname": "/login", "reqid": 5, "request": "login: cool_boy, password: 123456!"}
{"timestamp": 170079, "pathname": "/foo", "reqid": 3, "response": "bar"}
{"timestamp": 170100, "pathname": "/404", "reqid": 4, "response": "404 Not Found"}
{"timestamp": 170127, "pathname": "/login", "reqid": 6, "request": "login: cool_boy, password: 123456$"}
{"timestamp": 170356, "pathname": "/login", "reqid": 5, "response": "Wrong password"}
{"timestamp": 170613, "pathname": "/login", "reqid": 6, "response": "Welcome, cool_boy"}
{"timestamp": 170650, "pathname": "/secret", "reqid": 7, "request": "cookies: user=cool_boy"}
{"timestamp": 170652, "pathname": "/secret", "reqid": 7, "response": "Here is you secret: 42"}
{"timestamp": 170721, "pathname": "/hello", "reqid": 2, "response": "Hello, Yandex!"}

Пример 3

Ввод
server_1.log
{"timestamp": 170027, "message": "Update user with id 2 request", "method": "PUT", "type": "request", "url": "/api/users/2"}
{"timestamp": 170042, "message": "User with id 2 updated", "method": "PUT", "type": "response", "url": "/api/users/2"}
{"timestamp": 170054, "message": "Users list request", "method": "GET", "type": "request", "url": "/api/users"}
{"timestamp": 170060, "message": "Users list response", "method": "GET", "type": "response", "url": "/api/users"}

server_2.log
{"timestamp": 170005, "message": "Index page request", "method": "GET", "type": "request", "url": "/"}
{"timestamp": 170010, "message": "Users list request", "method": "GET", "type": "request", "url": "/api/users"}
{"timestamp": 170012, "message": "Create user request", "method": "POST", "type": "request", "url": "/api/users"}
{"timestamp": 170015, "message": "Users list response", "method": "GET", "type": "response", "url": "/api/users"}
{"timestamp": 170018, "message": "User created", "method": "POST", "type": "response", "url": "/api/users"}
{"timestamp": 170022, "message": "Index page response", "method": "GET", "type": "response", "url": "/"}

server_3.log
{"timestamp": 170036, "message": "Update user with id 3 request", "method": "PUT", "type": "request", "url": "/api/users/3"}
{"timestamp": 170038, "message": "User with id 3 updated", "method": "PUT", "type": "response", "url": "/api/users/3"}

server_4.log
{"timestamp": 170046, "message": "Users list request", "method": "GET", "type": "request", "url": "/api/users"}
{"timestamp": 170047, "message": "Delete user with id 2 request", "method": "DELETE", "type": "request", "url": "/api/users/2"}
{"timestamp": 170051, "message": "Users list response", "method": "GET", "type": "response", "url": "/api/users"}
{"timestamp": 170053, "message": "User with id 2 deleted", "method": "DELETE", "type": "response", "url": "/api/users/2"}
Вывод
{"timestamp": 170005, "message": "Index page request", "method": "GET", "type": "request", "url": "/"}
{"timestamp": 170010, "message": "Users list request", "method": "GET", "type": "request", "url": "/api/users"}
{"timestamp": 170012, "message": "Create user request", "method": "POST", "type": "request", "url": "/api/users"}
{"timestamp": 170015, "message": "Users list response", "method": "GET", "type": "response", "url": "/api/users"}
{"timestamp": 170018, "message": "User created", "method": "POST", "type": "response", "url": "/api/users"}
{"timestamp": 170022, "message": "Index page response", "method": "GET", "type": "response", "url": "/"}
{"timestamp": 170027, "message": "Update user with id 2 request", "method": "PUT", "type": "request", "url": "/api/users/2"}
{"timestamp": 170036, "message": "Update user with id 3 request", "method": "PUT", "type": "request", "url": "/api/users/3"}
{"timestamp": 170038, "message": "User with id 3 updated", "method": "PUT", "type": "response", "url": "/api/users/3"}
{"timestamp": 170042, "message": "User with id 2 updated", "method": "PUT", "type": "response", "url": "/api/users/2"}
{"timestamp": 170046, "message": "Users list request", "method": "GET", "type": "request", "url": "/api/users"}
{"timestamp": 170047, "message": "Delete user with id 2 request", "method": "DELETE", "type": "request", "url": "/api/users/2"}
{"timestamp": 170051, "message": "Users list response", "method": "GET", "type": "response", "url": "/api/users"}
{"timestamp": 170053, "message": "User with id 2 deleted", "method": "DELETE", "type": "response", "url": "/api/users/2"}
{"timestamp": 170054, "message": "Users list request", "method": "GET", "type": "request", "url": "/api/users"}
{"timestamp": 170060, "message": "Users list response", "method": "GET", "type": "response", "url": "/api/users"}

Теги

JavaScript Node.js 20.14 + Chrome 125
Нужно войти, чтобы отправить решение.Войти