powered by simpleCommunicator - 2.0.30     © 2024 Programmizd 02
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Новый альтернативный Slf4j логгер Бобина
25 сообщений из 320, страница 5 из 13
Новый альтернативный Slf4j логгер Бобина
    #39846061
dakeiras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lelouchdakeiras,

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

Я понимаю про Буферизующие\асинхронные аппендеры (с отдельным тредом). Всё это было и было выпилено за вредностью\ненадобностью.

Но я не понимаю почему Вы говорите что в Бобине потоки будут ждать, пока будет записан другой файл.
Методы Бобины (store, etc) НЕ синхронные, соотвественно копируются на вызов из каждого потока АСИНХРОННО.

авторвот только поток каждый раз ждет, пока файл будет записан.


авторЭто асинхронным его не делает. Кроме этого ОЧЕНЬ усложняет анализ логов.
Наоборот, упрощает, потоки надо группировать (threadGroupName) и логи раскидывать по папкам красиво.
У меня 200 логов я кайфую как всё под контролем.

авторНе могли бы вы показать, где к имени файла примешивается идентификатор потока?
Это хороший вопрос.
Вот тут:
https://github.com/INFINITE-TECHNOLOGY/BOBBIN/blob/master/src/main/groovy/io/infinite/bobbin/BobbinScriptEngine.groovy

Код: java
1.
2.
3.
4.
5.
6.
7.
    String getThreadName() {
        return Thread.currentThread().getName()
    }

    String getThreadGroupName() {
        return Thread.currentThread().getThreadGroup().getName()
    }



Это даёт использовать неявные field reference (добавленные Groovy при компиляции на основании getter'ов выше) в имени файла:

Код: java
1.
"fileName": "\"./LOGS/THREADS/${threadGroupName}/${threadName}/${level}/${threadName}_${level}_${date}.log\""
...
Рейтинг: 0 / 0
Новый альтернативный Slf4j логгер Бобина
    #39846062
dakeiras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lelouchdakeiras,

Если я правильно понял, то на уровне конфигурации:
"fileName": "\"./LOGS/${threadName}/${level}/${threadName}_${level}_${date}.log\"",

при этом если пользователь НЕ укажет threadName при настроке навзания или пути файла - то видимо он ССЗБ :) прэлэстно

Да, возникнет обычный io congestion, как в других логгерах.
...
Рейтинг: 0 / 0
Новый альтернативный Slf4j логгер Бобина
    #39846063
dakeiras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vas0dakeirasпропущено...


на каждый поток отдельный файл и отдельный FileWriter - полностью асинхронная запись, без потерь на synchronized.Код не смотрел, поэтому мой вопрос может показаться ламерский. Потери на synchronized это же не просто потери, synchronized дает гарантию visibility. Что корректное значение записаное в одним потоке, будет прочитано в другом. Как это достигается здесь, через использование immutable+final объектов или как?

Тут потоки никак не взаимодействуют.
...
Рейтинг: 0 / 0
Новый альтернативный Slf4j логгер Бобина
    #39846064
dakeiras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хочу ещё раз подчеркнуть - в Бобине НЕТ io waits/congestion (если отдельные файлы на каждый поток настроены).

Там нет ни одного синхронного метода, за исключением нативных методов ОС при записи по конкретному дескриптору.
...
Рейтинг: 0 / 0
Новый альтернативный Slf4j логгер Бобина
    #39846066
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dakeiras,
dakeiras потоки будут ждать, пока будет записан другой файл.
Потоки будут ждать, пока будет записан ИХ файл. И да, это долго в ряде случаев.

dakeirasНаоборот, упрощает, потоки надо группировать (threadGroupName) и логи раскидывать по папкам красиво.
У меня 200 логов я кайфую как всё под контролем.

