metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2015-12-18 01:20 pm

Логи

Я пришел к выводу, что осмысленно выбрать уровни логов (log4j, log4net) в вызовах внутри программы при разработке невозможно.
Всегда возникнет ситуация, в которой конкретно вот сейчас, без перезагрузки сервиса надо сменить уровень лога в данном конкретном методе.
Делать отдельные логгеры на каждый чих и конфигурировать их - это адский комбинаторный взрыв, конфиги становятся нечитабельными, когда там в xml пытаются засунуть то, что должно быть матрицей M(логгеров)*N(аппендеров), а еще лучше такой же матрицей, только с иерархией (общий, группа логгеров, логгер) по одной оси и аналогично для аппендеров по другой.

Кажется, надо просто логи складывать в очереди и фильтровать их по уровням не на этапе создания, а на этапе чтения. Возможно, разве что уберотладочные на каждую букву в каком-нибудь парсере с конечным автоматом отсеивать, и то не факт.

[identity profile] bydlorus.livejournal.com 2015-12-18 10:21 am (UTC)(link)
В каждый msg - облако тэгов!

[identity profile] metaclass.livejournal.com 2015-12-18 11:24 am (UTC)(link)
Было бы весьма удобно.
Только не облако, а словарь типа "поле: значение" и потом по ним фильтровать.

[identity profile] nealar.livejournal.com 2015-12-18 12:01 pm (UTC)(link)
MDC?

[identity profile] henu3detb.livejournal.com 2015-12-18 10:32 am (UTC)(link)
смена log level в log4j не требует перезагрузки сервера.

[identity profile] metaclass.livejournal.com 2015-12-18 10:53 am (UTC)(link)
Я про уровень в вызове логгеров, в коде особо не поменяешь на ходу.
И таки делать имитацию этого средствами log4х - неудобненько.

[identity profile] henu3detb.livejournal.com 2015-12-18 10:55 am (UTC)(link)
Поставил дебаг для всего, погрепал, вернул в ворн.
Чота я не вижу проблемы.

[identity profile] metaclass.livejournal.com 2015-12-18 11:25 am (UTC)(link)
дебаг для всего + лимиты на размер логов - информация за час уходит в никуда.

[identity profile] berezovsky.livejournal.com 2015-12-18 11:33 am (UTC)(link)
можно периодически паковать и складывать на удалённый сервер

[identity profile] henu3detb.livejournal.com 2015-12-18 12:06 pm (UTC)(link)
или агрегаторы логов

[personal profile] leotsarev 2015-12-18 02:00 pm (UTC)(link)
Тем же лог4нет делаем так: еррорные логи лежат за годы, инфошные за недели, дебажные за дни.

[identity profile] metaclass.livejournal.com 2015-12-18 02:50 pm (UTC)(link)
Я просто по размеру ограничиваю все кроме error.
На клиентах до 10 мег, на сервере до 100 мег.

[personal profile] leotsarev 2015-12-18 02:51 pm (UTC)(link)
Они по размеру ограничены, я результат говорю
develop7: (dero)

[personal profile] develop7 2015-12-18 10:34 am (UTC)(link)
ещё добавить вагон метаинформации к каждой записи и получится почти journald

[identity profile] metaclass.livejournal.com 2015-12-18 10:41 am (UTC)(link)
Ну да, модуль, метод внутри модуля, категория событий, уровень, вся информация о том где и как это произошло и прочая, прочая и прочая.

[identity profile] n16bs.livejournal.com 2015-12-18 11:00 am (UTC)(link)
Давайте просто снимать и складывать инкрементные дампы процесса вместо писания логов.
develop7: (dero)

[personal profile] develop7 2015-12-18 11:09 am (UTC)(link)
логика из разряда «поскольку преступления по-прежнему происходят, полицию следует распустить». пробуйте тяжелее.

[identity profile] n16bs.livejournal.com 2015-12-18 11:14 am (UTC)(link)
В моём посте нет тега иронии.
develop7: (dero)

[personal profile] develop7 2015-12-18 11:17 am (UTC)(link)
без иронии, значит. надо понимать, вы и сами так делаете (иначе с чего бы вы другим людям советовали), да?

[identity profile] nivanych.livejournal.com 2015-12-18 11:43 am (UTC)(link)
Не делает, но собирается!
И собирает единомышленников!

