Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3 4 5 6 7 8 9 10 11   вперед  Ctrl      все
 Re: Новый альтернативный Slf4j логгер Бобина  [new]
mayton
Member

Откуда: loopback
Сообщений: 41808
dakeiras, дорогой друг. Я тебе настойчиво советую провести сравнительное тестирование
твоей бобины с любой другой имплементацией. Если та (другая имплементация) будет
медленной - приводи пример конфигов. Есть масса стероидов как ее разогнать.
Я убежден в этом.

P.S. Груви никогда не был быстрым с точки зрения runtime.
5 авг 19, 15:56    [21942192]     Ответить | Цитировать Сообщить модератору
 Re: Новый альтернативный Slf4j логгер Бобина  [new]
dakeiras
Member

Откуда:
Сообщений: 294
mayton,

ок сделаю, в течении 1 недели.

Насчёт Груви - это устаревшее на 10 лет инфа. С динамической компиляцией он медленней обычное Джавы, но достаточно быстр.
Со статической компиляцией - он одинаковый по скорости с Джавой (Груви код в равнозначный Джава код переводится).
5 авг 19, 16:02    [21942198]     Ответить | Цитировать Сообщить модератору
 Re: Новый альтернативный Slf4j логгер Бобина  [new]
Kachalov
Member

Откуда: Москва
Сообщений: 5649
dakeiras
Я убрал архивирование, т.к. концептуально это не задача логгера.

- не вдаваясь в детали, лично за себя скажу, что мне нравится та функциональность которая есть в Log4J - например, когда захотелось отправить логи через JMS в сборщик логов, не пришлось ничего менять в коде приложения
5 авг 19, 17:15    [21942270]     Ответить | Цитировать Сообщить модератору
 Re: Новый альтернативный Slf4j логгер Бобина  [new]
mayton
Member

Откуда: loopback
Сообщений: 41808
dakeiras
mayton,

ок сделаю, в течении 1 недели.

Насчёт Груви - это устаревшее на 10 лет инфа. С динамической компиляцией он медленней обычное Джавы, но достаточно быстр.
Со статической компиляцией - он одинаковый по скорости с Джавой (Груви код в равнозначный Джава код переводится).

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

Как они порешались сегодня - я не знаю. Но по состоянию на года 3 назад они все еще были.
5 авг 19, 17:19    [21942276]     Ответить | Цитировать Сообщить модератору
 Re: Новый альтернативный Slf4j логгер Бобина  [new]
dakeiras
Member

Откуда:
Сообщений: 294
mayton
dakeiras
mayton,

ок сделаю, в течении 1 недели.

Насчёт Груви - это устаревшее на 10 лет инфа. С динамической компиляцией он медленней обычное Джавы, но достаточно быстр.
Со статической компиляцией - он одинаковый по скорости с Джавой (Груви код в равнозначный Джава код переводится).

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

Как они порешались сегодня - я не знаю. Но по состоянию на года 3 назад они все еще были.


Так говорю же, у меня используется Статическая Компиляция (аннотаций нет т.к. используется глобальный плагин Gradle для статической компиляции - "Groovy Enterprise Plugin") - все типы статические.
5 авг 19, 17:25    [21942286]     Ответить | Цитировать Сообщить модератору
 Re: Новый альтернативный Slf4j логгер Бобина  [new]
mayton
Member

Откуда: loopback
Сообщений: 41808
Kachalov
dakeiras
Я убрал архивирование, т.к. концептуально это не задача логгера.

- не вдаваясь в детали, лично за себя скажу, что мне нравится та функциональность которая есть в Log4J - например, когда захотелось отправить логи через JMS в сборщик логов, не пришлось ничего менять в коде приложения

Я-же говорю. Встроить в JDK просто одну удачную библиотечку наподобие этой - и конец всем
терзаниям и велосипедам.
5 авг 19, 17:27    [21942292]     Ответить | Цитировать Сообщить модератору
 Re: Новый альтернативный Slf4j логгер Бобина  [new]
mayton
Member

Откуда: loopback
Сообщений: 41808
dakeiras
mayton
пропущено...

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

Как они порешались сегодня - я не знаю. Но по состоянию на года 3 назад они все еще были.


Так говорю же, у меня используется Статическая Компиляция (аннотаций нет т.к. используется глобальный плагин Gradle для статической компиляции - "Groovy Enterprise Plugin") - все типы статические.

Я говорю не о компилляции. А о типизации. Я надеюсь ты понимаешь разницу?
5 авг 19, 17:28    [21942294]     Ответить | Цитировать Сообщить модератору
 Re: Новый альтернативный Slf4j логгер Бобина  [new]
dakeiras
Member

Откуда:
Сообщений: 294
Моё предложение в силе.

Андрей нашёл 1 явный баг (minor) и 1 потенциальный баг с max open files exceeded.
Жду его детали чтобы перевести $.

За каждый найденный баг перевожу 20$, макс 5 багов (100$) - в общей сложности на всех.

