Logger с легким выбором имени файла?
От: mDmitriy Россия  
Дата: 23.01.18 09:53
Оценка:
Всем привет!

Пользуемся давно и успешно логгером log4net
Сейчас столкнулись с проблемой — слишком большие логи, в которых перемежаются данные из разнопотоковых задач
Слишком много усилий приходится прикладывать, чтобы последовательно вычленить все записи, относящиеся к одной задаче
Несмотря на комментарии к записям

В связи с этим ищется логгер, где можно было бы в методе логгирования передать имя файла или параметр в паттерн, который формирует имя файла
Есть в такое в природе?
Спасибо...
Re: Logger с легким выбором имени файла?
От: GarryIV  
Дата: 23.01.18 10:03
Оценка:
Здравствуйте, mDmitriy, Вы писали:

D>Пользуемся давно и успешно логгером log4net


D>В связи с этим ищется логгер, где можно было бы в методе логгирования передать имя файла или параметр в паттерн, который формирует имя файла

D>Есть в такое в природе?

Есть такая штука как MDC, туда можно писать id задачи и прочий контекст.
По информации из MDC можно формировать имя файла. Готового решения не знаю надо но писать там немного.

UPD: Можно вообще по другому, завести у себя Graylog и стримить логи в него. В грейлоге значения из MDC видны в виде отдельных полей — можно искать, фильтровать как угодно. Все таки как файлы не бей а все равно неудобно искать по ним.
WBR, Igor Evgrafov
Отредактировано 23.01.2018 10:07 GarryIV . Предыдущая версия .
Re: Logger с легким выбором имени файла?
От: Sharov Россия  
Дата: 23.01.18 10:03
Оценка:
Здравствуйте, 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;
Кодом людям нужно помогать!
Re: Logger с легким выбором имени файла?
От: Mr.Delphist  
Дата: 23.01.18 10:31
Оценка: +1
Здравствуйте, mDmitriy, Вы писали:

D>В связи с этим ищется логгер, где можно было бы в методе логгирования передать имя файла или параметр в паттерн, который формирует имя файла


Так вроде ж сам log4net тоже умеет рулить как множество именованных логгеров как таковых, так и несколько пишущих аппендеров. Созданных как через конфиг, так и программно:
https://stackoverflow.com/questions/19833362/how-to-add-log4net-appender-in-runtime
Re: Logger с легким выбором имени файла?
От: Михаил Романов Удмуртия https://mihailromanov.wordpress.com/
Дата: 23.01.18 11:07
Оценка:
Здравствуйте, mDmitriy, Вы писали:

D>Сейчас столкнулись с проблемой — слишком большие логи, в которых перемежаются данные из разнопотоковых задач

Понимаю, что совет из области "перепишите тут всё", но не рассматривали ли вы вариант перейти на какой-нибудь структурированный (т.е. не текстовый) логгер.
Например, на связку ETW + EventSource (из System.Diagnostics.Tracing Namespace)

Там, конечно, реально потребуется:
а) поменять подход к написанию логов
б) скорее всего придется писать свой анализатор / просмотрщик (стандартные вряд ли устроят).

Но имхо, при росте объема логов вариантов просто нет — раскидывание по сотне разных файлов ситуацию не спасет, имхо.
Re: Logger с легким выбором имени файла?
От: fmiracle  
Дата: 23.01.18 12:08
Оценка:
Здравствуйте, mDmitriy, Вы писали:

D>Пользуемся давно и успешно логгером log4net

D>Сейчас столкнулись с проблемой — слишком большие логи, в которых перемежаются данные из разнопотоковых задач
D>Слишком много усилий приходится прикладывать, чтобы последовательно вычленить все записи, относящиеся к одной задаче
D>Несмотря на комментарии к записям

D>В связи с этим ищется логгер, где можно было бы в методе логгирования передать имя файла или параметр в паттерн, который формирует имя файла

D>Есть в такое в природе?
D>Спасибо...

В NLog можно настроить выбор файла (а точнее target, где файл только один из вариантов) в зависимости от названия логгера. Например по имени класса — в тот файл, отсальные — в этот.
Логи из разных задач имеет смысл писать в разные логгеры. А то, в какой логгер в какой файл — уже настраивать в конфигурации.

Дополнительно, что тоже полезно, выбор собственно имени файла в target можно сделать зависимым от имени пользователя или потока. Типа main_{data}_{T}.log файлов много становится, но иногда весьма удобно это.
Re: Logger с легким выбором имени файла?
От: Max Mustermann  
Дата: 23.01.18 12:14
Оценка:
Здравствуйте, mDmitriy, Вы писали:

D>Пользуемся давно и успешно логгером log4net Сейчас столкнулись с проблемой — слишком большие логи, в которых перемежаются данные из разнопотоковых задач Слишком много усилий приходится прикладывать, чтобы последовательно вычленить все записи, относящиеся к одной задаче


Подумайте над тем, что бы складывать логи в базу. Тогда все подобные проблемы будут реашться "на лету" просто ' and ThreadName = ...'
Re: Всем спасибо! но...
От: mDmitriy Россия  
Дата: 23.01.18 12:30
Оценка:
Поясню, чего хочется
Считать задачи уникально именованными, т.е. имя файла хочется видеть как "<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()
{
}

чем это плохо?

PPS. анализатор этих логов не нужен точно
Re: Logger с легким выбором имени файла?
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 24.01.18 13:31
Оценка:
Здравствуйте, mDmitriy, Вы писали:

D>Слишком много усилий приходится прикладывать, чтобы последовательно вычленить все записи, относящиеся к одной задаче


http://www.enterpriseintegrationpatterns.com/patterns/messaging/CorrelationIdentifier.html

D>В связи с этим ищется логгер, где можно было бы в методе логгирования передать имя файла или параметр в паттерн, который формирует имя файла

D>Есть в такое в природе?

Почитай доки к log4net, скорее всего он такое умеет. На крайняк напиши свой аппендер, раскладывающий разные source по разным файлам.
... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>
AVK Blog
Re: Logger с легким выбором имени файла?
От: TK Лес кывт.рф
Дата: 25.01.18 06:49
Оценка:
Здравствуйте, mDmitriy, Вы писали:


D>Пользуемся давно и успешно логгером log4net

D>Сейчас столкнулись с проблемой — слишком большие логи, в которых перемежаются данные из разнопотоковых задач
D>Слишком много усилий приходится прикладывать, чтобы последовательно вычленить все записи, относящиеся к одной задаче
D>Несмотря на комментарии к записям

D>В связи с этим ищется логгер, где можно было бы в методе логгирования передать имя файла или параметр в паттерн, который формирует имя файла

D>Есть в такое в природе?
D>Спасибо...

Пишите через serilog в эластик — будет простая фильтрация по нужной задаче.
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[2]: Всем спасибо! но...
От: vitz  
Дата: 25.01.18 14:55
Оценка:
Здравствуйте, mDmitriy, Вы писали:

D>Как я понял, log4net (да и NLog) требуют аппендеры с фиксированным именем файла


За NLog — не верно, есть переменная ${logger} которую можно указать в имени/пути файла
var logger = NLog.LogManager.GetLogger("test");
logger.Debug("bla-bla");

вполне работает
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.