[identity profile] metaclass.livejournal.com 2015-12-18 11:26 am (UTC)(link)
Да, диффы состояний процесса было бы неплохо.

[identity profile] ynot.livejournal.com 2015-12-18 06:25 pm (UTC)(link)
в хекс-едиторе, буахаха.

(Метаязык описания состояния процесса ннада? убер-стек-трейс. Как свойство языка, понятное дело, чтоб без лишних телодвижений. может получиться забавно.)

[identity profile] blackyblack.livejournal.com 2015-12-18 11:09 am (UTC)(link)
Ну я так и делаю: [дата время] [уровень лога] [поток] [модуль] [функция:строка] текст
При желании можно пофильтровать как душе угодно.

[identity profile] gineer.livejournal.com 2015-12-18 12:50 pm (UTC)(link)
и по идее большую часть из этого можно кешировать/препроцесить... или вообще, хранить вместе с дебажной информацией?

[identity profile] metaclass.livejournal.com 2015-12-18 01:44 pm (UTC)(link)
Внятных способов не знаю.
А вообще очень сильно не помешало бы - ссылаться из лога прямо на место в *.pdb, да еще и с областями памяти локальных переменных.

[identity profile] gineer.livejournal.com 2015-12-18 01:13 pm (UTC)(link)
и по идее большую часть из этого можно кешировать/препроцесить... или вообще, хранить вместе с дебажной информацией?

[identity profile] kiryl.livejournal.com 2015-12-18 11:21 am (UTC)(link)
Может тебе нужен осмысленый трейсинг вместо логирования? Думаю, в ваших jvm'ах с д дотнетами это не дожно быть проблемой. Особенно если производительноить не сильно поджимает.

[identity profile] metaclass.livejournal.com 2015-12-18 11:29 am (UTC)(link)
Если хотя бы показывать метод в дотнете. доставая его из стек-трейса - оно уже просаживается по производительности.
Полноценный трейсинг незавимый то там есть, но пользоваться им, это как всем остальным дотнетом - вроде есть, но сделано криво и неудобно.

[identity profile] kiryl.livejournal.com 2015-12-18 11:41 am (UTC)(link)
дык не показывай. складывай бинарные стекфреймы в сторонку куда-нить и разгребай в offline. ftrace в ядре как-то так и работает: во время трассировки складыват в бинарный ring buffer и только когда кто-то попросил делает из этого что-то читаемое. получается терпимо.

[identity profile] jakobz.livejournal.com 2015-12-18 11:24 am (UTC)(link)
Мне еще иерархичности самих логов не хватает. Скажем обрабатываем веб-запрос. Ну там trace("начал"), trace("пошол в бд"), trace("кончел").

Вот эти все trace - нахер не нужны в 99% случаев, но если оно где-то упало в конце - неплохо бы поиметь их все, с самого начала, на всю обработку запроса.

Если бы лог был бы древовидный, это все можно было бы неплохо завернуть. Включая, вероятно, и твою задачу - включить логирование всего для такого-то метода на время, вместе с трейсами.

[identity profile] metaclass.livejournal.com 2015-12-18 11:27 am (UTC)(link)
Да, не хватает и этого тоже.

[identity profile] jakobz.livejournal.com 2015-12-18 11:33 am (UTC)(link)
Кстати вот в teamcity когда лог смотришь - он как раз так показывает, причем на лету обновляет и показывает текущую ветку. Вот такое бы что-нибудь.

[identity profile] nivanych.livejournal.com 2015-12-18 11:46 am (UTC)(link)
Если придумать способ как-то адекватно ограничить запись в подветку,
что после какого-то времени, её можно было "законсервировать" без конфликтов,
то получилось бы вполне годная штука.
С другой стороны, для логов в базе данных, их деревянность почти ничего не усложнит и не сильно замедлит.
Кроме того, что для каких-то случаев обработки, они принципиально сложнее.

[identity profile] voidex.livejournal.com 2015-12-18 12:50 pm (UTC)(link)
Я эксперимента ради делал так:
scope "foo" $ do
  log Trace "lala"
  ...
  log Trace "done"


Если всё вышло ок, ниже какого-то уровня ничего не выводится, а если фейл - выводятся
+ путь из scope-ов

Ну и соот-но можно временно для конкретного scope или пути включить логирование всего подряд

