The original implementation of svlogd from smarden.org supports user specified prefix but is not yet in the busybox version. This change implements this feature.
* User defined prefix cannot be longer than 60 characters. * Prefix applies to both file target and UDP destination. * Prefix is added to a UDP message via IOV to minimize buffer copy. Signed-off-by: Hao Xiang <hao.xi...@linux.dev> --- runit/svlogd.c | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/runit/svlogd.c b/runit/svlogd.c index c808dfc42..19a74dec0 100644 --- a/runit/svlogd.c +++ b/runit/svlogd.c @@ -155,7 +155,7 @@ log message, you can use a pattern like this instead //usage: "\n""!PROG - process rotated log with PROG" //usage: "\n""uIPADDR - send log over UDP" ///////: "\n""UIPADDR - send log over UDP and DONT log" - unsupported -///////: "\n""pPFX - prefix each line with PFX" - unsupported +//usage: "\n""pPFX - prefix each line with PFX" //usage: "\n""+,-PATTERN - (de)select line for logging" //usage: "\n""E,ePATTERN - (de)select line for stderr" @@ -190,6 +190,8 @@ struct logdir { char matcherr; struct sockaddr_in udpaddr; int udpfd; + char *prefix; + int len; struct msghdr *msg; }; @@ -308,6 +310,14 @@ static char* wstrdup(const char *str) return s; } +static char* wstrndup(const char *str, size_t n) +{ + char *s; + while (!(s = strndup(str, n))) + pause_nomem(); + return s; +} + static unsigned pmatch(const char *p, const char *s, unsigned len) { for (;;) { @@ -776,6 +786,10 @@ static void logdir_close(struct logdir *ld) if (ld->msg != NULL) free(ld->msg); ld->msg = NULL; + if (ld->prefix) + free(ld->prefix); + ld->prefix = NULL; + ld->len = 0; } static struct msghdr *create_msg(struct sockaddr_in *udpaddr) @@ -840,6 +854,8 @@ static NOINLINE unsigned logdir_open(struct logdir *ld, const char *fn) ld->udpaddr.sin_family = AF_INET; ld->udpaddr.sin_port = 0; ld->msg = NULL; + ld->prefix = NULL; + ld->len = 0; free(ld->inst); ld->inst = NULL; free(ld->processor); ld->processor = NULL; @@ -949,6 +965,19 @@ static NOINLINE unsigned logdir_open(struct logdir *ld, const char *fn) * accordingly */ memRchr = memchr; break; + case 'p': + start = &s[1]; + if (*start == '\0') { + warn("No prefix specified"); + break; + } + ld->prefix = wstrndup(start, MAX_PREFIX_LEN); + ld->len = strlen(ld->prefix); + /* Prefix requires one-line buffering, + * resetting the "find newline" function + * accordingly */ + memRchr = memchr; + break; } s = np; } @@ -1365,10 +1394,16 @@ int svlogd_main(int argc, char **argv) if (ld->matcherr == 'e') { /* runit-1.8.0 compat: if timestamping, do it on stderr too */ ////full_write(STDERR_FILENO, printptr, printlen); + fwrite(ld->prefix, 1, ld->len, stderr); fwrite(printptr, 1, printlen, stderr); } if (ld->match != '+') continue; + /* Add user defined prefix to UDP message */ + if (ld->udpfd != -1 && ld->len) + udp_add_buf(ld->msg, ld->prefix, ld->len); + if (ld->len) + buffer_pwrite(i, ld->prefix, ld->len); buffer_pwrite(i, printptr, printlen); } -- 2.45.2 _______________________________________________ busybox mailing list busybox@busybox.net http://lists.busybox.net/mailman/listinfo/busybox