Tiene una pregunta sobre el uso de la biblioteca syslog al escribir los mensajes de error en el archivo de registro.

A continuación se muestra la función de código que estoy tratando de usar

syslog(int priority, const char_message)

Y quiero imprimir prioridad de masaje en el archivo de registro. por ejemplo:

Mar 23 17:56:37 mypc slog [3597]: este es el masaje de registro "ERR"

Pero ahora solo se muestra:

Mar 23 17:56:37 mypc slog [3597]: esto es masaje de registro

¿hay alguna forma de que también pueda escribir en el archivo de registro el tipo de prioridad? (Syslog acepta solo cadena literal)

1
Izik 23 mar. 2017 a las 20:47

2 respuestas

La mejor respuesta

El prototipo de la función de syslog es:

void syslog(int priority, const char *format, ...);

En particular, el segundo parámetro es similar a un especificador de formato de estilo printf, excepto que también es compatible con el especificador %m que será reemplazado por un mensaje de error generado por strerror(errno).

Puede registrar una cadena simple junto con una cadena de prioridad llamando a esta función:

void my_simple_syslog(int priority, const char *message)
{
    static const char * const prio_strings[] = {
        [LOG_EMERG] = "EMERG",
        [LOG_ALERT] = "ALERT",
        [LOG_CRIT] = "CRIT",
        [LOG_ERR] = "ERR",
        [LOG_WARNING] = "WARNING",
        [LOG_NOTICE] = "NOTICE",
        [LOG_INFO] = "INFO",
        [LOG_DEBUG] = "DEBUG",
    };

    if (priority < 0 ||
        priority >= sizeof(prio_strings) / sizeof(prio_strings[0]) ||
        !prio_strings[priority]) {
        /* priority is an unknown value */
        syslog(priority, "%s [PRIORITY:%d]", message, priority);
    } else {
        syslog(priority, "%s [%s]", message, prio_strings[priority]);
    }
}

Este ejemplo llama:

my_simple_syslog(LOG_ERR, "this is log massage");

Produce un mensaje de registro similar a:

Mar 23 17:56:37 mypc slog [3597]: esto es masaje de registro [ERR]

La desventaja de usar este enfoque fijo es que no puede agregar parámetros adicionales como si llamara a syslog directamente.

1
Ian Abbott 23 mar. 2017 a las 18:22

Tenga en cuenta que el mensaje de syslog ya contiene la prioridad, pero el demonio de syslog lo elimina (por ejemplo, rsyslog) cuando se escribe en el archivo. El mensaje de syslog que pasa la llamada syslog() al demonio de syslog realmente se ve así:

<16>Mar 23 17:56:37 mypc slog[3597]: this is log massage

Es posible volver a configurar el demonio syslog para que también se imprima la prioridad. Rsyslog usa plantillas y con NXLog simplemente podría hacer esto:

Exec $raw_event = $raw_evnt + " " + $SyslogSeverity;

Consulte también https://stackoverflow.com/a/9216977/995934

0
Community 23 may. 2017 a las 12:09