Можно ли показать информацию об уровне (LOG_INFO, LOG_ERROR, …), передаваемую в функцию «syslog», в каждой строке журнала?
Спасибо!
Антонио
Вы можете написать такую функцию-обертку
#include <stdarg.h>
#include <stdio.h>
#include <syslog.h>
#include <string.h>
#include <stdlib.h>
int
mysyslog(int __level, const char *const syslogformat, ...)
{
va_list args;
char *format;
size_t length;
char *level;
ssize_t result;
va_start(args,syslogformat);
level = "?";
switch (__level)
{
case LOG_ALERT:
level = "LOG_ALERT";
break;
case LOG_INFO:
level = "LOG_INFO";
break;
case LOG_EMERG:
level = "LOG_EMERG";
break;
case LOG_CRIT:
level = "LOG_CRIT";
break;
case LOG_ERR:
level = "LOG_ERR";
break;
case LOG_WARNING:
level = "LOG_WARNING";
break;
case LOG_NOTICE:
level = "LOG_NOTICE";
break;
case LOG_DEBUG:
level = "LOG_DEBUG";
break;
}
length = strlen(syslogformat) + strlen(level) + 2;
format = malloc(length + 1);
result = snprintf(format, length + 1, "%s: %s", level, syslogformat);
if ((result < 0) || (result >= length + 1))
return -1;
vsyslog(__level, format, args);
va_end(args);
return 0;
}
int main(void)
{
mysyslog(LOG_NOTICE, "This is a log message `%d' with an integer as parameter\n", 100);
return 0;
}
Просто используйте шаблон для файла назначения, в котором вы указываете, как будет отображаться / записываться ваше сообщение журнала; что-то вроде этого показывает только уровень системного журнала и сообщение:
template t_example { template("${LEVEL}" "${MSG}"); };
destination d_example { file("/var/log/example.log" template(t_example) ); };