Node js как писать логи в файл

Обновлено: 03.07.2024

У меня есть еще один вопрос ( последний вопрос ). В данный момент я работаю над проектом Node.js, и в этом у меня есть функции many console.log (). До сих пор это работало нормально, но я также хочу, чтобы все, что пишется на консоль, также было записано в лог-файл. Может кто-нибудь, пожалуйста, помогите мне?

В моем реальном коде это немного больше, но это должно дать вам представление.

если вы хотите войти в консоль и в файл:

теперь ваш код может создать новый регистратор с

и использовать регистратор в вашем коде

Просто запустите скрипт в вашем терминале, как это .

Это говорит командной консоли записать стандартный вывод команды node script-file.js в ваш файл журнала вместо значения по умолчанию, которое выводит его на консоль.

Это называется перенаправление и это очень мощный. Скажем, вы хотели записать все ошибки в отдельный файл .

Теперь все console.log записываются в log-file.txt , а все console.error записываются в error-file.txt

Вы можете попробовать переопределить встроенный console.log , чтобы сделать что-то другое.

Однако это помещает originalLog в основную область, поэтому вам следует попробовать обернуть его в функцию. Это называется закрытием, и вы можете прочитать больше о них здесь .

Чтобы написать файлы, см. этот stackoverflow вопрос, а переопределить console.log даже лучше, чем я показал, см. это . Сочетая эти два ответа, вы получите наилучшее решение.

Теперь, если вы хотите войти в указанный файл, вы можете сделать это так, как activedecay показал вам:

Это, однако, ничего не будет записывать в консоль, и, поскольку я не понял, как реализовать несколько приложений в одном регистраторе, вы все равно можете реализовать старый добрый console.log();

П.Д .: Я знаю, что это несколько старая тема, и что конкретная проблема ОП уже решена, но, поскольку я приехал сюда с той же целью, я могу также оставить свой опыт, чтобы помочь любому посетителю этой темы в будущем.

Эффективное средство логирования имеет решающее значение для успеха любого приложения. В этом руководстве мы рассмотрим пакет логирования Winston, это универсальная библиотека и самое популярное средство для логирования приложений Node.js, основанное на статистике загрузки NPM.

В результате у вас будет сервер Ubuntu, на котором будет работать простое приложение Node/Express.

Требования

  • Сервер Ubuntu 16.04, настроенный по этому мануалу.
  • Установка Node.js из официального PPA (как в мануале Установка Node.js в Ubuntu 16.04).

1: Создание базового приложения Node/Express

Обычно Winston используется для логирования событий веб-приложений, созданных с помощью Node.js. Чтобы научится настраивать Winston, создайте простое веб-приложение Node.js, используя платформу Express. Чтобы запустить базовое веб-приложение, можно использовать express-generator, инструмент командной строки для быстрого запуска веб-приложения Node/Express. Поскольку (согласно требованиям) вы установили Node Package Manager, вы можете использовать команду npm для установки express-generator. Также можно использовать флаг -g, который устанавливает пакет глобально, чтобы он мог использоваться как инструмент командной строки вне существующего проекта или модуля Node. Установите пакет с помощью следующей команды:

sudo npm install express-generator -g

Установив express-generator, вы можете создать приложение с помощью команды express, указав имя каталога, который вы хотите использовать для проекта. Это создаст приложение и все, что нужно для начала работы:

Затем установите Nodemon, который будет автоматически перезагружать приложение всякий раз, когда вы вносите какие-либо изменения. Приложение Node.js необходимо перезапускать после внесения любых изменений в исходный код, чтобы эти изменения вступили в силу. Nodemon будет автоматически следить за изменениями и перезапускать приложение. Чтобы использовать nodemon в качестве инструмента командной строки, установите его с помощью флага -g:

sudo npm install nodemon -g

Чтобы закончить настройку приложения, перейдите в каталог приложения и установите зависимости:

cd myApp
npm install

По умолчанию приложения, созданные с помощью express-generator, запускаются по порту 3000, поэтому нужно убедиться, что порт не заблокирован брандмауэром. Чтобы открыть порт 3000, выполните следующую команду:

sudo ufw allow 3000

