log.c 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. #include <stdarg.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <time.h>
  5. #include <sys/time.h>
  6. #include <unistd.h>
  7. #ifdef HAVE_VSYSLOG
  8. #include <syslog.h>
  9. #endif
  10. #include "log.h"
  11. static int logLevel = MESS_DEBUG;
  12. static FILE *messageFile = NULL;
  13. static int _logToSyslog = 0;
  14. void logSetLevel(int level)
  15. {
  16. logLevel = level;
  17. }
  18. void logSetMessageFile(FILE * f)
  19. {
  20. messageFile = f;
  21. }
  22. void logToSyslog(int enable) {
  23. _logToSyslog = enable;
  24. #ifdef HAVE_VSYSLOG
  25. if (_logToSyslog) {
  26. openlog("logrotate", 0, LOG_USER);
  27. }
  28. else {
  29. closelog();
  30. }
  31. #endif
  32. }
  33. __attribute__((format (printf, 3, 0)))
  34. static void log_once(FILE *where, int level, const char *format, va_list args)
  35. {
  36. switch (level) {
  37. case MESS_DEBUG:
  38. case MESS_NORMAL:
  39. case MESS_VERBOSE:
  40. break;
  41. default:
  42. fprintf(where, "error: ");
  43. break;
  44. }
  45. vfprintf(where, format, args);
  46. fflush(where);
  47. }
  48. __attribute__((format (printf, 2, 3)))
  49. void message(int level, const char *format, ...)
  50. {
  51. va_list args;
  52. if (level >= logLevel) {
  53. va_start(args, format);
  54. log_once(stderr, level, format, args);
  55. va_end(args);
  56. }
  57. if (messageFile != NULL) {
  58. va_start(args, format);
  59. log_once(messageFile, level, format, args);
  60. va_end(args);
  61. }
  62. #ifdef HAVE_VSYSLOG
  63. if (_logToSyslog) {
  64. int priority = LOG_USER;
  65. switch(level) {
  66. case MESS_REALDEBUG:
  67. priority |= LOG_DEBUG;
  68. break;
  69. case MESS_DEBUG:
  70. case MESS_VERBOSE:
  71. case MESS_NORMAL:
  72. priority |= LOG_INFO;
  73. break;
  74. case MESS_ERROR:
  75. priority |= LOG_ERR;
  76. break;
  77. case MESS_FATAL:
  78. priority |= LOG_CRIT;
  79. break;
  80. default:
  81. priority |= LOG_INFO;
  82. break;
  83. };
  84. va_start(args, format);
  85. vsyslog(priority, format, args);
  86. va_end(args);
  87. }
  88. #endif
  89. if (level == MESS_FATAL)
  90. exit(1);
  91. }
  92. /* vim: set et sw=4 ts=4: */