А теперь представим что одно событие обрабатывается в нескольких потоках:
1) контроллер добавляет сообщение в очередь
2) Поток слушающий очередь, достает его, нарезает на независимые операции и запускает через Executor#invokeAll. После этого отправляет сообщение через условную atmosphere.
3) atmosphere через свой пул рассылает web socket клиентам.
Как в ваших "удобных" логах собрать весь путь сообщения? видимо только через что-то внешнее
...
Рейтинг: 0 / 0
Новый альтернативный Slf4j логгер Бобина
    #39846069
dakeiras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторПотоки будут ждать, пока будет записан ИХ файл. И да, это долго в ряде случаев.
Идею понял.

Это тестировалось, асинхронные аппендеры - менее эффективны.
...
Рейтинг: 0 / 0
Новый альтернативный Slf4j логгер Бобина
    #39846070
vas0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну если данные генерируются в каких то потоках, а в каких то других потоках идет запись в файлы. Чем тут поможет ThreadLocal?
Только если работа уже идет на уровне immutable string объектах, для объектов другого типа без синхронизации можешь получить некорректные значение.
...
Рейтинг: 0 / 0
Новый альтернативный Slf4j логгер Бобина
    #39846071
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dakeiras,

dakeirasДа, возникнет обычный io congestion, как в других логгерах.
См logstash > fileAppender > prudent.
И да, в других логгерах это возникнет, если пользователь явно настроит 2 разных аппендера на 1 файл. В вашем - если не укажет настроку, которая ни разу не обязательна с его точки зрения.

dakeirasнет io waits
С чего это вдруг их нет?
...
Рейтинг: 0 / 0
Новый альтернативный Slf4j логгер Бобина
    #39846072
dakeiras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторА теперь представим что одно событие обрабатывается в нескольких потоках:
1) контроллер добавляет сообщение в очередь
2) Поток слушающий очередь, достает его, нарезает на независимые операции и запускает через Executor#invokeAll. После этого отправляет сообщение через условную atmosphere.
3) atmosphere через свой пул рассылает web socket клиентам.
Как в ваших "удобных" логах собрать весь путь сообщения? видимо только через что-то внешнее

Через MDC. Имя файла поддерживает MDC, будет кросс-поточный лог файл для конкретного id.
...
Рейтинг: 0 / 0
Новый альтернативный Slf4j логгер Бобина
    #39846074
dakeiras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Точно также это делается для "username", request id, и прочего.
...
Рейтинг: 0 / 0
Новый альтернативный Slf4j логгер Бобина
    #39846075
dakeiras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vas0Ну если данные генерируются в каких то потоках, а в каких то других потоках идет запись в файлы. Чем тут поможет ThreadLocal?
Только если работа уже идет на уровне immutable string объектах, для объектов другого типа без синхронизации можешь получить некорректные значение.

Данные генерируются и записываются в рамках 1 потока.
...
Рейтинг: 0 / 0
Новый альтернативный Slf4j логгер Бобина
    #39846076
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dakeiras,


dakeirasЭто тестировалось, асинхронные аппендеры - менее эффективны.

Они более эффективны даже с точки зрения скорости записи этого самого файла, потому что могут писать его 1 куском. Посмотрите хотя тесты последовательного чтения/записи (например по 1мб) и рандомного (по 4к во всяких crystal disk)
...
Рейтинг: 0 / 0
Новый альтернативный Slf4j логгер Бобина
    #39846077
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dakeirasЧерез MDC. Имя файла поддерживает MDC, будет кросс-поточный лог файл для конкретного id.

То есть чтобы не страдать от вашего логгера, пользователь обязан использовать MDC?
...
Рейтинг: 0 / 0
Новый альтернативный Slf4j логгер Бобина
    #39846078
dakeiras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати Бобина даёт невиданный функционал по кросс-поточному и кросс-классовому отслеживанию действий юзера - очень легко настроить чтобы на каждого юзера (или отдельного юзера) были свои лог файлы, через MDC.

Теперь видите какой это царский функционал?
...
Рейтинг: 0 / 0
Новый альтернативный Slf4j логгер Бобина
    #39846079
dakeiras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LelouchdakeirasЧерез MDC. Имя файла поддерживает MDC, будет кросс-поточный лог файл для конкретного id.

