Строго типизированный лог
Apr. 26th, 2009 11:28 am![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
А вот интересно, возможна ли такая концепция: писать не текстовый лог, а строго типизированный, чтобы в будущем можно было грузить сохраненные в него объекты и выполнять над ними какие-нибудь запросы?
Сейчас анализ логов сводится к grep, awk и прочей тексто-ориентированной линуксятине. Существует мнение, что это (текстово-ориентированный обмен данными между линуксовыми утилитами через |) хорошо, но у меня это усиленно ассоциируется с электронным прибором, у которого все платы соединены одинаковыми никак не различимыми разъемами, а плата сама решает, "что делать с входным сигналом", т.е. нет никакой защиты от обобщенного индуса-дяди-Васи-телемастера-из-соседнего-гаража.
Плохо то, что большинство интересующих объектов обычно содержат кучу пропертей-ссылок на всякие дебри, которые вне рабочего контекста смысла не имеют, а чтобы их исключить, нужно какой-то флаг на проперть типа атрибута/аннотации "NotLoggable". А это плохо тем, что логгинг не должен требовать лишнего от объектов, с которыми он работает.
Сейчас вывод в лог выглядит следующим образом:
А желательно было бы так:
А DebugAll был бы хитрым метапрограммным макросом, который бы доставал, в зависимости от флагов, имя метода, this, все локальные переменные и параметрами с именами и значениями, сериализовал бы это дело во что-то машинно-читабельное и писал бы в лог.
Сейчас анализ логов сводится к grep, awk и прочей тексто-ориентированной линуксятине. Существует мнение, что это (текстово-ориентированный обмен данными между линуксовыми утилитами через |) хорошо, но у меня это усиленно ассоциируется с электронным прибором, у которого все платы соединены одинаковыми никак не различимыми разъемами, а плата сама решает, "что делать с входным сигналом", т.е. нет никакой защиты от обобщенного индуса-дяди-Васи-телемастера-из-соседнего-гаража.
Плохо то, что большинство интересующих объектов обычно содержат кучу пропертей-ссылок на всякие дебри, которые вне рабочего контекста смысла не имеют, а чтобы их исключить, нужно какой-то флаг на проперть типа атрибута/аннотации "NotLoggable". А это плохо тем, что логгинг не должен требовать лишнего от объектов, с которыми он работает.
Сейчас вывод в лог выглядит следующим образом:
mLog.DebugFormat("OnAuthenticateRequest: {0} {1} {2}", httpApplication.Request.RawUrl, httpApplication.Request.UserAgent, httpApplication.Request.UserHostAddress);
А желательно было бы так:
mLog.Debug("some_user_comment",LogFlags.LocalVars | LogFlags.MethodName | LogFlags.This | LogFlags.Parameters);
А DebugAll был бы хитрым метапрограммным макросом, который бы доставал, в зависимости от флагов, имя метода, this, все локальные переменные и параметрами с именами и значениями, сериализовал бы это дело во что-то машинно-читабельное и писал бы в лог.
no subject
Date: 2009-04-26 09:07 am (UTC)no subject
Date: 2009-04-26 09:15 am (UTC)no subject
Date: 2009-04-26 10:00 am (UTC)Потому что я ж пишу не один объект какого-то уже существующего класса, а стопку объектов - комментарий, имя функции, параметры, локальные переменные. Не создавать же каждый раз руками новый класс для этого. В лучшем случае там будет базовый с пропертями вроде UserName, CurrentTimestamp, SourceModule, FunctionName, Comment, а от него должен унаследоваться новый, с полями-пропертями типа "localVar_A","localVar_B", "parameter_A",... итд
А уж во что его сериализовать - это не так важно, но текст нужен для случая "под руками ничего кроме grep для анализа нету".
no subject
Date: 2009-04-26 10:01 am (UTC)ЗЫ. А вообще, совершенная конструкция- это не та, к которой прибавить уже нечего. Это та, от которой отнять уже нечего. Кажется так какой-то авиаконструктор советский сказал.
no subject
Date: 2009-04-26 10:31 am (UTC)no subject
Date: 2009-04-26 11:00 am (UTC)no subject
Date: 2009-04-26 12:38 pm (UTC)no subject
Date: 2009-04-26 12:56 pm (UTC)no subject
Date: 2009-04-26 01:04 pm (UTC)no subject
Date: 2009-04-26 02:24 pm (UTC)no subject
Date: 2009-04-26 04:16 pm (UTC)no subject
Date: 2009-04-26 04:26 pm (UTC)(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2009-04-26 02:46 pm (UTC)no subject
Date: 2009-04-26 03:25 pm (UTC)Опять же - меганабор из grepов, sedов и прочих awkов становится непременим. Как жить дальше?
no subject
Date: 2009-04-26 04:11 pm (UTC)no subject
Date: 2009-04-26 04:25 pm (UTC)no subject
Date: 2009-04-26 04:44 pm (UTC)(no subject)
From:(no subject)
From:no subject
Date: 2009-04-26 05:11 pm (UTC)Конечно, с ними xml не распарсишь, но достать его из базы для обработки каким-нибудь консольным xquery процессором - запросто.
Но я бы предпочел не xml, а автоматически сгенеренную при компиляции строго типизированную схему для логов, тогда чистым SQL можно будет анализировать все что в голову придет.
(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2009-04-26 04:12 pm (UTC)no subject
Date: 2009-04-26 05:04 pm (UTC)no subject
Date: 2009-04-26 07:10 pm (UTC)Какую прогу писать???
Есть xmllint, чтобы отформатировать в читабельный вид.
Есть xqilla для тестов и обработки.
no subject
Date: 2009-04-26 11:27 pm (UTC)(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2009-04-26 11:53 am (UTC)Имею мнение, что на плюсах это через жопу, но реализуемо.
no subject
Date: 2009-04-26 12:55 pm (UTC)А предлагаемый - реализуем разве что на Nemerle и прочих языках с метапрограммированием.
no subject
Date: 2009-04-26 01:03 pm (UTC)тут ничего кроме ILoggable и doLog(ILoggable) в голову не приходит.