библиотека, смешивающая log4Esp и Syslog для esp8266

Кто-то наконец создал новую библиотеку, объединяющую log4esp и syslog? см.: SyslogAppender для log4esp спасибо:!

, 👍0


1 ответ


Лучший ответ:

0

Я проделал довольно грязную (но эффективную для моей цели) работу: создавая новый регистратор, я объявил и прикрепил к нему форматтер log4esp, в который отправил файлы . .. сообщения системного журнала

грязно, грязно, грязно

мои константы конфигурации: SYSLOG_SERVER, SYSLOG_PORT, DEVICE_HOSTNAME, APP_NAME

Мой logger.h:

#ifndef Logging_H
#define Logging_H
#include <Log4Esp.h>
namespace Logging
{
void setup() ;
log4Esp::Logger Logger(const char *name);
}
#endif

мой logger.cpp:

#include <Log4Esp.h>
#include <Syslog.h>
#include <WiFiUdp.h>
#include <ESP8266WiFi.h>
#include "Logger.h"
#include "config.h"
namespace Logging
{
// Экземпляр UDP, позволяющий отправлять и получать пакеты по UDP
WiFiUDP udpClient;
// Создаем новый экземпляр системного журнала с помощью функции LOG_KERN
Syslog syslog(udpClient, SYSLOG_SERVER, SYSLOG_PORT, DEVICE_HOSTNAME, APP_NAME, LOG_KERN);
//новый регистратор
log4Esp::Logger Logger(const char *name)
{
  //новый экземпляр
  log4Esp::Logger logger = log4Esp::Logger(name);
  //минимальный уровень
  logger.addLevelToAll(log4Esp::Appender::LOG_LEVEL);
  // форматирование для последовательного протоколирования
  logger.addFormatterToAll([name](Print & output, log4Esp::Appender::Level level, const char *msg, va_list * args) {
    /////////////////////////////////////////////////////////////////////////////////
    // формат последовательного журнала
    // выводим время работы этой программы в миллисекундах
    output.printf("%10d", millis());
    output.print(log4Esp::Appender::DEFAULT_SEPARATOR);
    // выводим свободное место в куче
    output.printf("(%d)", ESP.getFreeHeap());
    output.print(log4Esp::Appender::DEFAULT_SEPARATOR);
    // имя логгера вывода
    output.printf("%-4s", name);
    output.print(log4Esp::Appender::DEFAULT_SEPARATOR);
    // уровень вывода журнала
    output.print(log4Esp::Appender::toString(level, true));
    if (level <= log4Esp::Appender::Level::ERROR) {
      output.print("***");
    } else {
      output.print("   ");
    }
    output.print(log4Esp::Appender::DEFAULT_SEPARATOR);
    // определяем длину буфера для форматированных данных
    size_t length = vsnprintf(NULL, 0, msg, *args) + 1;
    char buffer[length];
    // выводим отформатированные данные
    vsnprintf(buffer, length, msg, *args);
    output.print(buffer);
    /////////////////////////////////////////////////////////////////////////////////
    // Остановимся здесь, если Wi-Fi не работает
    if (WiFi.status() != WL_CONNECTED)
      return;
    /////////////////////////////////////////////////////////////////////////////////
    // формат системного журнала
    uint16_t slevel;
    switch (level) {
      case log4Esp::Appender::Level::FATAL    :
        slevel = LOG_CRIT;
        break;
      case log4Esp::Appender::Level::ERROR    :
        slevel = LOG_ERR;
        break;
      case log4Esp::Appender::Level::WARNING  :
        slevel = LOG_WARNING;
        break;
      case log4Esp::Appender::Level::VERBOSE  :
        slevel = LOG_INFO;
        break;
      case log4Esp::Appender::Level::TRACE    :
      default:
        slevel = LOG_DEBUG;
        break;
    }
    syslog.logf(slevel, "%10d|(%d)|%-4s|%s", millis(), ESP.getFreeHeap(), name, buffer);
  });
  return logger;
}
void setup() {

}
}
,

Да :) я понял теперь другая ветка! Для меня это тоже идеально, вам следует использовать GitHub :), @cly