То есть чтобы не страдать от вашего логгера, пользователь обязан использовать MDC?

В других логгерах это без MDC не сделать. Только там будет общий файл-каша.
А тут отдельные файлы.

Единственная альтернатива - переименовывать потоки, что не рекомендуется.
...
Рейтинг: 0 / 0
Новый альтернативный Slf4j логгер Бобина
    #39846080
dakeiras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторСм logstash > fileAppender > prudent.
И да, в других логгерах это возникнет, если пользователь явно настроит 2 разных аппендера на 1 файл. В вашем - если не укажет настроку, которая ни разу не обязательна с его точки зрения.


Посмотрю, спасибо.

авторОни более эффективны даже с точки зрения скорости записи этого самого файла, потому что могут писать его 1 куском. Посмотрите хотя тесты последовательного чтения/записи (например по 1мб) и рандомного (по 4к во всяких crystal disk)

Это тоже посмотрю. Благодарю.
...
Рейтинг: 0 / 0
Новый альтернативный Slf4j логгер Бобина
    #39846081
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dakeirasКстати Бобина даёт невиданный функционал по кросс-поточному и кросс-классовому отслеживанию действий юзера - очень легко настроить чтобы на каждого юзера (или отдельного юзера) были свои лог файлы, через MDC.

Теперь видите какой это царский функционал?

Нет не вижу.
Что по остальным пунктам? Например IOException при ошибке записи файла.
...
Рейтинг: 0 / 0
Новый альтернативный Slf4j логгер Бобина
    #39846083
vas0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dakeirasvas0Ну если данные генерируются в каких то потоках, а в каких то других потоках идет запись в файлы. Чем тут поможет ThreadLocal?
Только если работа уже идет на уровне immutable string объектах, для объектов другого типа без синхронизации можешь получить некорректные значение.

Данные генерируются и записываются в рамках 1 потока. А как же асинхронные апендеры?
...
Рейтинг: 0 / 0
Новый альтернативный Slf4j логгер Бобина
    #39846084
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vas0dakeirasпропущено...


Данные генерируются и записываются в рамках 1 потока. А как же асинхронные апендеры?
Их нет. Тут ничего нет кроме консоли и файла. Кстати, dakeiras, вы в курсе, что System.out.println синхронный?
...
Рейтинг: 0 / 0
Новый альтернативный Slf4j логгер Бобина
    #39846086
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lelouchvas0пропущено...
А как же асинхронные апендеры?
Их нет. Тут ничего нет кроме консоли и файла. Кстати, dakeiras, вы в курсе, что System.out.println синхронный?

Даже уточню - выполняет синхронизацию на this.
...
Рейтинг: 0 / 0
Новый альтернативный Slf4j логгер Бобина
    #39846087
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot dakeiras]В других логгерах это без MDC не сделать. Только там будет общий файл-каша.
Решается условным graylog. И это удобнее чем "куча файлов"
...
Рейтинг: 0 / 0
Новый альтернативный Slf4j логгер Бобина
    #39846093
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dakeiras,

ну и на последок хочу заметить, что ваш логгер в том числе не защищен от случая, когда 2 потока имеют одинаковое название.
https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html#setName(java.lang.String) Every thread has a name for identification purposes. More than one thread may have the same name. If a name is not specified when a thread is created, a new name is generated for it.

Нигде в документации не заостряется, что имя файла явно должно содержать threadName в настройках шаблона имени файла и не указано требование уникальности имени потока (или уникальности пары threadGroupName и threadName).

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

Как когда-то выразился мой преподавать на 1 курсе:
Ваша программа представляет из себя хрупкую игрушку, работающую только в руках создателя.
...
Рейтинг: 0 / 0
Новый альтернативный Slf4j логгер Бобина
    #39846107
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dakeirasКстати Бобина даёт невиданный функционал по кросс-поточному и кросс-классовому отслеживанию действий юзера - очень легко настроить чтобы на каждого юзера (или отдельного юзера) были свои лог файлы, через MDC.

