5 #include "fmt/format.h"
17 #include <fmt/format.h>
21 #include <sys/socket.h>
49 m_file = fopen(path.c_str(),
"ae");
52 throw std::runtime_error(fmt::format(
53 "Could not open log file: {}", strerror(errno)
67 memset(&tv, 0,
sizeof(tv));
68 gettimeofday(&tv,
nullptr);
71 memset(&btime, 0,
sizeof(tv));
72 localtime_r(&tv.tv_sec, &btime);
75 strftime(timeString,
sizeof(timeString),
"%a %F %T", &btime);
77 unsigned int len =
event.message.length();
78 while(len != 0 && (event.
message[len-1] ==
'\n' || event.
message[len-1] ==
'\r'))
81 fmt::print(
m_file,
"{}.{:03d}: {:>20}: ",
82 timeString, tv.tv_usec / 1000,
95 m_tag = fmt::format(
"rosmon@{}", launchFileName);
96 openlog(
m_tag.c_str(), 0, LOG_USER);
101 syslog(prioFromEventType(event.
type),
"%20s: %s", event.
source.c_str(), event.
message.c_str());
106 : m_launchFileName{launchFileName}
108 m_fd = socket(AF_UNIX, SOCK_DGRAM, 0);
110 throw std::runtime_error{fmt::format(
"Could not create socket: {}", strerror(errno))};
112 int size = 8*1024*1024;
113 if(setsockopt(m_fd, SOL_SOCKET, SO_SNDBUF, &size,
sizeof(size)) < 0)
114 perror(
"WARNING: Could not increase SO_SNDBUF size");
117 addr.sun_family = AF_UNIX;
118 strncpy(addr.sun_path,
"/run/systemd/journal/socket",
sizeof(addr.sun_path)-1);
120 if(connect(m_fd,
reinterpret_cast<const sockaddr*
>(&addr),
sizeof(addr)) != 0)
121 throw NotAvailable{fmt::format(
"Systemd Journal not available: {}", strerror(errno))};
132 fmt::memory_buffer buffer;
134 fmt::format_to(std::back_inserter(buffer),
136 "ROSMON_LAUNCH_FILE={}\n"
138 "SYSLOG_IDENTIFIER=rosmon@{}\n",
139 prioFromEventType(event.
type),
145 std::string msg = fmt::format(
"{}: {}", event.
source, event.
message);
147 if(msg.find(
'\n') == std::string::npos)
148 fmt::format_to(std::back_inserter(buffer),
"MESSAGE={}\n", msg);
151 buffer.append(std::string{
"MESSAGE\n"});
152 std::array<uint8_t, 8> size;
153 uint64_t sizeInt = msg.length();
154 for(
int i = 0; i < 8; ++i)
156 size[i] = sizeInt & 0xFF;
162 buffer.append(std::string{
"\n"});
165 if(write(
m_fd, buffer.data(), buffer.size()) < 0)
166 fprintf(stderr,
"Could not write to systemd log: %s\n", strerror(errno));