此代码使用log4cplus将日志发送到远程syslog服务器是否正确?

时间:2019-03-27 06:10:52

标签: c++ visual-studio-2017 syslog log4cplus

有人可以告诉我这是使用SysLogAppender中的log4cplus的正确方法吗?我找不到适合log4cplus的example。我需要将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. 我能够使用上述代码将日志发送到远程syslog。但是使用log4cplus APIs的这种正确方法吗?在上面的代码示例中,问题以注释的形式给出。

  2. 为什么我们需要使用log4cplus::initializer?我无法在我的代码中导入log4cplus / initializer.h。

1 个答案:

答案 0 :(得分:0)

在我看来,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

我希望不会太晚,希望对您有帮助