Пользуемся давно и успешно логгером log4net
Сейчас столкнулись с проблемой — слишком большие логи, в которых перемежаются данные из разнопотоковых задач
Слишком много усилий приходится прикладывать, чтобы последовательно вычленить все записи, относящиеся к одной задаче
Несмотря на комментарии к записям
В связи с этим ищется логгер, где можно было бы в методе логгирования передать имя файла или параметр в паттерн, который формирует имя файла
Есть в такое в природе?
Спасибо...
Здравствуйте, mDmitriy, Вы писали:
D>Пользуемся давно и успешно логгером log4net
D>В связи с этим ищется логгер, где можно было бы в методе логгирования передать имя файла или параметр в паттерн, который формирует имя файла D>Есть в такое в природе?
Есть такая штука как MDC, туда можно писать id задачи и прочий контекст.
По информации из MDC можно формировать имя файла. Готового решения не знаю надо но писать там немного.
UPD: Можно вообще по другому, завести у себя Graylog и стримить логи в него. В грейлоге значения из MDC видны в виде отдельных полей — можно искать, фильтровать как угодно. Все таки как файлы не бей а все равно неудобно искать по ним.
Здравствуйте, mDmitriy, Вы писали:
D>Всем привет!
D>Пользуемся давно и успешно логгером log4net D>Сейчас столкнулись с проблемой — слишком большие логи, в которых перемежаются данные из разнопотоковых задач D>Слишком много усилий приходится прикладывать, чтобы последовательно вычленить все записи, относящиеся к одной задаче D>Несмотря на комментарии к записям
D>В связи с этим ищется логгер, где можно было бы в методе логгирования передать имя файла или параметр в паттерн, который формирует имя файла D>Есть в такое в природе? D>Спасибо...
Буквально вчера решал такую же задачу у себя -- каждый объект генерируют мн-во потоков, кот. пишут в лог(теперь уже логи).
Решение взял отсюда. Настраивается как-то так:
var logger = UserLogger.AddNamedFileLogger("Logs", fnl);
CallContext.LogicalSetData("logger", logger);
где в дальнейшем потоки, созданные объектом вычитывают:
var logger = CallContext.LogicalGetData("logger") as ILog;
Здравствуйте, mDmitriy, Вы писали:
D>В связи с этим ищется логгер, где можно было бы в методе логгирования передать имя файла или параметр в паттерн, который формирует имя файла
Здравствуйте, mDmitriy, Вы писали:
D>Сейчас столкнулись с проблемой — слишком большие логи, в которых перемежаются данные из разнопотоковых задач
Понимаю, что совет из области "перепишите тут всё", но не рассматривали ли вы вариант перейти на какой-нибудь структурированный (т.е. не текстовый) логгер.
Например, на связку ETW + EventSource (из System.Diagnostics.Tracing Namespace)
Там, конечно, реально потребуется:
а) поменять подход к написанию логов
б) скорее всего придется писать свой анализатор / просмотрщик (стандартные вряд ли устроят).
Но имхо, при росте объема логов вариантов просто нет — раскидывание по сотне разных файлов ситуацию не спасет, имхо.
Здравствуйте, mDmitriy, Вы писали:
D>Пользуемся давно и успешно логгером log4net D>Сейчас столкнулись с проблемой — слишком большие логи, в которых перемежаются данные из разнопотоковых задач D>Слишком много усилий приходится прикладывать, чтобы последовательно вычленить все записи, относящиеся к одной задаче D>Несмотря на комментарии к записям
D>В связи с этим ищется логгер, где можно было бы в методе логгирования передать имя файла или параметр в паттерн, который формирует имя файла D>Есть в такое в природе? D>Спасибо...
В NLog можно настроить выбор файла (а точнее target, где файл только один из вариантов) в зависимости от названия логгера. Например по имени класса — в тот файл, отсальные — в этот.
Логи из разных задач имеет смысл писать в разные логгеры. А то, в какой логгер в какой файл — уже настраивать в конфигурации.
Дополнительно, что тоже полезно, выбор собственно имени файла в target можно сделать зависимым от имени пользователя или потока. Типа main_{data}_{T}.log файлов много становится, но иногда весьма удобно это.
Здравствуйте, mDmitriy, Вы писали:
D>Пользуемся давно и успешно логгером log4net Сейчас столкнулись с проблемой — слишком большие логи, в которых перемежаются данные из разнопотоковых задач Слишком много усилий приходится прикладывать, чтобы последовательно вычленить все записи, относящиеся к одной задаче
Подумайте над тем, что бы складывать логи в базу. Тогда все подобные проблемы будут реашться "на лету" просто ' and ThreadName = ...'
Поясню, чего хочется
Считать задачи уникально именованными, т.е. имя файла хочется видеть как "<prefix>_<dateTime.Now>\<task name>.log
Задач, которые надо логгировать, много, где-то около 1000 в день
На каждую может быть несколько десятков записей в лог
Время жизни задачи — максимум 3 минуты +-
Но надо иметь возможность писать в ее лог даже после завершения задачи
Как я понял, log4net (да и NLog) требуют аппендеры с фиксированным именем файла
Плодить их и отслеживать по lifetime не хочется
Поэтому интересует альтернативный вариант...
PS. тут предлагают совсем тупо (прямо в рабочем потоке):
var taskName = "task1";
try
{
var fileName = GetLogName(string taskName)'
File.AppendAllText(fileName, message);
}
catch()
{
}
Здравствуйте, mDmitriy, Вы писали:
D>Слишком много усилий приходится прикладывать, чтобы последовательно вычленить все записи, относящиеся к одной задаче
D>Пользуемся давно и успешно логгером log4net D>Сейчас столкнулись с проблемой — слишком большие логи, в которых перемежаются данные из разнопотоковых задач D>Слишком много усилий приходится прикладывать, чтобы последовательно вычленить все записи, относящиеся к одной задаче D>Несмотря на комментарии к записям
D>В связи с этим ищется логгер, где можно было бы в методе логгирования передать имя файла или параметр в паттерн, который формирует имя файла D>Есть в такое в природе? D>Спасибо...
Пишите через serilog в эластик — будет простая фильтрация по нужной задаче.
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.