5 #include "fmt/format.h" 16 #include <fmt/format.h> 20 #include <sys/socket.h> 48 m_file = fopen(path.c_str(),
"ae");
51 throw std::runtime_error(fmt::format(
52 "Could not open log file: {}", strerror(errno)
66 memset(&tv, 0,
sizeof(tv));
67 gettimeofday(&tv,
nullptr);
70 memset(&btime, 0,
sizeof(tv));
71 localtime_r(&tv.tv_sec, &btime);
74 strftime(timeString,
sizeof(timeString),
"%a %F %T", &btime);
76 unsigned int len =
event.message.length();
77 while(len != 0 && (event.
message[len-1] ==
'\n' || event.
message[len-1] ==
'\r'))
80 fmt::print(
m_file,
"{}.{:03d}: {:>20}: ",
81 timeString, tv.tv_usec / 1000,
94 m_tag = fmt::format(
"rosmon@{}", launchFileName);
95 openlog(m_tag.c_str(), 0, LOG_USER);
100 syslog(prioFromEventType(event.
type),
"%20s: %s", event.
source.c_str(),
event.message.c_str());
105 : m_launchFileName{launchFileName}
107 m_fd = socket(AF_UNIX, SOCK_DGRAM, 0);
109 throw std::runtime_error{fmt::format(
"Could not create socket: {}", strerror(errno))};
111 int size = 8*1024*1024;
112 if(setsockopt(
m_fd, SOL_SOCKET, SO_SNDBUF, &size,
sizeof(size)) < 0)
113 perror(
"WARNING: Could not increase SO_SNDBUF size");
116 addr.sun_family = AF_UNIX;
117 strncpy(addr.sun_path,
"/run/systemd/journal/socket",
sizeof(addr.sun_path)-1);
119 if(connect(
m_fd, reinterpret_cast<const sockaddr*>(&addr),
sizeof(addr)) != 0)
120 throw NotAvailable{fmt::format(
"Systemd Journal not available: {}", strerror(errno))};
131 fmt::memory_buffer buffer;
133 fmt::format_to(std::back_inserter(buffer),
135 "ROSMON_LAUNCH_FILE={}\n" 137 "SYSLOG_IDENTIFIER=rosmon@{}\n",
138 prioFromEventType(event.
type),
144 std::string msg = fmt::format(
"{}: {}", event.
source, event.
message);
146 if(msg.find(
'\n') == std::string::npos)
147 fmt::format_to(std::back_inserter(buffer),
"MESSAGE={}\n", msg);
150 buffer.append(std::string{
"MESSAGE\n"});
151 std::array<uint8_t, 8> size;
152 uint64_t sizeInt = msg.length();
153 for(
int i = 0; i < 8; ++i)
155 size[i] = sizeInt & 0xFF;
161 buffer.append(std::string{
"\n"});
164 if(write(
m_fd, buffer.data(), buffer.size()) < 0)
165 fprintf(stderr,
"Could not write to systemd log: %s\n", strerror(errno));
void log(const LogEvent &event) override
std::string m_launchFileName
void log(const LogEvent &event) override
Log message.
FileLogger(const std::string &path, bool flush=false)
Constructor.
SyslogLogger(const std::string &launchFileName)
~SystemdLogger() override
SystemdLogger(const std::string &launchFileName)
void log(const LogEvent &event) override