1. C++ / Говнокод #19558

    0

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    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, 02 Марта 2016

    Комментарии (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.
            Ответить
          • > использовал указатель на функцию, по причине того, что таким образом в стектрейсе имя функции не проявится

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

      Буст с вами не согласен.
      Ответить
      • Буст - испражнение сатаны, десу
        Ответить
        • Госдума, кстати, тебя уже пометила:
          http://politobzor.net/show-83675-gosduma-priravnyala-hentay-k-pedofilii.html
          Ответить
          • А я то тут причем, Карл?

            Борманд, беги! Я прикрою!
            Ответить
            • А я хентай и не смотрю.
              Ответить
              • Детектор лжи не обманешь так же просто как нас.
                Ответить
                • Серьёзно, я из хентая только bible black да boku no piko смотрел.
                  Ответить
                  • Один раз не хентарас?
                    Ответить
                  • впаше.ком/video91893987_171183210
                    Ответить
                    • Ты хочешь, чтобы я спалил свою учётку, а потом за мной приехала Мизулина? Нет уж, не дождёшься.
                      Ответить

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