Как каждому выводимому в лог сообщению присвоить свой уникальный идентификатор?



Приветствую.Есть большой коробочный продукт, он пишет логи, которых довольно много.Стоит задача каждому выводимому в лог сообщению присвоить свой уникальный идентификатор, чтобы службе поддержки было проще отвечать на тикеты.Сейчас в лог пишется нечто вроде1492632682.967257 [Wed Apr 19 20:11:22 2017] [emerg]: Can't create listenersХочется получить:1492632682.967257 [Wed Apr 19 20:11:22 2017] EM034 [emerg]: Can't create listenersЯ посмотрел, как это сделано у Apache.ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, APLOGNO(00762) "CACHE/CACHE_OUT filter enabled while caching is disabled, ignoring");Мне кажется, что это ужасно криво - проставлять руками номер ошибки в запись в лог - всегда можно недоглядеть и допустить ошибку в именовании ошибки %)Я посмотрел и код MySQL. Идея с глобальными кодами, собранными в файле мне нравится ещё меньшеПока что всё что придумалось - написать парзер-препроцессор кода на С, который вёл бы базу сообщений и присваивал им уникальный идентификатор. В код вставить нечто вродеlog_np_emerg(log_ctx, ERR_AUTOCODE "Can't create listeners");Но это требует препроцессинга всего кода при сборке проекта.Не решал ли кто подобную задачу? Если да, то как?
883   58  

