почему приемник syslog отправляет одинаковые записи на все приемники, когда приемник является членом класса? - PullRequest
0 голосов
/ 04 апреля 2019

Я написал следующий код для отправки журналов в удаленный системный журнал (rsyslog on remote unix machine) из my windows machine с использованием boost-log.Я использую syslog_backend.

#include <boost/config.hpp>
#if !defined(BOOST_WINDOWS)
#define BOOST_LOG_USE_NATIVE_SYSLOG
#endif

#include <string>
#include <iostream>
#include <boost/smart_ptr/shared_ptr.hpp>

#include <boost/log/common.hpp>
#include <boost/log/expressions.hpp>
#include <boost/log/attributes.hpp>
#include <boost/log/sinks/sync_frontend.hpp>
#include <boost/log/sinks/syslog_backend.hpp>


namespace logging = boost::log;
namespace attrs = boost::log::attributes;
namespace src = boost::log::sources;
namespace sinks = boost::log::sinks;
namespace expr = boost::log::expressions;
namespace keywords = boost::log::keywords;

using boost::shared_ptr;
using namespace std;

class AlertsForSyslog
{
    string hostname;
    string message;
    src::severity_logger<> lg;
    boost::shared_ptr< sinks::synchronous_sink< sinks::syslog_backend > > sink;

public :
    AlertsForSyslog(string hostname);
    int sendMessageToSyslog(string message);
    void dd();
};

AlertsForSyslog::AlertsForSyslog(string hostname)
{
    this->hostname = hostname;
    sink = boost::shared_ptr<sinks::synchronous_sink< sinks::syslog_backend >>(new sinks::synchronous_sink< sinks::syslog_backend >());
}


int AlertsForSyslog::sendMessageToSyslog(string message)
{
        this->message = message;
        sink->set_formatter
        (
            expr::format("%1%")
            %expr::smessage
        );

        sink->locked_backend()->set_target_address(hostname);


        // Add the sink to the core
        logging::core::get()->add_sink(sink);

    return 0;
}

    void AlertsForSyslog::dd()
    {
        BOOST_LOG_SEV(lg, sinks::syslog::alert) << message ;
    }



int main()
{
    cout << "hello";
    AlertsForSyslog n1 = AlertsForSyslog("172.16.72.239");
    n1.sendMessageToSyslog("from n1");
    AlertsForSyslog n2 = AlertsForSyslog("172.16.72.239");
    n2.sendMessageToSyslog("from n2");
    AlertsForSyslog n3 = AlertsForSyslog("172.16.72.239");
    n3.sendMessageToSyslog("from n3");
    n1.dd();
    n2.dd();
    n3.dd();
    return 0;
}

Приведенный выше код дает мне следующий вывод в /var/log/messages моего компьютера с Unix:

Apr  4 21:33:58 mypc from n1
Apr  4 21:33:58 mypc from n1
Apr  4 21:33:58 mypc from n1
Apr  4 21:33:58 mypc from n2
Apr  4 21:33:58 mypc from n2
Apr  4 21:33:58 mypc from n3
Apr  4 21:33:58 mypc from n3
Apr  4 21:33:58 mypc from n2
Apr  4 21:33:58 mypc from n3

1) почему то же сообщение («от n1»)отправлено через все 3 раковины?

2) Моё требование к приложению: приложение запускает несколько потоков, и каждый поток создает объект AlertsForSyslog, и, следовательно, каждый поток хочет отправлять журналы независимо.

3) Есть ли способ, которым я могу этого достичь?В моем случае, что именно shared_ptr делает?Может кто-нибудь помочь?

Я хочу написать код, который выдаст вывод в указанном выше случае:

Apr  4 21:33:58 mypc from n1
Apr  4 21:33:58 mypc from n2
Apr  4 21:33:58 mypc from n3

Может кто-нибудь предложить какие-либо исправления в приведенном выше коде?В моем приложении вместо основной функции thread1 будет создавать объект n1, thread2 будет создавать n2 и так далее ...

...