Теперь у вас есть все необходимое для запуска веб-приложения. Для этого запустите следующую команду:

Express
Welcome to Express!

В этот момент нужно запустить вторую сессию SSH на вашем сервере. Работа во второй сессии будет идти во всей оставшейся части этого мануала, а веб-приложение останется в первой сессии. Первая сессия, в которой запущено приложение, будет называться сессией А, а вторая (рабочая) – сессией Б. Если не указано иное, все остальные команды в мануале нужно запускать в сессии Б.

2: Кастомизация приложения Node.js

По умолчанию в шаблоне express-generator при ссылке на пакет morgan используется переменная logger. Поскольку вы будете использовать morgan и winston, а оба они являются пакетами логирования, вы можете запутаться, если один из них будет называться logger. Измените это, отредактировав файл app.js в корне проекта.

В начале файла будет такая строка:

.
var logger = require('morgan');
.

Измените ее так:

.
var morgan = require('morgan');
.

Эти изменения помогут лучше понять, на какой пакет логирования вы ссылаетесь после интеграции конфигурации Winston.

Выйдите и сохраните файл (CTRL-X, затем Y, а затем ENTER).

3: Установка и настройка Winston

Теперь можно установить и настроить Winston. На этом этапе мы рассмотрим некоторые параметры конфигурации, которые доступны как часть пакета winston, и создадим регистратор, который будет записывать информацию в файл и консоль.

Чтобы установить winston, запустите следующую команду:

/myApp
npm install winston

Вспомогательные файлы или утилиты для приложений полезно хранить в специальном каталоге, поэтому создайте каталог config, который будет содержать конфигурацию winston:

Теперь создайте файл, который будет содержать конфигурацию winston,

Затем создайте папку, в которой будут храниться ваши файлы логов:

Наконец, установите пакет app-root-path, который полезен при настройке путей в Node.js. Этот пакет напрямую не связан с Winston, но очень помогает при указании путей к файлам в коде Node.js. Мы будем использовать его, чтобы указать расположение файлов лога Winston из корня проекта и упростить синтаксис пути:

npm install app-root-path --save

Все необходимое для настройки логирования теперь есть на вашем сервере, поэтому можно перейти к определению параметров конфигурации. Откройте

/myApp/config/winston.js для редактирования:

Затем добавьте пакеты app-root-path и winston.

var appRoot = require('app-root-path');
var winston = require('winston');

Чтобы определить транспорты file и console в конфигурации winston, используйте такой код:

.
var options = file: level: 'info',
filename: `$/logs/app.log`,
handleExceptions: true,
json: true,
maxsize: 5242880, // 5MB
maxFiles: 5,
colorize: false,
>,
console: level: 'debug',
handleExceptions: true,
json: false,
colorize: true,
>,
>;

Затем создайте новый регистратор winston с транспортом file и console, используя свойства, определенные в переменной options:

.
var logger = new winston.Logger( transports: [
new winston.transports.File(options.file),
new winston.transports.Console(options.console)
],
exitOnError: false, // do not exit on handled exceptions
>);

По умолчанию morgan выводит данные только на консоль, поэтому сейчас нужно определить функцию потока, которая сможет собрать вывод morgan в файлы логов winston. Используйте уровень логирования info, чтобы вывод был загружен обоими транспортами:

.
logger.stream = write: function(message, encoding) logger.info(message);
>,
>;

Экспортируйте регистратор, чтобы использовать его в других частях приложения:

В результате конфигурации winston должны выглядеть следующим образом:

var appRoot = require('app-root-path');
var winston = require('winston');
// define the custom settings for each transport (file, console)
var options = file: level: 'info',
filename: `$/logs/app.log`,
handleExceptions: true,
json: true,
maxsize: 5242880, // 5MB
maxFiles: 5,
colorize: false,
>,
console: level: 'debug',
handleExceptions: true,
json: false,
colorize: true,
>,
>;
// instantiate a new Winston Logger with the settings defined above
var logger = new winston.Logger( transports: [
new winston.transports.File(options.file),
new winston.transports.Console(options.console)
],
exitOnError: false, // do not exit on handled exceptions
>);
// create a stream object with a 'write' function that will be used by `morgan`
logger.stream = write: function(message, encoding) // use the 'info' log level so the output will be picked up by both transports (file and console)
logger.info(message);
>,
>;
module.exports = logger;

