Я написал следующий код для отправки журналов в удаленный системный журнал (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 и так далее ...