Теперь видите какой это царский функционал?
Обычно (в 99%) случаев настройкой системы логгирования заняты дев-опсы. И они себе ставят
вполне себе конкретные задачи. Как-то
- безопасность и аудит
- перформанс
- анализ ошибок

Для всех этих задач этот царский функционал не нужен. Ну или я не знаю такого юзкейса.
Логгировать отдельно поток нет никакого смысла. Поток - это ресурс который берут из "обоймы"
доступных ресурсов и роль потока в крупном приложении может серъезно менятся в считанные
секунды.

Вести одновременно 200 логов с точки зрения файловой системы накладно т.к. нужно иметь
200 файловых дескрипторов и соотв 200 объектов представляющих файл (буферов). Накладные
расходы можно считать а можно и нет. Но поинт опять-же в том что это может быть накладно
(так-же как и держать 65000 открытых сокетов на веб-сервере) и иногда количество переходит
в качество. Для старых магнитных накопителей время seektime безсмысленно тратится
на беготню по поверхности диска и вы получаете жалкие 25 мегабайт в секунду потому-что
вместо throughput получили IOPS, и чтобы получить паспортные пропускные способности
диска - вам лучше вернуться к классической схеме где есть 1 или 2 лога на всё приложение.

Если-же вы слишком долго буферизируете лог без флаша то рискуете получить недописанные
хвостики логов в случае краша приложения.

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

Провертье мою гипотезу. Нажмите reset под нагрузкой и проследите что самые последние
бизнес аудиты были сохранены.
...
Рейтинг: 0 / 0
Новый альтернативный Slf4j логгер Бобина
    #39846109
dakeiras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторОбычно (в 99%) случаев настройкой системы логгирования заняты дев-опсы. И они себе ставят
вполне себе конкретные задачи. Как-то
- безопасность и аудит
- перформанс
- анализ ошибок

Для всех этих задач этот царский функционал не нужен. Ну или я не знаю такого юзкейса.
Логгировать отдельно поток нет никакого смысла. Поток - это ресурс который берут из "обоймы"
доступных ресурсов и роль потока в крупном приложении может серъезно менятся в считанные
секунды.

Я завтра с работы подробно отвечу на комментарии.

Касательно ELK - там невозможно вручную логи смотреть, поэтому отдельные файлы на каждый лог - дают выигрыш в производительности - за счёт отсутствия io congestion.

Если нет ELK, в случаях с пакетными приложениями, ETL, индустриальными приложениями с фиксированными потоками - там возможность отдельных лог файлов это супер фича.
Когда требуется вручную разбирать лог файлы. И в процессе отладки приложения.
...
Рейтинг: 0 / 0
Новый альтернативный Slf4j логгер Бобина
    #39846113
dakeiras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lelouchdakeiras,

ну и на последок хочу заметить, что ваш логгер в том числе не защищен от случая, когда 2 потока имеют одинаковое название.
https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html#setName(java.lang.String) Every thread has a name for identification purposes. More than one thread may have the same name. If a name is not specified when a thread is created, a new name is generated for it.

Нигде в документации не заостряется, что имя файла явно должно содержать threadName в настройках шаблона имени файла и не указано требование уникальности имени потока (или уникальности пары threadGroupName и threadName).

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

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

Никто не говорит, что обязательно разделять.

Просто с точки зрения здравого смысла, если у вас есть 500 потоков - писать лог в единый файл - это бред, наркомания укоренившаяся с годами.
Т.к. очевидно что это вызывает очередь на запись в этот файл.

Хрупкая или нет - есть артифакты публично доступные через Magen/Gradle.

Качаем, ломаем - я плачу бабло.
У меня принцип - ОТВЕЧАТЬ за свой опен сорс софт.

PS: если не нравится threadName, ну напишите threadName+Thread.currentThread().getId()
...
Рейтинг: 0 / 0
25 сообщений из 320, страница 5 из 13
Форумы / Java [игнор отключен] [закрыт для гостей] / Новый альтернативный Slf4j логгер Бобина
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]