Сохраните и закройте файл.

4: Интеграция Winston в приложение

Чтобы регистратор работал в вашем приложении, необходимо сообщить о нем express. В разделе 2 конфигурация express была помещена в файл app.js. Импортируйте регистратор в этот файл. Откройте файл для редактирования, выполнив:

Импортируйте winston в начале файла:

.
var winston = require('./config/winston');
.

Сохраните и закройте файл.

Теперь можно увидеть некоторые данные логов. Если вы перезагрузите страницу в веб-браузере, в консоли SSH-сессии А вы увидите такой вывод:

[nodemon] restarting due to changes.
[nodemon] starting `node bin/www`
info: ::ffff:72.80.124.207 - - [07/Mar/2018:17:29:36 +0000] "GET / HTTP/1.1" 304 - "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36"
info: ::ffff:72.80.124.207 - - [07/Mar/2018:17:29:37 +0000] "GET /stylesheets/style.css HTTP/1.1" 304 - "http://167.99.4.120:3000/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36"

Здесь есть две записи: первая для запроса на HTML-страницу, вторая для сопровождаемой таблицы стилей. Поскольку каждый транспорт поддерживает уровень логирования info, вы также должны увидеть аналогичную информацию в файле

/myApp/logs/app.log. Однако вывод должен быть записан как объект JSON, поскольку вы указали json: true в конфигурации транспорта file.

Чтобы просмотреть содержимое лога, выполните следующую команду:

Пакет express-generator по умолчанию включает страницы ошибок 404 и 500. Откройте файл

Найдите в конце файла такой блок кода:

Это конечный маршрут обработки ошибок, который в итоге отправит ответ об ошибке обратно клиенту. Поскольку все ошибки на стороне сервера будут выполняться через этот маршрут, здесь можно включить регистратор winston.

Обновите маршрут обработчика ошибок:

Выйдите и сохраните файл.

Теперь еще раз посмотрите на консоль в сессии A. В логе должна быть запись об ошибке, и благодаря цветному выводу ее можно легко найти.

[nodemon] starting `node bin/www`
error: 404 - Not Found - /foo - GET - ::ffff:72.80.124.207
info: ::ffff:72.80.124.207 - - [07/Mar/2018:17:40:11 +0000] "GET /foo HTTP/1.1" 404 985 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36"
info: ::ffff:72.80.124.207 - - [07/Mar/2018:17:40:11 +0000] "GET /stylesheets/style.css HTTP/1.1" 304 - "http://167.99.4.120:3000/foo" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36"

Что касается регистратора файлов, его можно снова проверить с помощью tail:

Заключение

Winston поддерживает еще много полезных функций. Вы можете настроить более сложную систему логирования – по мере усложнения приложения это станет необходимо. Рекомендуем вам взглянуть на эти ссылки:

express_21n

Всем привет! Для того чтобы дальше разрабатывать это приложение, нам нужно сделать еще две важные вещи , а именно, конфигурация и логирование. Для того чтобы конфигурировать, будем использовать модуль nconf :

Ведь совсем не дело, когда в приложении прописываются порт 3000 , в дальнейшем нам понадобится указывать соединение к базе данных и т.д. Соответственно, ставим nconf и теперь можно посмотреть документацию. Можно конфигурировать этот модуль, то есть, подключаем и дальше говорим, откуда этому модулю читать конфигурацию. Вот такая строка:

означает: прочитать конфигурацию из командной строки, из переменных окружений и из файла. Сейчас создадим директорию config , в ней же создам index.js , а в ней подключим nconf . Затем в нее скопируем конфигурацию из документации немного ее изменив (файл будет из текущей директории) указываем путь:

Подключаем модуль config в app.js :

node_path

немного изменяя конфигурацию запуска, чтобы оно находило этот модуль, нужно добавить NODE_PATH.

Также в app.js добавляем метод config.get :

console . log ( 'Express server listening on port ' + config . get ( 'port' ) ) ;

Следующее, что нужно сделать, это поставить логгер:

