log.c 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. /*
  2. * C Fancy Logger
  3. * log.c:
  4. * Copyright (c) 2009-2022 986-Studio. All rights reserved.
  5. *
  6. * Created by Manoël Trapier on 20/01/2009.
  7. */
  8. #define __LOG_C_INTERNAL_
  9. #include <stdlib.h>
  10. #include <stdio.h>
  11. #include <termcolour.h>
  12. #include <string.h>
  13. #include <stdarg.h>
  14. #include <log.h>
  15. #include <sys/time.h>
  16. #include <time.h>
  17. #include <pthread.h>
  18. #include <syslog.h>
  19. #include <sys/syscall.h>
  20. #include <sys/stat.h>
  21. #include <unistd.h>
  22. #include <fcntl.h>
  23. #include <execinfo.h>
  24. void log_displayPanic(int signal)
  25. {
  26. size_t size = 0;
  27. //size = backtrace(array, 30);
  28. /* Now flood user with unusefull data. */
  29. fprintf(stderr, FYELLOW "\n\n ----- " FYELLOW " YICK! ERROR YICK! [bt:%zu]" FYELLOW "----- \n", size);
  30. // get void*'s for all entries on the stack
  31. // print out all the frames to stderr
  32. fprintf(stderr, " ----- Error: signal: %d -----\n" FRED, signal);
  33. //backtrace_symbols_fd(array, size, 2);
  34. fprintf(stderr, FYELLOW "\n\n ----- " FYELLOW " YICK! ERROR YICK! " FYELLOW "----- " CNORMAL "\n");
  35. }
  36. void time_stamp_line(void)
  37. {
  38. /* Time "0" will be thefirst log line */
  39. static char firstRun = 1;
  40. static struct timeval firstTime;
  41. struct timeval curTime;
  42. int cMin, cSec;
  43. long long cMSec;
  44. /* Get datetime */
  45. gettimeofday(&curTime, NULL);
  46. if (firstRun == 1)
  47. {
  48. firstRun = 0;
  49. firstTime.tv_sec = curTime.tv_sec;
  50. firstTime.tv_usec = curTime.tv_usec;
  51. }
  52. cMSec = ((curTime.tv_sec - firstTime.tv_sec) * 1000) + (curTime.tv_usec - firstTime.tv_usec) / 1000;
  53. cSec = (cMSec / 1000);
  54. cMSec %= 1000;
  55. cMin = cSec / 60;
  56. cSec %= 60;
  57. /* Put cursor at start of line */
  58. fprintf(stderr, "%c[s", 0x1B);
  59. fprintf(stderr, "%c[7000D", 0x1B);
  60. fprintf(stderr, "%c[1C", 0x1B);
  61. fprintf(stderr, FWHITE"[" FYELLOW "%03d" FRED "." FBLUE "%02d" FRED "." FGREEN "%03lld" FWHITE "]" CNORMAL, cMin,
  62. cSec, cMSec);
  63. fprintf(stderr, "%c[u", 0x1B);
  64. }
  65. void log_real(int level, const char *user, const char *fmt, ...)
  66. {
  67. int i;
  68. va_list va;
  69. /* The LOG_PANIC must always be displayed */
  70. if ((level <= MAX_DEBUG_LEVEL) || (level <= TLOG_PANIC))
  71. {
  72. fprintf(stderr, CNORMAL);
  73. time_stamp_line();
  74. fprintf(stderr, CNORMAL " | ");
  75. switch (level)
  76. {
  77. case TLOG_PANIC: fprintf(stderr, BRED FWHITE); break;
  78. case TLOG_ERROR: fprintf(stderr, FRED); break;
  79. case TLOG_WARNING: fprintf(stderr, FYELLOW); break;
  80. default:
  81. case TLOG_NORMAL: fprintf(stderr, FGREEN); break;
  82. case TLOG_VERBOSE: fprintf(stderr, FCYAN); break;
  83. case TLOG_DEBUG: fprintf(stderr, BBLUE FWHITE); break;
  84. }
  85. if (user != NULL)
  86. {
  87. i = strlen(user);
  88. if (i < 12)
  89. {
  90. i = 12 - i;
  91. for (; i >= 0 ; i--)
  92. {
  93. fprintf(stderr, " ");
  94. }
  95. }
  96. fprintf(stderr, "%s", user);
  97. }
  98. else
  99. {
  100. switch (level)
  101. {
  102. case TLOG_PANIC: fprintf(stderr, " PANIC"); break;
  103. case TLOG_ERROR: fprintf(stderr, " Error"); break;
  104. case TLOG_WARNING: fprintf(stderr, " Warning"); break;
  105. default:
  106. case TLOG_NORMAL: fprintf(stderr, " Info"); break;
  107. case TLOG_VERBOSE: fprintf(stderr, " Verbose"); break;
  108. case TLOG_DEBUG: fprintf(stderr, " Debug"); break;
  109. }
  110. }
  111. fprintf(stderr, CNORMAL " | ");
  112. va_start(va, fmt);
  113. vfprintf(stderr, fmt, va);
  114. va_end(va);
  115. if (fmt[0] != 0)
  116. {
  117. fprintf(stderr, "\n");
  118. }
  119. #ifdef LOG_ALWAYS_FFLUSH
  120. /* Systematicaly flush */
  121. fflush(stderr);
  122. #endif
  123. }
  124. }