Кресты / Говнокод #19558 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
  33. 33
  34. 34
  35. 35
  36. 36
  37. 37
  38. 38
  39. 39
  40. 40
  41. 41
  42. 42
  43. 43
  44. 44
  45. 45
  46. 46
  47. 47
  48. 48
  49. 49
  50. 50
  51. 51
  52. 52
  53. 53
  54. 54
  55. 55
  56. 56
  57. 57
  58. 58
  59. 59
  60. 60
  61. 61
  62. 62
  63. 63
  64. 64
  65. 65
  66. 66
  67. 67
  68. 68
  69. 69
  70. 70
  71. 71
  72. 72
  73. 73
  74. 74
  75. 75
  76. 76
  77. 77
  78. 78
  79. 79
  80. 80
  81. 81
  82. 82
  83. 83
  84. 84
  85. 85
  86. 86
  87. 87
#if !defined LOG_PRINT_FNAME && !defined LOG_PRINT_LVL && \
    !defined LOG_PRINT_DATE  && !defined LOG_PRINT_TIME && \
    !defined LOG_TIME_FMT   &&  !defined LOG_DATETIME_SEP && \
    !defined LOG_PRINT_TIMER && !defined LOG_VERB
#warning No logging options specified, default config will be used
#endif
 
// Initialize unitialized values
#ifndef LOG_PRINT_FNAME
    #define LOG_PRINT_FNAME true
#endif
#ifndef LOG_PRINT_LVL
    #define LOG_PRINT_LVL false
#endif
#ifndef LOG_PRINT_DATE
    #define LOG_PRINT_DATE false
#endif
#ifndef LOG_PRINT_TIME
    #define LOG_PRINT_TIME false
#endif
#ifndef LOG_DATE_FMT
    #define LOG_DATE_FMT "%D"
#endif
#ifndef LOG_TIME_FMT
    #define LOG_TIME_FMT "%T"
#endif
#ifndef LOG_DATETIME_SEP
    #define LOG_DATETIME_SEP ""
#endif
#ifndef LOG_PRINT_TIMER
    #define LOG_PRINT_TIMER true
#endif
#ifndef LOG_VERB
    #define LOG_VERB 1
#endif
 
 
#if LOG_PRINT_TIMER == true && (LOG_PRINT_DATE == true || LOG_PRINT_TIME == true)
#warning Printing timer and datetime both is not possible, datetime will be discarded
#define LOG_PRINT_DATE false
#define LOG_PRINT_TIME false
#endif
 
enum LogLevel_t {
    INFO     = 3,
    WARNING  = 2,
    ERROR    = 0,
    TRACE    = 7
};
 
#define TIMER
#define DATE
#define TIME
#define SEPARATOR
#define FNAME
#define LVL(lvl)
 
#define STREAM(lvl) \
    ((lvl) == TRACE || (lvl) == ERROR) ? std::cerr : std::cout
 
#if LOG_PRINT_TIMER == true
#define TIMER << "[" << std::fixed << Log::getTimer() << "] "
#endif
 
#if LOG_PRINT_DATE == true
#define DATE << Log::getTimeFmt(LOG_DATE_FMT) << " "
#endif
 
#if LOG_PRINT_TIME == true
#define TIME << Log::getTimeFmt(LOG_TIME_FMT) << " "
#endif
 
#if LOG_PRINT_DATE == true && LOG_PRINT_TIME == true
#define SEPARATOR << LOG_DATETIME_SEP
#endif
 
#if LOG_PRINT_FNAME == true
#define FNAME << __FUNCTION__ << ": "
#endif
 
#if LOG_PRINT_LVL == true
#define LVL(lvl) << #lvl << ": "
#endif
 
#define LOG(lvl) \
    std::cout.precision(5); \
    STREAM(lvl) TIMER DATE SEPARATOR TIME LVL(lvl) FNAME

xxx: Бля, я написал какое-то говно
yyy: Я видел некоторое дерьмо
xxx: Пиздец просто
zzz: Действительно говно.
xxx: Я не знаю даже нахуя я это делал
xxx: Почему-то, когда начинал, мне не пришло в голову, что логгирование на макросах, конфигурируемое в компилтайме — это пиздец

Запостил: CYB3R CYB3R, (Updated )

Комментарии (26) RSS

  • Полезно иметь макрос, который захватывает имя файла, номер строчи и затем передает его функции логирования.
    Ответить
    • И нахуя? Ты не знаешь, какая функция какое сообщение пишет? Грепни по исходникам тогда.
      Ответить
      • Could not allocate memory. Этим всё сказано.

        Тебя прикалывает придумывать уникальное сообщение для каждого места, где ты что-то логируешь? Меня - нет. Гораздо проще автоматически добавлять имя функции и/или строчку+файл в лог...

        P.S. Няша, ты над большими проектами вообще работал?
        Ответить
        • Няша, немного работал и продолжаю работать. И как ни странно, сообщения получаются уникальными сами. Попробуй писать в логах осмысленные предложения на английском языке.
          Кстати, как в этом твоем большом проекте админы и саппорт относятся к именам функций и номерам строк вместо логов?
          Ответить
          • А потом в логах
            "Error with DB connection
            All OK
            All OK
            Fatal error with user data
            All OK
            I'm handsome guy
            End of logs
            "
            Ответить
          • Нормально относятся.

            Да и я, когда админил, нормально относился и к именам функций и бектрейсам жабы/шарпа. На самом деле, даже помогает понять, что именно прога делала в момент ошибки.
            Ответить
              • Да почему, те же бектрейсы часто и без исходников понятно... Даже если их никогда не видел и не увидишь. По крайней мере можно косвенно догадаться что вообще прога делала...
                Ответить
      • Мне сегодня завернули код-ревью изза того, что использовал указатель на функцию, по причине того, что таким образом в стектрейсе имя функции не проявится.

        А по поводу логов, имхо, самое лучшее решение которое я когда либо видел: bash -x -c "мой код". Жаль это для больших програм не подойдет.

        Я бы точно не стал делать логирование на макросах. Ради того, чтобы поменять настройки логгирования пересобирать проект? Зачем так жить. А еще лучше, когда эти настройки нужно поменять на компутере тестера, где проект и собрать-то нечем.
        Ответить
        • Я в стектрейсах видел имена функций вызванных по указателю из всяких std::bind. Может в этих ваших няшных сишечках своя специфика конечно. Мне чето казалось, отладчику пофиг, как была вызвана функция, когда адрес есть, по которому можно символ найти.
          Ответить
          • > символ
            Чтобы символ по адресу искать - надо крешдамп или хотя бы адреса модулей в логе...

            З.Ы. Ну кстати идея с выводом адреса в лог мне понравилась.
            Ответить
        • А по поводу логов, самое лучшее решение, которое я когда-либо видел - Boost.Log.
          Ответить
        • > использовал указатель на функцию, по причине того, что таким образом в стектрейсе имя функции не проявится

          Это в каком языке?
          Ответить
  • > Почему-то, когда начинал, мне не пришло в голову, что логгирование на макросах, конфигурируемое в компилтайме — это пиздец

    Буст с вами не согласен.
    Ответить

Добавить комментарий

Из-за тебя ушел bormand, guest!

    А не использовать ли нам bbcode?


    8