|
Новый альтернативный Slf4j логгер Бобина
|
|||
---|---|---|---|
#18+
dakeiras, дорогой друг. Я тебе настойчиво советую провести сравнительное тестирование твоей бобины с любой другой имплементацией. Если та (другая имплементация) будет медленной - приводи пример конфигов. Есть масса стероидов как ее разогнать. Я убежден в этом. P.S. Груви никогда не был быстрым с точки зрения runtime. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2019, 15:56 |
|
Новый альтернативный Slf4j логгер Бобина
|
|||
---|---|---|---|
#18+
mayton, ок сделаю, в течении 1 недели. Насчёт Груви - это устаревшее на 10 лет инфа. С динамической компиляцией он медленней обычное Джавы, но достаточно быстр. Со статической компиляцией - он одинаковый по скорости с Джавой (Груви код в равнозначный Джава код переводится). ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2019, 16:02 |
|
Новый альтернативный Slf4j логгер Бобина
|
|||
---|---|---|---|
#18+
dakeirasЯ убрал архивирование, т.к. концептуально это не задача логгера. - не вдаваясь в детали, лично за себя скажу, что мне нравится та функциональность которая есть в Log4J - например, когда захотелось отправить логи через JMS в сборщик логов, не пришлось ничего менять в коде приложения ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2019, 17:15 |
|
Новый альтернативный Slf4j логгер Бобина
|
|||
---|---|---|---|
#18+
dakeirasmayton, ок сделаю, в течении 1 недели. Насчёт Груви - это устаревшее на 10 лет инфа. С динамической компиляцией он медленней обычное Джавы, но достаточно быстр. Со статической компиляцией - он одинаковый по скорости с Джавой (Груви код в равнозначный Джава код переводится). Я попробую поднять свой бенчмарк Groovy в разрезе численных расчетов. Кажется у нас были какие-то суровые проблемы с этим. В основном касалось не компилляции а динамической типизации. Как они порешались сегодня - я не знаю. Но по состоянию на года 3 назад они все еще были. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2019, 17:19 |
|
Новый альтернативный Slf4j логгер Бобина
|
|||
---|---|---|---|
#18+
maytondakeirasmayton, ок сделаю, в течении 1 недели. Насчёт Груви - это устаревшее на 10 лет инфа. С динамической компиляцией он медленней обычное Джавы, но достаточно быстр. Со статической компиляцией - он одинаковый по скорости с Джавой (Груви код в равнозначный Джава код переводится). Я попробую поднять свой бенчмарк Groovy в разрезе численных расчетов. Кажется у нас были какие-то суровые проблемы с этим. В основном касалось не компилляции а динамической типизации. Как они порешались сегодня - я не знаю. Но по состоянию на года 3 назад они все еще были. Так говорю же, у меня используется Статическая Компиляция (аннотаций нет т.к. используется глобальный плагин Gradle для статической компиляции - "Groovy Enterprise Plugin") - все типы статические. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2019, 17:25 |
|
Новый альтернативный Slf4j логгер Бобина
|
|||
---|---|---|---|
#18+
KachalovdakeirasЯ убрал архивирование, т.к. концептуально это не задача логгера. - не вдаваясь в детали, лично за себя скажу, что мне нравится та функциональность которая есть в Log4J - например, когда захотелось отправить логи через JMS в сборщик логов, не пришлось ничего менять в коде приложения Я-же говорю. Встроить в JDK просто одну удачную библиотечку наподобие этой - и конец всем терзаниям и велосипедам. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2019, 17:27 |
|
Новый альтернативный Slf4j логгер Бобина
|
|||
---|---|---|---|
#18+
dakeirasmaytonпропущено... Я попробую поднять свой бенчмарк Groovy в разрезе численных расчетов. Кажется у нас были какие-то суровые проблемы с этим. В основном касалось не компилляции а динамической типизации. Как они порешались сегодня - я не знаю. Но по состоянию на года 3 назад они все еще были. Так говорю же, у меня используется Статическая Компиляция (аннотаций нет т.к. используется глобальный плагин Gradle для статической компиляции - "Groovy Enterprise Plugin") - все типы статические. Я говорю не о компилляции. А о типизации. Я надеюсь ты понимаешь разницу? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2019, 17:28 |
|
Новый альтернативный Slf4j логгер Бобина
|
|||
---|---|---|---|
#18+
Моё предложение в силе. Андрей нашёл 1 явный баг (minor) и 1 потенциальный баг с max open files exceeded. Жду его детали чтобы перевести $. За каждый найденный баг перевожу 20$, макс 5 багов (100$) - в общей сложности на всех. Насчёт потокобезопасности - после анализа Ник не найден, я вижу потокобезопасный баг с довольно редкой частотой. Тоже minor. Готов перевести $. Итого пока 2 minor бага (потокобезопасность), 1 потенциальный баг с закрытием файлов (мне надо это обдумать). Теперь прошу всех отписавшихся скачать и поюзать этот логгер. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2019, 17:31 |
|
Новый альтернативный Slf4j логгер Бобина
|
|||
---|---|---|---|
#18+
mayton, В Груви Статическая компиляция значит Статическую Типизацию. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2019, 17:31 |
|
Новый альтернативный Slf4j логгер Бобина
|
|||
---|---|---|---|
#18+
Частота записи в не те файлы 1 случай на 27500 строк. Это в синтетическом тесте. На практике это будет - 1 на миллионы. Пренебрежимо для логгера. Won't fix - перформанс дороже. Но это хороший фидбек и засчитывается как баг. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2019, 17:37 |
|
Новый альтернативный Slf4j логгер Бобина
|
|||
---|---|---|---|
#18+
dakeiras, я проверю. Но мой вопрос к перформансу - по прежнему актуален. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2019, 17:37 |
|
Новый альтернативный Slf4j логгер Бобина
|
|||
---|---|---|---|
#18+
dakeirasЧастота записи в не те файлы 1 случай на 27500 строк. Это в синтетическом тесте. На практике это будет - 1 на миллионы. Пренебрежимо для логгера. Won't fix - перформанс дороже. Но это хороший фидбек и засчитывается как баг. Капец... ты классный менеджер Won't fix... ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2019, 17:39 |
|
Новый альтернативный Slf4j логгер Бобина
|
|||
---|---|---|---|
#18+
KachalovdakeirasЯ убрал архивирование, т.к. концептуально это не задача логгера. - не вдаваясь в детали, лично за себя скажу, что мне нравится та функциональность которая есть в Log4J - например, когда захотелось отправить логи через JMS в сборщик логов, не пришлось ничего менять в коде приложения с Logstash сейчас и так не приходится менять код. Зато работает быстрее чем JMS. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2019, 17:40 |
|
Новый альтернативный Slf4j логгер Бобина
|
|||
---|---|---|---|
#18+
maytondakeirasЧастота записи в не те файлы 1 случай на 27500 строк. Это в синтетическом тесте. На практике это будет - 1 на миллионы. Пренебрежимо для логгера. Won't fix - перформанс дороже. Но это хороший фидбек и засчитывается как баг. Капец... ты классный менеджер Won't fix... Это обсуждаемо естественно. Чтобы сделать полностью потокобезопасно - надо добавлять либо synchronized, либо ThreadLocal, либо изобретать что-то. Первые 2 - замедляют (ThreadLocal так же плохо влияет на GC). Вопрос - надо ли оно, если на практике почти не проявляется? Зато работает быстрее? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2019, 17:42 |
|
Новый альтернативный Slf4j логгер Бобина
|
|||
---|---|---|---|
#18+
В космос с тобой лететь нельзя... ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2019, 17:50 |
|
Новый альтернативный Slf4j логгер Бобина
|
|||
---|---|---|---|
#18+
mayton, эту проблему нужно рассматривать в комплексе, учитывая стратегии объявления логгеров. Сейчас индустриальная стратегия - делать поле логгера статичным в классах. Это означает повышенную конкуренцию по сравнению с полем экземпляра класса. А значит - частое переключение лог файла. Я уже делал разные реализации включая LogFileManager и ThreadLocal - от всего этого GC плохеет. Я подумаю ещё... ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2019, 17:58 |
|
Новый альтернативный Slf4j логгер Бобина
|
|||
---|---|---|---|
#18+
Не забудь в README.md описать чем ты там жертвуешь в пользу перформанса. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2019, 18:01 |
|
Новый альтернативный Slf4j логгер Бобина
|
|||
---|---|---|---|
#18+
Ну быстрее всего логи просто не писать ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2019, 18:06 |
|
Новый альтернативный Slf4j логгер Бобина
|
|||
---|---|---|---|
#18+
Внёс изменения в соотвествии с рекомендациями уважаемых комментаторов: - SimpleDateFormat убрал (заменил на FastDateFormat из Apache commons) - Добавил ThreadLocal для файлов. Теперь будет потокобезопасно, и даже ещё быстрее. - Добавил закрытие файлов Это пока не релиз. Я несколько дней это всё погоняю на тестовых проектах. Посмотрите коммит, есть ли ещё пожелания. https://github.com/INFINITE-TECHNOLOGY/BOBBIN/commit/1f30913ace83cc283318bd6f77631d8f117357cd Прошу комментаторов оставить свои детали для paypal. Прошу всех скачать логгер и начать им пользоваться :) Он реально очень крут, посоны... ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2019, 19:56 |
|
Новый альтернативный Slf4j логгер Бобина
|
|||
---|---|---|---|
#18+
off Мне вспоминается детская сказка про Толстяка который страдал каннибализмом. Robbin, a bobbin, the big-bellied Ben, He ate more meat than threescore men; He ate a cow, he ate a calf, He ate a butcher and a half; He ate a church, he ate a steeple, He ate the priest and all the people. В переводе Маршака это звучало примерно так. Робин Бобин Барабек Скушал 40 человек... В данном случае bobbin следовало переводить как "катушка". Робин - толстая-катушка Он сожрал - более 60 людей... и так далее. Вобщем этот slf4j логгер должен ассоциироваться с ужасным канибалом который поедает коров, священников а так-же здания и сооружения. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2019, 10:07 |
|
Новый альтернативный Slf4j логгер Бобина
|
|||
---|---|---|---|
#18+
mayton, Бобина это катушка, часть полётного регистратора (чёрного ящика - BlackBox - мой другой проект по автоматическому добавлению логирования в код - если интересно - расскажу о нём). Также бобина используется для бекапов на ленту (кассета). Ну и последнее - у меня есть проект Carburetor (AST API), Бобиной так же называют генератор в двигателях. Так что это исключительно логичное наименование. Вы скачали логгер?:) ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2019, 11:41 |
|
Новый альтернативный Slf4j логгер Бобина
|
|||
---|---|---|---|
#18+
Нет. Я сейчас хочу вернуться к своему проекту CardRaytracer и посмотреть почему Groovy-версию трассировщика луча мы оставили в ветке экспериментальных. Возможно он не работал (это один поинт) или работал медленно (это другой). Но после того как разберусь я смогу показать коеэффициент перформанса между Java/Groovy на вычислительных операциях и каллбеках. Опимизации груви я конечно включу на максимум который только будет возможен. Если у вас есть какие-то дополнения и предложения - буду рад услышать. P.S. Нет ваш логгер я пока не скачал. Мне непонятна его идея. По крайней мере вы ее не раскрыли. И брать просто так логгер без идеи я не хочу. Мне это не интересно. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2019, 12:31 |
|
Новый альтернативный Slf4j логгер Бобина
|
|||
---|---|---|---|
#18+
mayton, Здесь не стоит вопрос быстродействия Груви. Во первых используется Статическая компиляция, которая равнозначна Java коду (см. ниже), во вторых это не предмет этой темы. Тех. стек исследован и проверен на быстродействие. Если интересно ниже класс на Груви и его декомпилированная Java версия. Как видно это обычный Java код. (Используется @CompileStatic глобально через плагин Gradle) Groovy класс: package io.infinite.bobbin.destinations import io.infinite.bobbin.BobbinFile import io.infinite.bobbin.Level import io.infinite.bobbin.config.DestinationConfig import org.slf4j.helpers.Util class FileDestination extends Destination { ThreadLocal<BobbinFile> bobbinFileMap = new ThreadLocal<BobbinFile>() ///////////////////CONSTRUCTOR \/\/\/\/\/\/ FileDestination(DestinationConfig destinationConfig) { super(destinationConfig) } ///////////////////CONSTRUCTOR /\/\/\/\/\/\ @Override protected void store(String finalOutputMessageText, Level level, String className, String date) { String newFileName = bobbinScriptEngine.evalFileName(level.value(), className, date) refreshCurrentFile(newFileName) bobbinFileMap.get().writer.write(finalOutputMessageText) bobbinFileMap.get().writer.flush() } void refreshCurrentFile(String newFileName) { if (bobbinFileMap.get() == null) { bobbinFileMap.set(initFile(newFileName)) } else { if (bobbinFileMap.get().fileName != newFileName) { bobbinFileMap.get().writer.close() bobbinFileMap.set(initFile(newFileName)) } } } BobbinFile initFile(String fileName) { BobbinFile file = new BobbinFile(fileName) file.fileName = fileName file.getParentFile().mkdirs() file.writer = new FileWriter(file, true) return file } static { Util.report("Bobbin: " + Thread.currentThread().getName().padRight(16) + ": " + "application working dir: " + new BobbinFile("./").getCanonicalPath()) } } Он же декомпилирован (Java код): // // Source code recreated from a .class file by IntelliJ IDEA // (powered by Fernflower decompiler) // package io.infinite.bobbin.destinations; import groovy.transform.Generated; import io.infinite.bobbin.BobbinFile; import io.infinite.bobbin.Level; import io.infinite.bobbin.config.DestinationConfig; import java.io.FileWriter; import org.codehaus.groovy.runtime.ScriptBytecodeAdapter; import org.codehaus.groovy.runtime.StringGroovyMethods; import org.slf4j.helpers.Util; public class FileDestination extends Destination { private ThreadLocal<BobbinFile> bobbinFileMap; public FileDestination(DestinationConfig destinationConfig) { super(destinationConfig); ThreadLocal var2 = new ThreadLocal(); this.bobbinFileMap = var2; } protected void store(String finalOutputMessageText, Level level, String className, String date) { String newFileName = ((FileDestination)this).getBobbinScriptEngine().evalFileName(level.value(), className, date); this.refreshCurrentFile(newFileName); Object var10000 = null; ((FileWriter)((BobbinFile)this.bobbinFileMap.get()).getWriter()).write(finalOutputMessageText); var10000 = null; ((FileWriter)((BobbinFile)this.bobbinFileMap.get()).getWriter()).flush(); var10000 = null; } public void refreshCurrentFile(String newFileName) { Object var10000; if (this.bobbinFileMap.get() == null) { this.bobbinFileMap.set(this.initFile(newFileName)); var10000 = null; } else if (ScriptBytecodeAdapter.compareNotEqual(((BobbinFile)this.bobbinFileMap.get()).getFileName(), newFileName)) { ((FileWriter)((BobbinFile)this.bobbinFileMap.get()).getWriter()).close(); var10000 = null; this.bobbinFileMap.set(this.initFile(newFileName)); var10000 = null; } } public BobbinFile initFile(String fileName) { BobbinFile file = new BobbinFile(fileName); file.setFileName(fileName); Object var10001 = null; ((BobbinFile)file).getParentFile().mkdirs(); FileWriter var4 = new FileWriter(file, true); file.setWriter(var4); var10001 = null; return file; } static { Util.report(StringGroovyMethods.plus(StringGroovyMethods.plus(StringGroovyMethods.plus(StringGroovyMethods.plus("Bobbin: ", StringGroovyMethods.padRight(Thread.currentThread().getName(), 16)), ": "), "application working dir: "), ((BobbinFile)(new BobbinFile("./"))).getCanonicalPath())); Object var10000 = null; } @Generated public ThreadLocal<BobbinFile> getBobbinFileMap() { return this.bobbinFileMap; } @Generated public void setBobbinFileMap(ThreadLocal<BobbinFile> var1) { this.bobbinFileMap = var1; } } Касательно идеи - вот это отличный вопрос. Идея очень простая - использовать нативные булевские выражения на Java/Groovy для настройки уровня логирования и классов. Например: Код: java 1.
Код: java 1.
И тоже самое для форматирования: Код: java 1.
Круто, да? Не нужен никакой чудо-синтаксис форматирования Log4j. Не нужна чудо-концепция иерархических логгеров. И ещё: имя файла также настраивается: Код: java 1.
Как видно, оно содержит ${threadName} - и другие переменные - вот так лёгким движением руки ОДНА настройка отвечает за создание МНОГИХ файлов. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2019, 13:17 |
|
Новый альтернативный Slf4j логгер Бобина
|
|||
---|---|---|---|
#18+
dakeirasGroovy класс: Я вот всё никак не мог дойти почитать код. Что-то меня останавливало. То ли то, что автор оценивает умных людей как идиотов, даже не разоравшись. То ли что не понимает, что документацию пишуют чтобы читать, а не чтобы высокомерно отвергать. Но тут понял- человек, неспособный вставить исходник как код- точно не может написать ничего интересного. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2019, 13:24 |
|
Новый альтернативный Slf4j логгер Бобина
|
|||
---|---|---|---|
#18+
dakeirasИдея очень простая - использовать нативные булевские выражения на Java/Groovy для настройки уровня логирования и классов. А если мне на ходу надо включить TRACE? Без остановки приложения. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2019, 13:31 |
|
|
start [/forum/topic.php?fid=59&msg=39845512&tid=2120876]: |
0ms |
get settings: |
20ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
71ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
435ms |
get tp. blocked users: |
1ms |
others: | 310ms |
total: | 871ms |
0 / 0 |