Правильно ли этот код для отправки журналов на удаленный сервер системного журнала, используя log4cplus? - PullRequest
0 голосов
/ 27 марта 2019

Может кто-нибудь сказать, если это правильный способ использования SysLogAppender из log4cplus?Я не нашел правильного example для log4cplus.Мне нужно отправить numerous журналы на удаленный сервер системного журнала.

main.cpp
int main()
{
SysLogHelper syslogHelper;
int errCode = syslogHelper.initialize("172.16.72.239");
    errCode = syslogHelper.sendLogstoSyslog("send testing log");
    // I need to send numerous logs to syslog
}

syslog.cpp

#include <log4cplus/syslogappender.h>
#include <log4cplus/spi/loggingevent.h>
#include <log4cplus/logger.h>

class SysLogHelper 
{
    string hostname;
    log4cplus::SysLogAppender *syslogAppender;
        // is it necessary to create a pointer? I am not able to use log4cplus in a class without creating a pointer? Is there any other way?
    log4cplus::spi::InternalLoggingEvent syslogLoggingEvent;

        public:
    SysLogHelper();
    int initialize(string hostname);
    int sendLogstoSyslog(string message);
};

SysLogHelper::SysLogHelper()
{
    hostname = "";
    syslogAppender = NULL;
}

int SysLogHelper::initialize(string hostname)
{
    syslogAppender = new log4cplus::SysLogAppender("ident", hostname);
        //I am not getting what is "ident" here? what input is expected?
    return 0;
}

int SysLogHelper::sendLogstoSyslog(string message)
{
    syslogLoggingEvent.setLoggingEvent( 
    log4cplus::Logger::getInstance(LOG4CPLUS_TEXT("test")).getName(),    
    log4cplus::FATAL_LOG_LEVEL, LOG4CPLUS_TEXT(message),__FILE__, 
    __LINE__, "main");
syslogAppender->doAppend(syslogLoggingEvent);
    //Is this correct method of sending logs to syslog?
return 0;
}

вопросы:

  1. Я могу отправлять журналы на удаленный системный журнал, используя приведенный выше код.Но правильно ли это использовать log4cplus APIs?Вопросы даны в виде комментариев в приведенном выше примере кода.

  2. Почему нам нужно использовать log4cplus::initializer?Я не могу импортировать log4cplus / initializer.h в моем коде.

1 Ответ

0 голосов
/ 11 апреля 2019

По моему мнению, философией в основе библиотеки Log4cplus является то, что вы можете иметь в своем приложении один или несколько регистраторов, и для каждого регистратора вы можете иметь один или несколько выходных данных, называемых «appender». Внутри вашего приложения вы должны работать с регистратором, и вам все равно, какой аппендер связан с регистратором. Это понятно, например, если вы используете файл свойств для настройки и настройки вашего регистратора. Кстати, здесь ниже я покажу, что я сделал для настройки syslog внутри моего приложения в обоих случаях:

настройка приложения syslog внутри кода:

#include <log4cplus/logger.h>
#include <log4cplus/fileappender.h>
#include <log4cplus/syslogappender.h>
#include <log4cplus/layout.h>
#include <log4cplus/ndc.h>
#include <log4cplus/helpers/loglog.h>
#include <log4cplus/helpers/property.h>
#include <log4cplus/loggingmacros.h>
#include <log4cplus/configurator.h>
#include <log4cplus/helpers/stringhelper.h>
#include <log4cplus/helpers/fileinfo.h>
#include <TCHAR.h>

using namespace std;
using namespace log4cplus;
using namespace log4cplus::helpers;
using namespace log4cplus;

int main()
{
    log4cplus::initialize ();

    Logger root = Logger::getRoot();
    // log level INFO: you don't see TRACE and DEBUG on your syslogserver
    root.setLogLevel(log4cplus::INFO_LOG_LEVEL);
    SharedObjectPtr<Appender>  ptrSys(
                                       new SysLogAppender( 
                                      _T("mysyslog"), 
                                      _T("localhost"), 
                                      514,
                                      _T("user"))) ;
    root.addAppender(ptrSys);
    for(int i=0; i<100; ++i) 
    {

        LOG4CPLUS_TRACE(root, LOG4CPLUS_TEXT("Error log test"));  //not visible
        LOG4CPLUS_DEBUG(root, LOG4CPLUS_TEXT("Debug log test"));  //not visible
        LOG4CPLUS_INFO(root, LOG4CPLUS_TEXT("Info log test"));
        LOG4CPLUS_WARN(root, LOG4CPLUS_TEXT("Warning log test"));
        LOG4CPLUS_ERROR(root, LOG4CPLUS_TEXT("Error log test"));
    }
    log4cplus::Logger::shutdown();
    return 0;
}

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

#include <log4cplus/logger.h>
#include <log4cplus/fileappender.h>
#include <log4cplus/syslogappender.h>
#include <log4cplus/layout.h>
#include <log4cplus/ndc.h>
#include <log4cplus/helpers/loglog.h>
#include <log4cplus/helpers/property.h>
#include <log4cplus/loggingmacros.h>
#include <log4cplus/configurator.h> 
#include <log4cplus/helpers/stringhelper.h>
#include <log4cplus/helpers/fileinfo.h>
#include <TCHAR.h>

using namespace std;
using namespace log4cplus;
using namespace log4cplus::helpers;
using namespace log4cplus;

log4cplus::tstring getPropertiesFileArgument (std::wstring argv)
{   
    log4cplus::tstring file = LOG4CPLUS_C_STR_TO_TSTRING (argv);
    log4cplus::helpers::FileInfo fi;
    if (getFileInfo (&fi, file) == 0)
        return file;

    return LOG4CPLUS_TEXT ("log4cplus.properties");
}

int main()
{
    log4cplus::initialize ();
 PropertyConfigurator::doConfigure(  getPropertiesFileArgument(_T("c:\\ConfigLog.properties")));

Logger root = Logger::getRoot();
for(int i=0; i<100; ++i) {

    LOG4CPLUS_TRACE(root, LOG4CPLUS_TEXT("Error log test"));
    LOG4CPLUS_DEBUG(root, LOG4CPLUS_TEXT("Debug log test"));
    LOG4CPLUS_INFO(root, LOG4CPLUS_TEXT("Info log test"));
    LOG4CPLUS_WARN(root, LOG4CPLUS_TEXT("Warning log test"));
    LOG4CPLUS_ERROR(root, LOG4CPLUS_TEXT("Error log test"));

}
log4cplus::Logger::shutdown();

return 0;

}

файл configlog.properties выглядит примерно так

log4cplus.rootLogger=INFO, syslog

log4cplus.appender.syslog=log4cplus::SysLogAppender
log4cplus.appender.syslog.ident=syslog
log4cplus.appender.syslog.layout=log4cplus::PatternLayout 
log4cplus.appender.syslog.layout.ConversionPattern=[%T] %-5p %b %x - %m%n
log4cplus.appender.syslog.host=localhost
log4cplus.appender.syslog.udp=true
log4cplus.appender.syslog.port=514
log4cplus.appender.syslog.facility=user

Я надеюсь, что не слишком поздно, и я надеюсь, что это может быть полезно для вас

...