diff --git a/src/include/ipxe/ansiesc.h b/src/include/ipxe/ansiesc.h index 35438e43..c00af258 100644 --- a/src/include/ipxe/ansiesc.h +++ b/src/include/ipxe/ansiesc.h @@ -113,6 +113,13 @@ struct ansiesc_context { /** Select graphic rendition */ #define ANSIESC_SGR 'm' +/** Explicit log message priority + * + * This is an iPXE private sequence identifier. (The range 'p' to '~' + * is reserved for private sequences.) + */ +#define ANSIESC_LOG_PRIORITY 'p' + /** @} */ extern int ansiesc_process ( struct ansiesc_context *ctx, int c ); diff --git a/src/include/ipxe/syslog.h b/src/include/ipxe/syslog.h index 256ac761..035ca670 100644 --- a/src/include/ipxe/syslog.h +++ b/src/include/ipxe/syslog.h @@ -20,17 +20,17 @@ FILE_LICENCE ( GPL2_OR_LATER ); */ #define SYSLOG_BUFSIZE 128 -/** Syslog facility +/** Syslog default facility * * This is a policy decision */ -#define SYSLOG_FACILITY 0 /* kernel */ +#define SYSLOG_DEFAULT_FACILITY 0 /* kernel */ -/** Syslog severity +/** Syslog default severity * * This is a policy decision */ -#define SYSLOG_SEVERITY LOG_INFO +#define SYSLOG_DEFAULT_SEVERITY LOG_INFO /** Syslog priority */ #define SYSLOG_PRIORITY( facility, severity ) ( 8 * (facility) + (severity) ) diff --git a/src/include/syslog.h b/src/include/syslog.h index cc7b19fd..3dfc11b9 100644 --- a/src/include/syslog.h +++ b/src/include/syslog.h @@ -10,6 +10,7 @@ FILE_LICENCE ( GPL2_OR_LATER ); #include +#include #include /** @@ -55,6 +56,16 @@ extern void log_vprintf ( const char *fmt, va_list args ); extern void __attribute__ (( format ( printf, 1, 2 ) )) log_printf ( const char *fmt, ... ); +/** ANSI private escape sequence to set syslog priority + * + * @v priority Priority + */ +#define SYSLOG_SET_PRIORITY( priority ) \ + "\033[" #priority "p" + +/** ANSI private escape sequence to clear syslog priority */ +#define SYSLOG_CLEAR_PRIORITY "\033[p" + /** * Write message to system log * @@ -62,10 +73,11 @@ log_printf ( const char *fmt, ... ); * @v fmt Format string * @v ... Arguments */ -#define vsyslog( priority, fmt, args ) do { \ - if ( (priority) <= LOG_LEVEL ) { \ - log_vprintf ( fmt, (args) ); \ - } \ +#define vsyslog( priority, fmt, args ) do { \ + if ( (priority) <= LOG_LEVEL ) { \ + log_vprintf ( SYSLOG_SET_PRIORITY ( priority ) fmt \ + SYSLOG_CLEAR_PRIORITY, (args) ); \ + } \ } while ( 0 ) /** @@ -75,10 +87,11 @@ log_printf ( const char *fmt, ... ); * @v fmt Format string * @v ... Arguments */ -#define syslog( priority, fmt, ... ) do { \ - if ( (priority) <= LOG_LEVEL ) { \ - log_printf ( fmt, ##__VA_ARGS__ ); \ - } \ +#define syslog( priority, fmt, ... ) do { \ + if ( (priority) <= LOG_LEVEL ) { \ + log_printf ( SYSLOG_SET_PRIORITY ( priority ) fmt \ + SYSLOG_CLEAR_PRIORITY, ##__VA_ARGS__ ); \ + } \ } while ( 0 ) #endif /* _SYSLOG_H */ diff --git a/src/net/udp/syslog.c b/src/net/udp/syslog.c index caa0d0b2..4a265314 100644 --- a/src/net/udp/syslog.c +++ b/src/net/udp/syslog.c @@ -68,8 +68,27 @@ static struct interface syslogger = INTF_INIT ( syslogger_desc ); /** Syslog line buffer */ static char syslog_buffer[SYSLOG_BUFSIZE]; +/** Syslog severity */ +static unsigned int syslog_severity = SYSLOG_DEFAULT_SEVERITY; + +/** + * Handle ANSI set syslog priority (private sequence) + * + * @v count Parameter count + * @v params List of graphic rendition aspects + */ +static void syslog_handle_priority ( unsigned int count __unused, + int params[] ) { + if ( params[0] >= 0 ) { + syslog_severity = params[0]; + } else { + syslog_severity = SYSLOG_DEFAULT_SEVERITY; + } +} + /** Syslog ANSI escape sequence handlers */ static struct ansiesc_handler syslog_handlers[] = { + { ANSIESC_LOG_PRIORITY, syslog_handle_priority }, { 0, NULL } }; @@ -106,8 +125,8 @@ static void syslog_putchar ( int character ) { /* Send log message */ if ( ( rc = xfer_printf ( &syslogger, "<%d>ipxe: %s", - SYSLOG_PRIORITY ( SYSLOG_FACILITY, - SYSLOG_SEVERITY ), + SYSLOG_PRIORITY ( SYSLOG_DEFAULT_FACILITY, + syslog_severity ), syslog_buffer ) ) != 0 ) { DBG ( "SYSLOG could not send log message: %s\n", strerror ( rc ) );