Насчёт потокобезопасности - после анализа Ник не найден, я вижу потокобезопасный баг с довольно редкой частотой.
Тоже minor. Готов перевести $.

Итого пока 2 minor бага (потокобезопасность), 1 потенциальный баг с закрытием файлов (мне надо это обдумать).

Теперь прошу всех отписавшихся скачать и поюзать этот логгер.
5 авг 19, 17:31    [21942298]     Ответить | Цитировать Сообщить модератору
 Re: Новый альтернативный Slf4j логгер Бобина  [new]
dakeiras
Member

Откуда:
Сообщений: 294
mayton,

В Груви Статическая компиляция значит Статическую Типизацию.
5 авг 19, 17:31    [21942299]     Ответить | Цитировать Сообщить модератору
 Re: Новый альтернативный Slf4j логгер Бобина  [new]
dakeiras
Member

Откуда:
Сообщений: 294
Частота записи в не те файлы 1 случай на 27500 строк.
Это в синтетическом тесте. На практике это будет - 1 на миллионы.

Пренебрежимо для логгера.

Won't fix - перформанс дороже.

Но это хороший фидбек и засчитывается как баг.
5 авг 19, 17:37    [21942302]     Ответить | Цитировать Сообщить модератору
 Re: Новый альтернативный Slf4j логгер Бобина  [new]
mayton
Member

Откуда: loopback
Сообщений: 41808
dakeiras, я проверю. Но мой вопрос к перформансу - по прежнему актуален.
5 авг 19, 17:37    [21942303]     Ответить | Цитировать Сообщить модератору
 Re: Новый альтернативный Slf4j логгер Бобина  [new]
mayton
Member

Откуда: loopback
Сообщений: 41808
dakeiras
Частота записи в не те файлы 1 случай на 27500 строк.
Это в синтетическом тесте. На практике это будет - 1 на миллионы.

Пренебрежимо для логгера.

Won't fix - перформанс дороже.

Но это хороший фидбек и засчитывается как баг.

Капец... ты классный менеджер

Won't fix...
5 авг 19, 17:39    [21942310]     Ответить | Цитировать Сообщить модератору
 Re: Новый альтернативный Slf4j логгер Бобина  [new]
dakeiras
Member

Откуда:
Сообщений: 294
Kachalov
dakeiras
Я убрал архивирование, т.к. концептуально это не задача логгера.

- не вдаваясь в детали, лично за себя скажу, что мне нравится та функциональность которая есть в Log4J - например, когда захотелось отправить логи через JMS в сборщик логов, не пришлось ничего менять в коде приложения


с Logstash сейчас и так не приходится менять код. Зато работает быстрее чем JMS.
5 авг 19, 17:40    [21942313]     Ответить | Цитировать Сообщить модератору
 Re: Новый альтернативный Slf4j логгер Бобина  [new]
dakeiras
Member

Откуда:
Сообщений: 294
mayton
dakeiras
Частота записи в не те файлы 1 случай на 27500 строк.
Это в синтетическом тесте. На практике это будет - 1 на миллионы.

Пренебрежимо для логгера.

Won't fix - перформанс дороже.

Но это хороший фидбек и засчитывается как баг.

Капец... ты классный менеджер

Won't fix...


Это обсуждаемо естественно.

Чтобы сделать полностью потокобезопасно - надо добавлять либо synchronized, либо ThreadLocal, либо изобретать что-то.
Первые 2 - замедляют (ThreadLocal так же плохо влияет на GC).

Вопрос - надо ли оно, если на практике почти не проявляется? Зато работает быстрее?
5 авг 19, 17:42    [21942317]     Ответить | Цитировать Сообщить модератору
 Re: Новый альтернативный Slf4j логгер Бобина  [new]
mayton
Member

Откуда: loopback
Сообщений: 41808
В космос с тобой лететь нельзя...
5 авг 19, 17:50    [21942329]     Ответить | Цитировать Сообщить модератору
 Re: Новый альтернативный Slf4j логгер Бобина  [new]
dakeiras
Member

Откуда:
Сообщений: 294
mayton,

эту проблему нужно рассматривать в комплексе, учитывая стратегии объявления логгеров.

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

А значит - частое переключение лог файла.

Я уже делал разные реализации включая LogFileManager и ThreadLocal - от всего этого GC плохеет.

Я подумаю ещё...
5 авг 19, 17:58    [21942339]     Ответить | Цитировать Сообщить модератору
 Re: Новый альтернативный Slf4j логгер Бобина  [new]
mayton
Member

Откуда: loopback
Сообщений: 41808
Не забудь в README.md описать чем ты там жертвуешь в пользу перформанса.
5 авг 19, 18:01    [21942343]     Ответить | Цитировать Сообщить модератору
 Re: Новый альтернативный Slf4j логгер Бобина  [new]
забыл ник
Member

Откуда:
Сообщений: 2930
Ну быстрее всего логи просто не писать
5 авг 19, 18:06    [21942346]     Ответить | Цитировать Сообщить модератору
 Re: Новый альтернативный Slf4j логгер Бобина  [new]
