Skip to content

Commit 491a41d

Browse files
committed
logger: parse leading <LEVEL> in log messages
This commit adds support for systemd daemon log style, which is useful when running in a 'daemon --foreground 2>&1 | logger' scenario, e.g., log redirection in Finit <https://github.com/troglobit/finit> Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
1 parent 9c25e87 commit 491a41d

File tree

1 file changed

+37
-2
lines changed

1 file changed

+37
-2
lines changed

src/logger.c

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,38 @@ static char *chomp(char *str)
193193
return str;
194194
}
195195

196+
/*
197+
* Parse possible systemd style log <level> prefix from message
198+
* For details, see libsystemd/sd-daemon.h
199+
*
200+
* Returns the level, and updates buf to point past the prefix
201+
*/
202+
static int parse_level(char **buf, int severity)
203+
{
204+
char *msg = *buf;
205+
206+
if (msg[0] == '<' && msg[2] == '>' && msg[1] >= '0' && msg[1] <= '7') {
207+
int level;
208+
209+
switch (msg[1]) {
210+
case '0': level = LOG_EMERG; break;
211+
case '1': level = LOG_ALERT; break;
212+
case '2': level = LOG_CRIT; break;
213+
case '3': level = LOG_ERR; break;
214+
case '4': level = LOG_WARNING; break;
215+
case '5': level = LOG_NOTICE; break;
216+
case '6': level = LOG_INFO; break;
217+
case '7': level = LOG_DEBUG; break;
218+
default: level = severity; break;
219+
}
220+
221+
*buf = msg + 3;
222+
return (severity & ~LOG_PRIMASK) | level;
223+
}
224+
225+
return severity;
226+
}
227+
196228
static int parse_prio(const char *arg, int *f, int *l)
197229
{
198230
char buf[strlen(arg) + 1];
@@ -505,8 +537,11 @@ int main(int argc, char *argv[])
505537
openlog_r(ident, log_opts, facility, &log);
506538

507539
if (!buf[0]) {
508-
while ((fgets(buf, sizeof(buf), stdin)))
509-
syslogp_r(severity, &log, msgid, sd, "%s", chomp(buf));
540+
while ((fgets(buf, sizeof(buf), stdin))) {
541+
char *msg = chomp(buf);
542+
543+
syslogp_r(parse_level(&msg, severity), &log, msgid, sd, "%s", msg);
544+
}
510545
} else
511546
syslogp_r(severity, &log, msgid, sd, "%s", buf);
512547

0 commit comments

Comments
 (0)