Node-RED:Руководство пользователя/Логирование

Материал из Онлайн справочника
Перейти к навигации Перейти к поиску

Перевод: Максим Кузьмин (Cubewriter) Контакты:</br>* Skype: cubewriter</br>* E-mail: cubewriter@gmail.com</br>* Максим Кузьмин на freelance.ru
Проверка/Оформление/Редактирование: Мякишев Е.А.


Pixel Art Mini Meow Animated.gif Черновик


Логирование[1]

По умолчанию Node-RED использует для логирования инструмент («логгер»), отправляющий сообщения-логи в терминал. Он также поддерживает для логирования модули с пользовательскими настройками, в которых можно задать отправку сообщений куда угодно.

Логирование в терминал

Запись логов в терминал можно задать в свойстве «logging» в файле «settings.js».

// Настройка вывода логов:
logging: {
    // Вывод логов в терминал:
    console: {
        level: "info",
        metrics: false,
        audit: false
    }
}

Поведение логгера задается с помощью 3 свойств:

Свойство «level»

Здесь задается уровень логирования. Возможны следующие варианты:

  • «fatal» – только сообщения об ошибках, делающих приложение непригодным к использованию
  • «error» – сообщения об ошибках, считающихся фатальными при выполнении некоторых запросов
  • «warn» – сообщения о не фатальных ошибках
  • «info» – общая информация о работе приложения
  • «debug» – более подробная информация, чем в «info»
  • «trace» – очень подробная информация о работе приложения
  • «off» – отключения логирования

Кроме того, на всех уровнях (кроме «off») дополнительно осуществляется отправка сообщений более высокого уровня. К примеру, при использовании уровня «warn» также будут отправляться сообщения уровней «error» и «fatal».

Свойство «metrics»

Если задать здесь «true», среда выполнения Node-RED начнет сообщать информацию о ходе выполнения потока и использовании памяти.

В логи будут записываться входящие и исходящие события каждой ноды. К примеру, сообщения ниже – это логи от потока, имеющего ноды «Inject» и «Debug».

9 Mar 13:57:53 - [metric] {"level":99,"nodeid":"8bd04b10.813f58","event":"node.inject.receive","msgid":"86c8212c.4ef45","timestamp":1489067873391}
9 Mar 13:57:53 - [metric] {"level":99,"nodeid":"8bd04b10.813f58","event":"node.inject.send","msgid":"86c8212c.4ef45","timestamp":1489067873392}
9 Mar 13:57:53 - [metric] {"level":99,"nodeid":"4146d01.5707f3","event":"node.debug.receive","msgid":"86c8212c.4ef45","timestamp":1489067873393}

Сообщения об использовании памяти пишутся в логи каждые 15 секунд.

9 Mar 13:56:24 - [metric] {"level":99,"event":"runtime.memory.rss","value":97517568,"timestamp":1489067784815}
9 Mar 13:56:24 - [metric] {"level":99,"event":"runtime.memory.heapTotal","value":81846272,"timestamp":1489067784817}
9 Mar 13:56:24 - [metric] {"level":99,"event":"runtime.memory.heapUsed","value":59267432,"timestamp":1489067784817}

Свойство «audit»

Если задать здесь «true», в логи начнут писаться сообщения о событиях, связанных с HTTP-доступом к админскому API. В этих сообщениях также будет информация о конечных точках, доступ к которым был получен, IP-адрес и метка времени.

Если у вас включена настройка «adminAuth», в этих сообщениях также будет информация о пользователе, запросившем доступ.

9 Mar 13:49:42 - [audit] {"event":"library.get.all","type":"flow","level":98,"path":"/library/flows","ip":"127.0.0.1","timestamp":1489067382686}
9 Mar 14:34:22 - [audit] {"event":"flows.set","type":"full","version":"v2","level":98,"user":{"username":"admin","permissions":"write"},"path":"/flows","ip":"127.0.0.1","timestamp":1489070062519}

Использование модуля с собственными настройками

Для логирования также можно использовать модуль с собственными настройками. К примеру, сообщения, отправка которых активируется в свойстве «metrics», можно перенаправить на другую систему, чтобы отслеживать на ней производительность проекта.

Чтобы воспользоваться собственным логгером, нужно будет отредактировать файл «settings.js», добавив в свойство «logging» новый блок:

// Настройка вывода логов:
logging: {
    // Вывод логов в терминал:
    console: {
        level: "info",
        metrics: false,
        audit: false
    },
    // Мой логгер:
    myCustomLogger: {
        level: 'debug',
        metrics: true,
        handler: function(settings) {
            return function(msg) {
                console.log(msg.timestamp, msg.event);
            }
        }
    }
}

Как видите, к логгеру по умолчанию, отправляющему логи в терминал (он имеет описанные выше свойства «level», «metrics» и «audit»), добавлен новый логгер с настройками пользователя. В нем есть свойство «handler», задающее обработчика логов с настройками пользователя. Это функция, которая вызывается один раз при запуске Node-RED и получающая данные о настройках логгера. Она должна вернуть функцию, записывающую сообщения в логи.

Если нужно, вы можете настроить несколько логгеров со своими настройками, но ни один из них не должен называться «console», т.к. это название уже зарезервировано.

Пример логгера

Пример ниже задает в настройках логгер, отправляющий metrics-события экземпляру Logstash через TCP-соединение.

Это очень примитивный пример – в нем нет ни обработки ошибок, ни кода для переподключения.

logging: {
    console: {
        level: "info",
        metrics: false,
        audit: false
    },
    logstash: {
        level:'off',
        metrics:true,
        handler: function(conf) {
            var net = require('net');
            var logHost = '192.168.99.100',logPort = 9563;
            var conn = new net.Socket();
            conn.connect(logPort,logHost)
                .on('connect',function() {
                    console.log("Logger connected")
                            //  "Логгер подключился"
                })
                .on('error', function(err) {
                    // В целях проверки попробуйте подключиться
                    // к этой точке доступа не через Node-RED.
                    // Завершаем работу этой функции...
                    process.exit(1);
                });
            // Возвращаем функцию, выполняющую логирование:
            return function(msg) {
                var message = {
                    '@tags': ['node-red', 'test'],
                    '@fields': msg,
                    '@timestamp': (new Date(msg.timestamp)).toISOString()
                }
                try {
                    conn.write(JSON.stringify(message)+"\n");
                }catch(err) { console.log(err);}
            }
        }
    }
}

См.также

Внешние ссылки