david/ipxe
david
/
ipxe
Archived
1
0
Fork 0

[syslog] Pass internal syslog() priority through to syslog console

Use a private ANSI escape sequence to convey the priority of an
internal syslog() message through to the syslog server.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
Michael Brown 2012-03-26 20:23:30 +01:00
parent c2875ae329
commit 3ff7927d2f
4 changed files with 53 additions and 14 deletions

View File

@ -113,6 +113,13 @@ struct ansiesc_context {
/** Select graphic rendition */ /** Select graphic rendition */
#define ANSIESC_SGR 'm' #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 ); extern int ansiesc_process ( struct ansiesc_context *ctx, int c );

View File

@ -20,17 +20,17 @@ FILE_LICENCE ( GPL2_OR_LATER );
*/ */
#define SYSLOG_BUFSIZE 128 #define SYSLOG_BUFSIZE 128
/** Syslog facility /** Syslog default facility
* *
* This is a policy decision * 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 * This is a policy decision
*/ */
#define SYSLOG_SEVERITY LOG_INFO #define SYSLOG_DEFAULT_SEVERITY LOG_INFO
/** Syslog priority */ /** Syslog priority */
#define SYSLOG_PRIORITY( facility, severity ) ( 8 * (facility) + (severity) ) #define SYSLOG_PRIORITY( facility, severity ) ( 8 * (facility) + (severity) )

View File

@ -10,6 +10,7 @@
FILE_LICENCE ( GPL2_OR_LATER ); FILE_LICENCE ( GPL2_OR_LATER );
#include <stdarg.h> #include <stdarg.h>
#include <ipxe/ansiesc.h>
#include <config/console.h> #include <config/console.h>
/** /**
@ -55,6 +56,16 @@ extern void log_vprintf ( const char *fmt, va_list args );
extern void __attribute__ (( format ( printf, 1, 2 ) )) extern void __attribute__ (( format ( printf, 1, 2 ) ))
log_printf ( const char *fmt, ... ); 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 * Write message to system log
* *
@ -62,10 +73,11 @@ log_printf ( const char *fmt, ... );
* @v fmt Format string * @v fmt Format string
* @v ... Arguments * @v ... Arguments
*/ */
#define vsyslog( priority, fmt, args ) do { \ #define vsyslog( priority, fmt, args ) do { \
if ( (priority) <= LOG_LEVEL ) { \ if ( (priority) <= LOG_LEVEL ) { \
log_vprintf ( fmt, (args) ); \ log_vprintf ( SYSLOG_SET_PRIORITY ( priority ) fmt \
} \ SYSLOG_CLEAR_PRIORITY, (args) ); \
} \
} while ( 0 ) } while ( 0 )
/** /**
@ -75,10 +87,11 @@ log_printf ( const char *fmt, ... );
* @v fmt Format string * @v fmt Format string
* @v ... Arguments * @v ... Arguments
*/ */
#define syslog( priority, fmt, ... ) do { \ #define syslog( priority, fmt, ... ) do { \
if ( (priority) <= LOG_LEVEL ) { \ if ( (priority) <= LOG_LEVEL ) { \
log_printf ( fmt, ##__VA_ARGS__ ); \ log_printf ( SYSLOG_SET_PRIORITY ( priority ) fmt \
} \ SYSLOG_CLEAR_PRIORITY, ##__VA_ARGS__ ); \
} \
} while ( 0 ) } while ( 0 )
#endif /* _SYSLOG_H */ #endif /* _SYSLOG_H */

View File

@ -68,8 +68,27 @@ static struct interface syslogger = INTF_INIT ( syslogger_desc );
/** Syslog line buffer */ /** Syslog line buffer */
static char syslog_buffer[SYSLOG_BUFSIZE]; 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 */ /** Syslog ANSI escape sequence handlers */
static struct ansiesc_handler syslog_handlers[] = { static struct ansiesc_handler syslog_handlers[] = {
{ ANSIESC_LOG_PRIORITY, syslog_handle_priority },
{ 0, NULL } { 0, NULL }
}; };
@ -106,8 +125,8 @@ static void syslog_putchar ( int character ) {
/* Send log message */ /* Send log message */
if ( ( rc = xfer_printf ( &syslogger, "<%d>ipxe: %s", if ( ( rc = xfer_printf ( &syslogger, "<%d>ipxe: %s",
SYSLOG_PRIORITY ( SYSLOG_FACILITY, SYSLOG_PRIORITY ( SYSLOG_DEFAULT_FACILITY,
SYSLOG_SEVERITY ), syslog_severity ),
syslog_buffer ) ) != 0 ) { syslog_buffer ) ) != 0 ) {
DBG ( "SYSLOG could not send log message: %s\n", DBG ( "SYSLOG could not send log message: %s\n",
strerror ( rc ) ); strerror ( rc ) );