[identity profile] jakobz.livejournal.com 2015-12-18 12:56 pm (UTC)(link)
У меня такая же приспособа для всяких тормозных background-job-ов.
Пишешь
var result = ctx.Run("Querying API", () => api.Query("http://a.com"));
И в лог срется типа
Starting Querying API
... тут всякое вложенное с отступом
Done Querying API in 13 sec.

[identity profile] tonsky.livejournal.com 2015-12-18 06:55 pm (UTC)(link)
Это тоже теги. RequestId=1124343, все сообщения, связанные с реквестом, им протегированы

[identity profile] nivanych.livejournal.com 2015-12-18 11:42 am (UTC)(link)
> не на этапе создания, а на этапе чтения

В таком случае, придётся отказаться от чего-то типа "paranoid"-уровня логов —
будет просто чрезмерно для обычных случаев засирать.
Впрочем, я очень не уверен, нужно ли такое.

[identity profile] vit-r.livejournal.com 2015-12-18 02:27 pm (UTC)(link)
Если формально описать то, что я делал, то вместо уровней лога было несколько логов для разной информации. Иногда это шло вперемежку с различными маркерами впереди строки, иногда записывалось в таблицы и выдавлось при дампе. Но там всё было с маркерами привязки (такая-то функция при таких-то параметрах в таком-то месте).

[identity profile] ilya-portnov.livejournal.com 2015-12-18 02:28 pm (UTC)(link)
Есть ещё вариант каждому сообщению, которому может быть захочется поменять уровень, присваивать какой-нибудь guid. И в БД/конфиге иметь табличку переопределений guid -> severity. Генерацию гуидов и удобное редактирование конфига повесить на платформу/среду разработки.

[identity profile] victorgr.livejournal.com 2015-12-18 03:06 pm (UTC)(link)
Как не допускать попадания в логи приватных данных?

[identity profile] metaclass.livejournal.com 2015-12-18 04:21 pm (UTC)(link)
Методом "дать 100 гб логов безопасникам заказчика и пусть фильтруют от приватных данных". А на вопросы юзеров - посылать к ним же. "Они еще логи не очистили".

На практике - ну не писать эти данные в логи, делов то.

[identity profile] jakobz.livejournal.com 2015-12-18 07:30 pm (UTC)(link)
Ха, я помню у нас приложение одно срало в логи XML-ем столько, что одно это жрало половину ресурсов. А еще 2/3 от этого - тратилось на сериализацию/десериализацию, и на GC этого всего говна.

Так вот даже в такой ситуации умные люди не постеснялись туда регекс впаять, который >10 последовательных цифр крестиками заменяет - номера кредиток отфильтровывать. Чтобы еще больше тормозило.

Впрочем, стоит заметить, когда у тебя каждый вход и каждый выход лежит на диске, аккуратно по папочкам - дебаггер особо включать даже и не надо.

[personal profile] zaharchenko 2015-12-18 10:34 pm (UTC)(link)
А не легче ли в таком случае дебагером подключиться к работающему процессу?

[identity profile] metaclass.livejournal.com 2015-12-19 04:07 pm (UTC)(link)
Надо считать, что в среднем на продакшен у программистов нет доступа.
А если есть - то там нет админских прав.

[personal profile] zaharchenko 2015-12-20 12:58 pm (UTC)(link)
А какие-то другие проблемы кроме прав есть? А то если я правильно понимаю, в том же ерланге, как-то дают программистам копаться в дебаговой консоли в продакшене. У меня в php то же к любом скрипту в принципе можно подключиться посмотреть что там происходит внутри, единственное фиг поправишь.

Да и по большому счету, вот логи, право читать их программисту как-то кто-то дал же, почему не дать право на подебагать?

[identity profile] inconceivable2.livejournal.com 2015-12-19 07:09 am (UTC)(link)
А вроде есть же хитрая идея писать все и всегда, но не на диск, а в кольцевой буфер в памяти и максимально быстро, и если вдруг чего крякнуло, то сохранить это буфер. Ну а если не крякнуло, то так и перезаписывать его поверх, пока не крякнет. Не знаю, делает ли кто так.

[identity profile] metaclass.livejournal.com 2015-12-19 04:09 pm (UTC)(link)
Так можно, за исключением одной тонкости с log4net - ему можно передавать какие угодно объекты, но он от них будет вызывать ToString() (который может быть сколь угодно тяжелым) только если этот объект пролез через фильтры уровня логов.