Comments

  1. Дмитрий Шалашов
    Дмитрий Шалашов 5 лет назад
    А считать хеш от сообщения и где-то пополнять таблицу соответствий не вариант?
  2. Paul Tru
    Paul Tru 5 лет назад
    Хеш же!
  3. Andrey Shetukhin
    Andrey Shetukhin 5 лет назад
    Считать хэш при попытке вывода строки - это адъ с точки зрения производительности. Кроме того, малокому понравится наличие в логах строк типа 810a5bdaafc6dd30b1d9979215935871
    • Paul Tru
      Paul Tru 5 лет назад
      Ну, пропроцессором чтобы не в рантайме, только N символов и коллизии детектить
    • Andrey Shetukhin
      Andrey Shetukhin 5 лет назад
      Pablo Tru Так можно и не детектить, просто сопоставить целое число и хэш. Речь не об этом же.
  4. Roman Akopov
    Roman Akopov 5 лет назад
    Младшие N бит хеша __FILE__ и __LINE__ ? или одна и та же ошибка с разных мест кидается?
  5. Дмитрий Шалашов
    Дмитрий Шалашов 5 лет назад
    Эээ, нет. Хороший хеш посчитать невероятно быстро. Рандомность от этого страдать не обязана.Брать можно первые, там, 8 символов.
    • Andrey Shetukhin
      Andrey Shetukhin 5 лет назад
      И потом искать по всему проекту, есть ли коллизия?))
    • Дмитрий Шалашов
      Дмитрий Шалашов 5 лет назад
      Андрей, вы как-то очень плохо разбираетесь в хешах
    • Andrey Shetukhin
      Andrey Shetukhin 5 лет назад
      Если я откушу от хэша первые N символов, почему вдруг коллизии не будет?
    • Дмитрий Шалашов
      Дмитрий Шалашов 5 лет назад
      Вероятность будет больше, но всё равно крайне, крайне, крайне низкой.
    • Andrey Shetukhin
      Andrey Shetukhin 5 лет назад
      Всё равно придётся заранее считать хэш для строк. Зачем его тогда считать каждый раз при выводе в лог? Чтобы что?
    • Дмитрий Шалашов
      Дмитрий Шалашов 5 лет назад
      Почему заранее-то? У меня посчитать хеш xxHash-ем было быстрее, чем лишнюю переменную создать.
    • Дмитрий Шалашов
      Дмитрий Шалашов 5 лет назад
      То есть я честно не уверен, что считать хеши всех ошибок заранее, класть их в память и брать оттуда предпосчитанное будет быстрее чем считать хеши на лету. Ну или ладно, что будет хотя бы на порядок быстрее.И масштабы этого порядка - взять что-то из переменной в памяти и то же самое умноженное на 10 - тьфу, память потраченную на хранение - жальче.
    • Andrey Shetukhin
      Andrey Shetukhin 5 лет назад
      >Почему заранее-то?
    • Дмитрий Шалашов
      Дмитрий Шалашов 5 лет назад
      Прекрасно я всё читаю, спасибо за заботу.У одной и той же ошибки хеш будет один и тот же. Создавать новое соответствие можно при создании хеша, а не хешируя все ошибки заранее. У вас нет динамического текста ошибок? Это очень специфическое условие.
    • Andrey Shetukhin
      Andrey Shetukhin 5 лет назад
      Ещё раз и медленно.
    • Дмитрий Шалашов
      Дмитрий Шалашов 5 лет назад
      Понятия не имею. Почему вы мне предлагаете думать про случай, когда базы нет, вы это откуда придумали?)Я ещё тут https://www.facebook.com/.../permalink/1526954277336953/... написал, что база соответствий, скорее всего нужна. "соответствие хеш - строка надо где-то хранить" = "создавать это соответствие, если мы только что посчитали хеш, которого раньше не было".
    • Andrey Shetukhin
      Andrey Shetukhin 5 лет назад
      > Понятия не имею.
    • Дмитрий Шалашов
      Дмитрий Шалашов 5 лет назад
      Да ёпрст. Я раньше вас написал, что база соответствий - нужна. В прошлом комменте привёл ссылку на место, где я это сделал.Вы мне продолжаете доказывать, что... нужна база соответствий! Невероятно. И вы меня обвиняете в неумении читать.Просто пиздос
    • Andrey Shetukhin
      Andrey Shetukhin 5 лет назад
      > Я раньше вас написал, что база соответствий - нужна.
    • Дмитрий Шалашов
      Дмитрий Шалашов 5 лет назад
      Почему вы так упорны в том, что базу надо создавать заранее, а не заполнять по мере появления новых ошибок?
    • Дмитрий Шалашов
      Дмитрий Шалашов 5 лет назад
      А, кстати, поговнюсь ещё - про базу соответствий я написал в самом первом комменте вообще: https://www.facebook.com/.../permalink/1526954277336953/...
    • Andrey Shetukhin
      Andrey Shetukhin 5 лет назад
      > Почему вы так упорны в том, что базу надо создавать заранее, а не заполнять по мере появления новых ошибок?
    • Andrey Shetukhin
      Andrey Shetukhin 5 лет назад
      >я бы с вами тоже вежливо общался.
    • Дмитрий Шалашов
      Дмитрий Шалашов 5 лет назад
      *рукалицоСо сколько-то приличным хешом коллизии на 8 символах невероятны так же, как то, что ты знаешь слово гугл: http://stackoverflow.com/.../chance-of-a-duplicate-hash...
  6. Дмитрий Шалашов
    Дмитрий Шалашов 5 лет назад
    https://cyan4973.github.io/xxHash/
    • Дмитрий Шалашов
      Дмитрий Шалашов 5 лет назад
      Леонид Юрьев минутка рекламы? а что с качеством, меня в первую очередь интересует юниформность? вроде SMHasher позволяет тестировать всякие там свойства, а вы его, кажется, уже используете.
    • Дмитрий Шалашов
      Дмитрий Шалашов 5 лет назад
      А сколько именно? SMHasher же даёт численную оценку качества?
    • Дмитрий Шалашов
      Дмитрий Шалашов 5 лет назад
      Да, я читал, но там же про качество вашего хеша только общие слова?
    • Дмитрий Шалашов
      Дмитрий Шалашов 5 лет назад
      Спасибо за ответы, Леонид. Успехов вам буду иметь ваш хеш в виду.
    • Алексей Шубин
      Алексей Шубин 5 лет назад
      мдаа.... И эти люди пишут ПО для баллистических ракет... Молодой человек (Дмитрий), скажите пожалуйста, в каких продуктах Вы принимали участие, я ими пользоваться не буду никогда и ни за что. И других отговаривать буду.
    • Алексей Шубин
      Алексей Шубин 5 лет назад
      Про вероятности в реальной жизни
    • Алексей Шубин
      Алексей Шубин 5 лет назад
      http://pikabu.ru/.../iz_knigi_yakova_perelmana_zhivaya...
    • Дмитрий Шалашов
      Дмитрий Шалашов 5 лет назад
      Вы комменты куда-то не туда перевели, там они были более в тему) Тут я вообще никаких заявлений не делал.
    • Дмитрий Шалашов
      Дмитрий Шалашов 5 лет назад
      И пример у вас неудачный. Нормальная хеш-функция будет давать как раз таки равновозможные значения на выходе.
    • Дмитрий Шалашов
      Дмитрий Шалашов 5 лет назад
      Ну и мне тоже придётся тогда перенести свой ответ - можете не пользоваться surfingbird.ru и relap.io, ради бога)
    • Алексей Шубин
      Алексей Шубин 5 лет назад
      Пример вполне себе нормальный, в нем используется преувеличение дабы прочувствовать всю печаль понятия "маловероятно". Я это все к тому, что "маловероятно" это все же несравнимо больше нуля. "Маловероятно" - это все-таки "возможно", и "вероятно" в этом случае может случиться "полный пи$%ец".
    • Дмитрий Шалашов
      Дмитрий Шалашов 5 лет назад
      Когда может случиться пиздец, надо серьёзнее подходить, конечно. Тут не тот случай. Да и вообще я предлагал на коллизии реагировать в случае их возникновения.
    • Алексей Шубин
      Алексей Шубин 5 лет назад
      Пиздец нечаянно нагрянет, когда его совсем не ждёшь...Вот кто думал в середине 20 века о "проблеме 2038"?? А тут внезапно "не виноватая я, он сам пришёл!!!"
    • Дмитрий Шалашов
      Дмитрий Шалашов 5 лет назад
      Кто о чём, а вшивый о бане. Ну какой пиздец от того, что две ошибки получили одинаковый код? К тому же если в вашей базе соответствий "код - ошибка" записано, что у этого кода, так случилось, две ошибки из-за коллизии?
  7. Алексей Тимановский
    Алексей Тимановский 5 лет назад
    Ну я в одном проекте видел именно такое решение - препроцессор, который выдирает все обращения к `log` и генерирует хидер со списком уникальных id.
  8. Макс Лапшин
    Макс Лапшин 5 лет назад
    препроцессор это вообще неплохая штука, что бы превратить
    • Andrey Shetukhin
      Andrey Shetukhin 5 лет назад
      Я думал о __FILE__, __LINE__, и это даже будет работать, если однотипным ошибкам присваивать разные коды.
    • Макс Лапшин
      Макс Лапшин 5 лет назад
      так ты в это же место вставишь и генератор инкрементального числа.
  9. Илья Анфимов
    Илья Анфимов 5 лет назад
    >всегда можно недоглядеть
  10. Alexey Rybak
    Alexey Rybak 5 лет назад
    а почему тебе не нравится идея с глобальными кодами?
    • Andrey Shetukhin
      Andrey Shetukhin 5 лет назад
      Потому, что придётся их поддерживать вручную, это верный способ получить ошибки на ровном месте, например, скопипастив код и не проверив его.
    • Alexey Rybak
      Alexey Rybak 5 лет назад
      Andrey Shetukhin да, шанс есть, но он небольшой,. мне кажется, ты перестраховываешься. ну а так препроцессор с file/line, да.
    • Александр Акафьев
      Александр Акафьев 5 лет назад
      Andrey Shetukhin, глобальные коды можно локализовать, присвоив каждому модулю свой префикс.
    • Andrey Shetukhin
      Andrey Shetukhin 5 лет назад
      Александр Акафьев это всё понятно. Проблема только в том, что их всё равно надо поддерживать руками.
  11. Kostja Osipov
    Kostja Osipov 5 лет назад
    Почитай как устроен SQL GET DIAGNOSTICS
    • Andrey Shetukhin
      Andrey Shetukhin 5 лет назад
      В DB2?
    • Андрей Якубовский
      Андрей Якубовский 5 лет назад
      Когда-то использовал модифицированный metaphone
    • Kostja Osipov
      Kostja Osipov 5 лет назад
      Andrey Shetukhin в целом "идеологию" так сказать, она описана в стандарте. Что такое diagnostics area, как устроен стэк этих объектов, как на него можно пушать и попать. Это такой микс exception handling и errno, на мой взгляд, сделанный близко к правильному. Например, там есть классы и подклассы ошибок, можно отлавливать всё из определённого класса и т.п., стэк ошибок (что-то типа трейса). А логирование как таковое это уже следствие того как у тебя диагностический стэк устроен.
  12. Igor Podlesny
    Igor Podlesny 5 лет назад
    gettext? — Препроцессор есть, написать автоматический переводчик, который будет из "all your base are belong to us" делать перевод "v4.3 AY555: all your base are belong to us" — легко. Как бонус — можно ещё и "v4.3 AY555: все ваши базы мы поиметь" забацать на досуге
  13. Дементий Салтаев
    Дементий Салтаев 5 лет назад
    У меня такая идея:
  14. Stanislaff Gontarenko
    Stanislaff Gontarenko 5 лет назад
    Да, по админски.