22 char server_ip[16] = {0};
26 SyslogFacility facility = SyslogFacility::SYSLOG_FAC_LOCAL0;
30static SyslogCtx s_syslog;
32static void copy_field(
char *dst,
size_t cap,
const char *src)
39 strncpy(dst, src, cap - 1);
43void pc_syslog_init(
const char *server_ip, uint16_t port,
const char *hostname,
const char *appname,
44 SyslogFacility facility)
46 copy_field(s_syslog.server_ip,
sizeof(s_syslog.server_ip), server_ip);
48 copy_field(s_syslog.hostname,
sizeof(s_syslog.hostname), hostname);
49 copy_field(s_syslog.appname,
sizeof(s_syslog.appname), appname);
50 s_syslog.facility = facility;
51 s_syslog.ready = (s_syslog.server_ip[0] !=
'\0');
56static inline bool sl_append(
char *out,
size_t cap,
size_t *pos,
const char *src,
size_t len)
58 if (*pos + len > cap - 1)
62 memcpy(out + *pos, src, len);
67size_t pc_syslog_format(
char *out,
size_t cap, SyslogFacility facility, SyslogSeverity severity,
const char *hostname,
68 const char *appname,
const char *msg)
78 int pri = (int)facility * 8 + (
int)severity;
83 const char *h = (hostname && hostname[0]) ? hostname :
"-";
84 const char *a = (appname && appname[0]) ? appname :
"-";
85 const char *m = msg ? msg :
"";
94 prib[pl++] = (char)(
'0' + pri / 100);
98 prib[pl++] = (char)(
'0' + (pri / 10) % 10);
100 prib[pl++] = (char)(
'0' + pri % 10);
106 if (!sl_append(out, cap, &pos,
"<", 1) || !sl_append(out, cap, &pos, prib, pl) ||
107 !sl_append(out, cap, &pos,
">1 - ", 5) || !sl_append(out, cap, &pos, h, strnlen(h, cap)) ||
108 !sl_append(out, cap, &pos,
" ", 1) || !sl_append(out, cap, &pos, a, strnlen(a, cap)) ||
109 !sl_append(out, cap, &pos,
" - - - ", 7) || !sl_append(out, cap, &pos, m, strnlen(m, cap)))
117bool pc_syslog_log(SyslogSeverity severity,
const char *msg)
123 size_t n = pc_syslog_format(s_syslog.buf,
sizeof(s_syslog.buf), s_syslog.facility, severity, s_syslog.hostname,
124 s_syslog.appname, msg);
129 return pc_udp_sendto(s_syslog.server_ip, s_syslog.port, (
const uint8_t *)s_syslog.buf, n);
#define PC_SYSLOG_MSG_MAX
Maximum formatted syslog datagram length in bytes (RFC 5424 line).
#define PC_SYSLOG_FIELD_MAX
Maximum syslog HOSTNAME / APP-NAME field length (including NUL).
#define PC_SYSLOG_DEFAULT_PORT
Default syslog collector UDP port (RFC 5426 well-known 514; overridable at runtime via pc_syslog_init...
Zero-heap RFC 5424 syslog client over UDP.
bool pc_udp_sendto(const char *dst_ip, uint16_t dst_port, const uint8_t *data, size_t len)
Send a UDP datagram to an arbitrary destination (outbound client).
Layer 4 (Transport) - connectionless UDP datagram service.