Exemplo n.º 1
0
void log_ext(

  int         errnum,   /* I (errno or PBSErrno) */
  const char *routine,  /* I */
  const char *text,     /* I */
  int         severity) /* I */

  {
  char  buf[LOG_BUF_SIZE];

  char *EPtr = NULL;

  char  EBuf[1024];

  char  tmpLine[2048];

  const char *SeverityText = NULL;

  tmpLine[0] = '\0';

  EBuf[0] = '\0';

  if (errnum == -1)
    {
    buf[0] = '\0';
    }
  else
    {
    /* NOTE:  some strerror() routines return "Unknown error X" w/bad errno */

    if (errnum >= 15000)
      {
      EPtr = pbse_to_txt(errnum);
      }
    else
      {
      EPtr = strerror(errnum);
      }

    if (EPtr == NULL)
      {
      sprintf(EBuf, "unexpected error %d",
              errnum);

      EPtr = EBuf;
      }

    sprintf(tmpLine,"%s (%d) in ",
            EPtr,
            errnum);
    }

  SeverityText = log_get_severity_string(severity);

  snprintf(buf,sizeof(buf),"%s::%s%s, %s",
    SeverityText,
    tmpLine,
    routine,
    text);

  buf[LOG_BUF_SIZE - 1] = '\0';

  pthread_mutex_lock(&log_mutex);

  if (log_opened == 0)
    {
#if !SYSLOG
    log_open("/dev/console", log_directory);
#endif /* not SYSLOG */
    }

  if (isatty(2))
    {
    fprintf(stderr, "%s: %s\n",
            msg_daemonname,
            buf);
    }

  if (log_opened > 0)
    {
    pthread_mutex_unlock(&log_mutex);

    log_record(
      PBSEVENT_ERROR | PBSEVENT_FORCE,
      PBS_EVENTCLASS_SERVER,
      msg_daemonname,
      buf);
    }
  else
    pthread_mutex_unlock(&log_mutex);

#if SYSLOG
  if (syslogopen == 0)
    {
    openlog(msg_daemonname, LOG_NOWAIT, LOG_DAEMON);

    syslogopen = 1;
    }

  syslog(severity|LOG_DAEMON,"%s",buf);

#endif /* SYSLOG */

  return;
  }  /* END log_ext() */
Exemplo n.º 2
0
/**
 * An internal worker function to perform the logging.
 *
 * Takes VA_ARGS similar to vprintf.
 *
 * \param _l The logger reference.
 * \param severity The severity of the message
 * \param format The message to send
 * \param ap The va_list for the format paramater
 * \returns 0 on success, -1 on error.
 */
static int vlog(int severity, const char *format, va_list ap)
{
  if (logLevel > severity)
  {
    return 0;
  }

  if (buffer == NULL)
  {
    buffer = (char *) g_malloc(INITIAL_BUFFER_SIZE);
    buffer_size = INITIAL_BUFFER_SIZE;
  }

  struct timeval timestamp;

  // Populate buffer with time stamp
  if (gettimeofday(&timestamp, NULL) != 0)
  {
    // Print the message to stderr before erroring out
    fprintf(stderr, "??.?? PID(%d) %s: [%s] ", getpid(), basename_safe(PROCESS_NAME), log_get_severity_string(severity));
    vfprintf(stderr, format, ap);
    fprintf(stderr, "\n");

    fflush(stderr);

    return -1;
  }

  int ret = g_vsnprintf(buffer, buffer_size, format, ap);

  if (ret < 0)
  {
    // Broken implementation of vsnprintf?
    // Print the message to stderr before erroring out
    fprintf(stderr, "%ld.%06ld PID(%d) %s: [%s] ", timestamp.tv_sec, timestamp.tv_usec, getpid(), basename_safe(PROCESS_NAME), log_get_severity_string(severity));
    vfprintf(stderr, format, ap);
    fprintf(stderr, "\n");

    fflush(stderr);
    return -1;
  }

  if (ret >= buffer_size)
  {
    g_free(buffer);

    buffer = (char *) g_malloc(ret * 2);
    buffer_size = ret * 2;

    errno = EAGAIN;
    return -1;
  }

  if (id == NULL)
  {
    fprintf(stderr, "%ld.%06ld PID(%d) %s: [%s] %s\n", timestamp.tv_sec, timestamp.tv_usec, getpid(), basename_safe(PROCESS_NAME), log_get_severity_string(severity), buffer);
    return 0;
  }

  log_t log = log_init(NULL, 0);

  log_set_sender_id(log, id);
  log_set_severity(log, severity);
  log_set_timestamp(log, timestamp.tv_sec, timestamp.tv_usec);
  log_set_message(log, buffer);

  unsigned int size;
  char *s = log_serialise(log, &size);

  log_close(log);

  ret = transport_send(transport, s, NULL, size);
  g_free(s);

  return ret;
}