Будем использовать свою обертку над winston . Для того чтобы было ее куда положить, сделаем директорию libs . В нее будем класть те модули и файлы, которые никуда не выпадают, но куда-то положить их нужно. В данном случае логирование – файл log.js, (создадим его), который будет в этой директории. Вот пример такой обертки:

var path = module . filename . split ( '\\' ) . slice ( - 2 ) . join ( '\\' ) ;

Получаем окружение. В нашем файле log.js будем брать окружение напрямую с NODE_ENV . Чтобы это работало, добавим в конфинурацию запуска NODE_ENV development.

node_path2

Что делает эта обертка? Если кто-то подключает логгер (добавим запись в app.js ) , например:

то функция getLogger берет модуль и генерирует для него специальный объект логгера. В нем могут быть включены какие-то транспорты, какие-то отключены, стоять правильный уровень логирования и.т.д, единственная разница – метка. Давайте посмотрим, что это такое, как оно будет работать.

Берем логгер и вместо console.log делаем log.info :

log . info ( 'Express server listening on port ' + config . get ( 'port' ) ) ;

Запускаем. Логгер выводит, во-первых, все разными цветами, во-вторых, если development, то он выводит debug уровень и выше, а если остается на production, тогда error . В данном случае – development, поэтому мы все видим.

Кроме того, у этого логгера есть метка:

то есть, из какого файла вообще пришла эта запись. Иногда бывает очень интересно узнать. Соответственно, берем module.filename и получаем 2 последних элемента пути. Теперь время двигаться дальше.

Мы займемся тем, что выведем нормальную HTML страницу. У нас есть какие-то Middleware , мы их порежем и возьмем Middleware , которые у нас были встроены в Express. Нам нужны настройки

if ( req . method == 'GET' && urlParsed . pathname == '/echo' && urlParsed . query . message ) <

Это означает, что перейдя по браузерному url, я получу однообразную кашу из всех записей, что делает скрипт.

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

Для этого используются специализированные модули. Рекордсмен по простоте, это модуль DEBUG.

Модуль debug

screenshot_19_01

screenshot_19_02

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

if ( req . method == 'GET' && urlParsed . pathname == '/echo' && urlParsed . query . message ) <

Итак, запускаю, сейчас не из WebStorm а через терминал

screenshot_19_03

screenshot_19_04

C : \ node \ server > set DEBUG = server : request , % DEBUG %

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

И так возвращаемся к нашему серверу. Мы добавили значение в переменную DEBUG

screenshot_19_06

теперь посмотрим какое значение имеет переменная DEBUG

screenshot_19_07

Судя по значению должно выводить логи из обоих файлов, проверим

screenshot_19_08


вот и второй файл и логи в нем отработали.

screenshot_19_10


Все работает по прежнему.

Модуль winston

может быть средней важности при отладке. Эта информация

может быть неважной. Эта информация может быть очень важной

screenshot_19_12

if ( req . method == 'GET' && urlParsed . pathname == '/echo' && urlParsed . query . message ) <

Для того чтобы логировать, я должен вызвать соответствующий метод этого объекта

screenshot_19_13

if ( req . method == 'GET' && urlParsed . pathname == '/echo' && urlParsed . query . message ) <

Он экспортирует функцию, которая принимает модуль для которого нужно сделать логирование и возвращает winston настроенный соответственно его пути

а если это что-то другое то другим

Второй транспорт здесь это файл

ну, а для других путей, мы будем возвращать winston вообще без транспортов.

соответствующие вызовы log, с одной стороны не будут вызывать ошибку, а с другой стороны такая запись никуда не пойдет.

screenshot_19_14

Итак мы с вами рассмотрели отладку,

во первых, при помощи модуля debug, который с одной стороны весьма прост, с другой стороны позволяет указать какую ветку кода логировать, и вообще для большинства задач разработки его вполне хватает.

Но если требуется более серьезное логирование, в том числе в несколько мест одновременно, или в базу данных или в файл, тогда имеет смысл обратить внимание на другой модуль, который называется winston. Его можно гибко настраивать в том числе при помощи обертки.

NODE_DEBUG

Например, мы хотим посмотреть, что передается по сети. Для этого нужно запустить ноду, сначала установив переменную окружения

Читайте также: