как добавить __FUNCTION__ в системный журнал - PullRequest
0 голосов
/ 24 октября 2018

Я обнаружил, что следующий код может добавить журнал в системный журнал.Но если я также хочу добавить __FUNCTION__ информацию в системный журнал, как это сделать?

openlog(basename(argv[0]), LOG_CONS | LOG_PID | LOG_NDELAY, LOG_DAEMON);

int logger(int priority, const char *format, ...) {
int result = 0;
va_list args;

va_start(args, format);

vsyslog(priority, format, args);
vfprintf(stderr, format, args);
va_end(args);

return result;

}

1 Ответ

0 голосов
/ 24 октября 2018

Сначала измените регистратор так, чтобы он принимал имя функции:

int logger_internal(const char* func, int priority, const char* format, ...);

Но вызывайте его через макрос:

#define logger(priority, format, ...) \
  logger_internal(__FUNCTION__, priority, format, __VA_ARGS__)

Изменение тела logger_internal для получения дополнительного параметрана счет это немного раздражает, но не сложно.Вероятно, самый простой способ - добавить функцию к аргументу формата;что-то вроде (не проверено):

int logger_internal(const char* func, int priority, const char* format, ...) {
  va_list args;
  size_t func_l = strlen(func);
  size_t format_l = strlen(format);

  char* fmt = malloc(func_l + format_l + 2);

  memcpy(fmt, func, func_l);
  fmt[func_l] = ' ';
  memcpy(&(fmt[func_l + 1]), format, format_l);
  fmt[func_l + 1 + format_l] = '\0';

  va_start(args, format);
  vsyslog(priority, fmt, args);
  va_end(args);

  free(fmt);
}

Но очевидно, что эта часть будет зависеть от того, как вы хотите, чтобы ваша запись в системном журнале выглядела.

...