dakeiras
Member

Откуда:
Сообщений: 294
Внёс изменения в соотвествии с рекомендациями уважаемых комментаторов:
- SimpleDateFormat убрал (заменил на FastDateFormat из Apache commons)
- Добавил ThreadLocal для файлов. Теперь будет потокобезопасно, и даже ещё быстрее.
- Добавил закрытие файлов

Это пока не релиз. Я несколько дней это всё погоняю на тестовых проектах.

Посмотрите коммит, есть ли ещё пожелания.

https://github.com/INFINITE-TECHNOLOGY/BOBBIN/commit/1f30913ace83cc283318bd6f77631d8f117357cd

Прошу комментаторов оставить свои детали для paypal.

Прошу всех скачать логгер и начать им пользоваться :)

Он реально очень крут, посоны...
5 авг 19, 19:56    [21942424]     Ответить | Цитировать Сообщить модератору
 Re: Новый альтернативный Slf4j логгер Бобина  [new]
mayton
Member

Откуда: loopback
Сообщений: 41808
+ 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 логгер должен ассоциироваться с ужасным канибалом который
поедает коров, священников а так-же здания и сооружения.
6 авг 19, 10:07    [21942645]     Ответить | Цитировать Сообщить модератору
 Re: Новый альтернативный Slf4j логгер Бобина  [new]
dakeiras
Member

Откуда:
Сообщений: 294
mayton,

Бобина это катушка, часть полётного регистратора (чёрного ящика - BlackBox - мой другой проект по автоматическому добавлению логирования в код - если интересно - расскажу о нём).

Также бобина используется для бекапов на ленту (кассета).

Ну и последнее - у меня есть проект Carburetor (AST API), Бобиной так же называют генератор в двигателях.

Так что это исключительно логичное наименование.

Вы скачали логгер?:)
6 авг 19, 11:41    [21942756]     Ответить | Цитировать Сообщить модератору
 Re: Новый альтернативный Slf4j логгер Бобина  [new]
mayton
Member

Откуда: loopback
Сообщений: 41808
Нет. Я сейчас хочу вернуться к своему проекту CardRaytracer и посмотреть почему Groovy-версию
трассировщика луча мы оставили в ветке экспериментальных. Возможно он не работал (это один поинт)
или работал медленно (это другой). Но после того как разберусь я смогу показать коеэффициент
перформанса между Java/Groovy на вычислительных операциях и каллбеках.

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

Если у вас есть какие-то дополнения и предложения - буду рад услышать.

P.S. Нет ваш логгер я пока не скачал. Мне непонятна его идея. По крайней мере вы ее
не раскрыли. И брать просто так логгер без идеи я не хочу. Мне это не интересно.
6 авг 19, 12:31    [21942808]     Ответить | Цитировать Сообщить модератору
 Re: Новый альтернативный Slf4j логгер Бобина  [new]
dakeiras
Member

Откуда:
Сообщений: 294
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 для настройки уровня логирования и классов.
Например:
"levels": "['debug', 'info', 'warn', 'error'].contains(level)"

"classes": "className.contains('conf.plugins.input')"


И тоже самое для форматирования:
"format": "level.toUpperCase() + ' [' + threadName + '] ' + dateTime + ': ' + message + '\\n'"


Круто, да? Не нужен никакой чудо-синтаксис форматирования Log4j.
Не нужна чудо-концепция иерархических логгеров.

И ещё: имя файла также настраивается:
"fileName": "\"./LOGS/THREADS/${threadGroupName}/${threadName}/${level}/${threadName}_${level}_${date}.log\"

Как видно, оно содержит ${threadName} - и другие переменные - вот так лёгким движением руки ОДНА настройка отвечает за создание МНОГИХ файлов.
6 авг 19, 13:17    [21942861]     Ответить | Цитировать Сообщить модератору
 Re: Новый альтернативный Slf4j логгер Бобина  [new]
Alexey Tomin
Member

Откуда: Самара
Сообщений: 1749
dakeiras
Groovy класс:


Я вот всё никак не мог дойти почитать код. Что-то меня останавливало.
То ли то, что автор оценивает умных людей как идиотов, даже не разоравшись.
То ли что не понимает, что документацию пишуют чтобы читать, а не чтобы высокомерно отвергать.
Но тут понял- человек, неспособный вставить исходник как код- точно не может написать ничего интересного.
6 авг 19, 13:24    [21942880]     Ответить | Цитировать Сообщить модератору
 Re: Новый альтернативный Slf4j логгер Бобина  [new]
mayton
Member

Откуда: loopback
Сообщений: 41808
dakeiras
Идея очень простая - использовать нативные булевские выражения на Java/Groovy для настройки уровня логирования и классов.

А если мне на ходу надо включить TRACE? Без остановки приложения.
6 авг 19, 13:31    [21942891]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3 4 5 6 7 8 9 10 11   вперед  Ctrl      все
Все форумы / Java Ответить