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 поддерживает еще много полезных функций. Вы можете настроить более сложную систему логирования – по мере усложнения приложения это станет необходимо. Рекомендуем вам взглянуть на эти ссылки:
Всем привет! Для того чтобы дальше разрабатывать это приложение, нам нужно сделать еще две важные вещи , а именно, конфигурация и логирование. Для того чтобы конфигурировать, будем использовать модуль nconf :
Ведь совсем не дело, когда в приложении прописываются порт 3000 , в дальнейшем нам понадобится указывать соединение к базе данных и т.д. Соответственно, ставим nconf и теперь можно посмотреть документацию. Можно конфигурировать этот модуль, то есть, подключаем и дальше говорим, откуда этому модулю читать конфигурацию. Вот такая строка:
означает: прочитать конфигурацию из командной строки, из переменных окружений и из файла. Сейчас создадим директорию config , в ней же создам index.js , а в ней подключим nconf . Затем в нее скопируем конфигурацию из документации немного ее изменив (файл будет из текущей директории) указываем путь:
Подключаем модуль config в app.js :
немного изменяя конфигурацию запуска, чтобы оно находило этот модуль, нужно добавить NODE_PATH.
Также в app.js добавляем метод config.get :
Следующее, что нужно сделать, это поставить логгер:
Будем использовать свою обертку над winston . Для того чтобы было ее куда положить, сделаем директорию libs . В нее будем класть те модули и файлы, которые никуда не выпадают, но куда-то положить их нужно. В данном случае логирование – файл log.js, (создадим его), который будет в этой директории. Вот пример такой обертки:
var path = module . filename . split ( '\\' ) . slice ( - 2 ) . join ( '\\' ) ;Получаем окружение. В нашем файле log.js будем брать окружение напрямую с NODE_ENV . Чтобы это работало, добавим в конфинурацию запуска NODE_ENV development.
Что делает эта обертка? Если кто-то подключает логгер (добавим запись в 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
но этого мало, при подключении нужно указать идентификатор, которым он будет метить весь вывод из данного файла
if ( req . method == 'GET' && urlParsed . pathname == '/echo' && urlParsed . query . message ) <Итак, запускаю, сейчас не из WebStorm а через терминал
К стати проверить значение переменной можно в любой момент, введя в консоле такую команду
И так возвращаемся к нашему серверу. Мы добавили значение в переменную DEBUG
теперь посмотрим какое значение имеет переменная DEBUG
Судя по значению должно выводить логи из обоих файлов, проверим
вот и второй файл и логи в нем отработали.
Все работает по прежнему.
Модуль winston
может быть средней важности при отладке. Эта информация
может быть неважной. Эта информация может быть очень важной
Для того чтобы логировать, я должен вызвать соответствующий метод этого объекта
Он экспортирует функцию, которая принимает модуль для которого нужно сделать логирование и возвращает winston настроенный соответственно его пути
а если это что-то другое то другим
Второй транспорт здесь это файл
ну, а для других путей, мы будем возвращать winston вообще без транспортов.
соответствующие вызовы log, с одной стороны не будут вызывать ошибку, а с другой стороны такая запись никуда не пойдет.
Итак мы с вами рассмотрели отладку,
во первых, при помощи модуля debug, который с одной стороны весьма прост, с другой стороны позволяет указать какую ветку кода логировать, и вообще для большинства задач разработки его вполне хватает.
Но если требуется более серьезное логирование, в том числе в несколько мест одновременно, или в базу данных или в файл, тогда имеет смысл обратить внимание на другой модуль, который называется winston. Его можно гибко настраивать в том числе при помощи обертки.
NODE_DEBUG
Например, мы хотим посмотреть, что передается по сети. Для этого нужно запустить ноду, сначала установив переменную окружения
Читайте также: