11#if DETWS_ENABLE_SYSLOG
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 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');
54size_t syslog_format(
char *out,
size_t cap, SyslogFacility facility, SyslogSeverity severity,
const char *hostname,
55 const char *appname,
const char *msg)
63 int pri = (int)facility * 8 + (
int)severity;
66 const char *h = (hostname && hostname[0]) ? hostname :
"-";
67 const char *a = (appname && appname[0]) ? appname :
"-";
70 int n = snprintf(out, cap,
"<%d>1 - %s %s - - - %s", pri, h, a, msg ? msg :
"");
71 if (n < 0 || (
size_t)n >= cap)
76bool syslog_log(SyslogSeverity severity,
const char *msg)
80 size_t n = syslog_format(s_syslog.buf,
sizeof(s_syslog.buf), s_syslog.facility, severity, s_syslog.hostname,
81 s_syslog.appname, msg);
84 return det_udp_sendto(s_syslog.server_ip, s_syslog.port, (
const uint8_t *)s_syslog.buf, n);
#define DETWS_SYSLOG_DEFAULT_PORT
Default syslog collector UDP port (RFC 5426 well-known 514; overridable at runtime via syslog_init an...
#define DETWS_SYSLOG_FIELD_MAX
Maximum syslog HOSTNAME / APP-NAME field length (including NUL).
#define DETWS_SYSLOG_MSG_MAX
Maximum formatted syslog datagram length in bytes (RFC 5424 line).
Zero-heap RFC 5424 syslog client over UDP.
bool det_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.