powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Нетормозящее логирование в Джаве.
22 сообщений из 72, страница 3 из 3
Нетормозящее логирование в Джаве.
    #39111369
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1тут самое главное понять выбросит компилятор проверки или нет ...В чём проблема глянуть байт код через (уже) ява-пюре JD-GUI ?
...
Рейтинг: 0 / 0
Нетормозящее логирование в Джаве.
    #39111454
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1, дык... здесь не if тормозит а его тело. Ну ты шутник блин.
...
Рейтинг: 0 / 0
Нетормозящее логирование в Джаве.
    #39111555
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov, примеры хорошие. Но я акцентировал внимание когда
код-под нагрузкой. События генерируются миллионы раз в секунду.
Либо нет места куда писать (прошивка сетевого устройства).

P.S. Я не против логов вообще. Я даже их большой любитель.
...
Рейтинг: 0 / 0
Нетормозящее логирование в Джаве.
    #39111595
uid unique
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot Partisan M]DymytryРешил на досуге изучить вопрос влияния логгирования на производительность.

2) Задать, чтобы команды логирования срабатывали только при достаточном уровне.
Например, в log4j (или LogBack) это будет выглядеть как:

Код: java
1.
2.
3.
if (logger.isDebugEnabled()) {
    logger.debug(какое-то сообщение);
}



Эта предосторжность может иметь смысл, если для создания сообщения требуется существенная работа.
3) Вместо log4j (самая популярная библиотека) по возможности использовать LogBack (автор log4j и LogBack утверждает, что LogBack быстрее. Я не проверял).

1. в LogBack есть асинхронное логирование (с кешем) - заметно быстрее при большой нагрузке, но лог файлы обновляются большими кусками;
2. Используйте slf4j фасад от того же автора (он работает и с log4j и с другими логгерами через редиректоры) - в нем не нужно тащить if (logger.isDebugEnabled()) так как поддерживаются темплейты и строка не склеиваться перед вызовом - поддерживается до 4х позиций в темплайте - к примеру - logger.debug("Some param={} and another param={}", param1, param2);
3. Можете попробовать грязный хак - если используете разные билды - для дебаггинга и для продакшн - if(DEBUG_BUILD_STATIC_BOOLEAN) { logger.debug("message"); } - При компиляции javac его может выпилить.

Для таких злобных циклов не вижу смысла логгировать миллион одинаковых строчек с одним полезным словом, удобнее собрать массив и потом уже его вывести в 10 или 16-ричном формате (матрицу), как в excel.
...
Рейтинг: 0 / 0
Нетормозящее логирование в Джаве.
    #39111784
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonAtum1, дык... здесь не if тормозит а его тело. Ну ты шутник блин.

=)
...
Рейтинг: 0 / 0
Нетормозящее логирование в Джаве.
    #39111916
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovВы, блин, контекст не теряйте - чтобы условный оператор тормозил на фоне тормозов ввода-вывода ...
Мы же договорились, что ввод-вывод мы выкидываем в отдельный поток на отдельный канал ввода-вывода. :)
...
Рейтинг: 0 / 0
Нетормозящее логирование в Джаве.
    #39111922
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И да - выкидывать логику с проверкой установленного уровня логгирования и подключенных аппендеров на верх, перед вызовом logger.debug(...), это как-то моветон.
...
Рейтинг: 0 / 0
Нетормозящее логирование в Джаве.
    #39112366
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНо я акцентировал внимание когда код-под нагрузкойВ очередной раз повторю, что на прошлой работе я администрировал промышленную систему регионального уровня. Регион у нас не особо населённый, система не особо нагруженная, но проблем с производительностью логирования - не было. Проблемы с производительностью системы - были, с производительностью логирования - не было.События генерируются миллионы раз в секунду.Теперь давайте вы приводите практический пример. Брать цифры с потолка и я умею.Либо нет места куда писать (прошивка сетевого устройства)Теоретики вы, блин, теоретики ...
Вот когда практикующий админ публиковал на fido-online "методичку" по удалённому обновлению FreeBSD4 до FreeBSD7 - было интересно: человек многое предусмотрел и продумал, а "шить сетевое устройство" ... Ну обновлял я прошивки пары HP LaserJet разных моделей по сети - вообще ничего волнующего и логи не интересны. Вообще.
...
Рейтинг: 0 / 0
Нетормозящее логирование в Джаве.
    #39112373
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей АрсеньевМы же договорились, что ввод-вывод мы выкидываем в отдельный поток на отдельный канал ввода-вывода. :)Да хоть в dev/nul - я приводил примеры и с null-appender, да и переназначить вывод в "реальный nul" - не проблема.
Только накладные расходы на ввод-вывод это не убирает. Исчезает (только) запись на физическое устройство, а это далеко не всё.
...
Рейтинг: 0 / 0
Нетормозящее логирование в Джаве.
    #39112486
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Про прошивку ты не понял. Я вообще не то имел в виду.
...
Рейтинг: 0 / 0
Нетормозящее логирование в Джаве.
    #39112510
uid unique
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей АрсеньевИ да - выкидывать логику с проверкой установленного уровня логгирования и подключенных аппендеров на верх, перед вызовом logger.debug(...), это как-то моветон.
Моветон конечно если вызов намного дороже получается, в log4j примерно так и было - основная стоимость это не проброс наверх и проверка уровня логирования а склейка строки сообщения. Если же склейки сообщения перед вызовом не происходит то не намного дороже но код намного чище и меньше вероятность Copy/Paste ошибки (не то условие в if(logger.is...). Проверка на уровень логирования и склейка сообщения происходит внутри враппера логгера (slf4j).
На данный момент сижу и выпиливаю if для логеров log4j из старого приложения (перевожу на slf4j wrapper).

Изначально поставлена задача некорректно - логирование нагруженного цикла. В этом случае лучше делать дамп массива данных один раз после цикла (или периодически). Подобные задачи у меня были при обработке графики, там приходилось выкидывать все лишнее из циклов, целочисленное деление сплошь и рядом применять (вместо double), а здесь - логи в Loop на миллион циклов. Кто их читать сможет? В многопоточном приложении будет просто лапша перемешанная на миллионы строчек.
...
Рейтинг: 0 / 0
Нетормозящее логирование в Джаве.
    #39112535
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonПро прошивку ты не понял. Я вообще не то имел в виду.Я всё ещё жду практический пример.

P.S. Если у сетевого устройства нет устройства хранения, то у него есть syslog/SNMP.
...
Рейтинг: 0 / 0
Нетормозящее логирование в Джаве.
    #39112536
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uid uniqueа здесь - логи в Loop на миллион циклов. Кто их читать сможет?Их не читают.
Смотрят на итоговую строку при разных настройках логгеров и понимают, что log4j совсем не такой страшный, как его малюют.
...
Рейтинг: 0 / 0
Нетормозящее логирование в Джаве.
    #39112595
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovmaytonПро прошивку ты не понял. Я вообще не то имел в виду.Я всё ещё жду практический пример.

P.S. Если у сетевого устройства нет устройства хранения, то у него есть syslog/SNMP.
Вот тебе еще пример. Видеокодек. Необходимо фиксировать
пропущенные кадры. Кадры с сбойной контрольной суммой
или ошибки синхронизации для VBR.

Что для этого тоже нужно в лог писать?
...
Рейтинг: 0 / 0
Нетормозящее логирование в Джаве.
    #39112606
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonВидеокодек.
Необходимо фиксировать пропущенные кадры.
Кадры с сбойной контрольной суммой или ошибки синхронизации для VBR.

Что для этого тоже нужно в лог писать?Или то, что перечислено или "В чём подвох?"

P.S. Непонятно, каким образом в этом примере возникли "миллионы событий в секунду" и "прошивка сетевого устройства".
...
Рейтинг: 0 / 0
Нетормозящее логирование в Джаве.
    #39112617
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Test.java
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.LogManager;
import org.apache.log4j.xml.DOMConfigurator;
import java.util.concurrent.atomic.AtomicInteger;

public class Test
{
  private final static int
    THREADS_MIN = 1
  , THREADS_MAX = 25000
  , THREADS_DEFAULT = 10
  , COUNTER_MIN = 1000
  , COUNTER_MAX = 50000000
  , COUNTER_DEFAULT = 5000000;
  
  final static LogManager logMgr = new LogManager();
  private final static Logger log = logMgr.getLogger(Test.class);
  
  static int threads = THREADS_DEFAULT;
  static int count = COUNTER_DEFAULT;
  static AtomicInteger counter = new AtomicInteger(0);

  public static void main(String[] args) throws InterruptedException
  {
    try { threads = Integer.parseInt(args[0]); }
    catch (RuntimeException e) {};
    if (threads < THREADS_MIN) threads = THREADS_MIN;
    if (threads > THREADS_MAX) threads = THREADS_MAX;

    try { count = Integer.parseInt(args[1]); }
    catch (RuntimeException e) {};
    if (count < COUNTER_MIN) count = COUNTER_MIN;
    if (count > COUNTER_MAX) count = COUNTER_MAX;
    
    Thread[] loggers = new Thread[threads];
    Reporter.print("Test for " + count + " iterations over " + threads + " threads started - ");
    for (int i = 0; i < threads; i++) loggers = new Thread(new LogPlain());
    for (Thread logger : loggers) logger.start();
    for (Thread logger : loggers) logger.join();
    Reporter.print("Test for " + count + " iterations over " + threads + " threads stopped - ");
    logMgr.shutdown();
  }
  
  private static class Reporter
  {
    private final static Logger log = logMgr.getLogger(Reporter.class);
    private static long timer = System.currentTimeMillis();;
    static void print(String msg)
    {
      long now = System.currentTimeMillis();
      long delta = now - timer;
      timer = now;
      log.info(msg + delta + " msec");
    }
  }
  
  private static class LogPlain implements Runnable
  {
    private final static Logger log = logMgr.getLogger(LogPlain.class);
    @Override public void run()
    {
      int i = 0;
      for (;;)
      {
        log.fatal(Level.FATAL + ": " + i);
        if (count < (i = counter.incrementAndGet())) return;
        log.error(Level.ERROR + ": " + i);
        if (count < (i = counter.incrementAndGet())) return;
        log.warn (Level.WARN + " : " + i);
        if (count < (i = counter.incrementAndGet())) return;
        log.info (Level.INFO + " : " + i);
        if (count < (i = counter.incrementAndGet())) return;
        log.debug(Level.DEBUG + ": " + i);
        if (count < (i = counter.incrementAndGet())) return;
        log.trace(Level.TRACE + ": " + i);
        if (count < (i = counter.incrementAndGet())) return;
      }
    }
  }
}

log4j.xml
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
<?xml version="1.0" encoding="windows-1251"?>
<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd">

<log4j:configuration debug="false">

  <appender name="console" class="org.apache.log4j.ConsoleAppender">
    <param name="Threshold" value="info" />
    <layout class="org.apache.log4j.EnhancedPatternLayout">
      <param name="ConversionPattern" value="|%d{yyyy-MM-dd HH:mm:ss.SSS Z}|%-5p|%m%n%throwable{short}" />
    </layout>
  </appender>

  <appender name="null" class="org.apache.log4j.varia.NullAppender">
    <layout class="org.apache.log4j.EnhancedPatternLayout">
      <param name="ConversionPattern" value="|%d{yyyy-MM-dd HH:mm:ss.SSS Z}|%-5p|%t|%c|%m%n" />
    </layout>
  </appender>

  <appender name="MAIN" class="org.apache.log4j.AsyncAppender">
    <appender-ref ref="null" />
  </appender>

  <appender name="REPORT" class="org.apache.log4j.AsyncAppender">
    <appender-ref ref="console"/>
    <appender-ref ref="file" />
  </appender>

  <appender name="file" class="org.apache.log4j.FileAppender">
    <param name="File" value="Test.log" />
    <param name="Append" value="true" />
    <layout class="org.apache.log4j.EnhancedPatternLayout">
      <param name="ConversionPattern" value="|%d{yyyy-MM-dd HH:mm:ss.SSS Z}|%-5p|%c|%t|%m%n" />
    </layout>
  </appender>

  <logger name="Test$Reporter">
    <level value="info" />
    <appender-ref ref="REPORT"/>
  </logger>

  <root>
    <priority value="trace"/>
    <appender-ref ref="MAIN"/>
  </root>

</log4j:configuration>

результат с комментариями
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
-- LogLevel - OFF
|2015-11-25 00:36:56.571 +0800|INFO |Test$Reporter|main|Test for 5000000 iterations over 1 threads started - 0 msec
|2015-11-25 00:36:57.335 +0800|INFO |Test$Reporter|main|Test for 5000000 iterations over 1 threads stopped - 764 msec
|2015-11-25 00:36:57.650 +0800|INFO |Test$Reporter|main|Test for 5000000 iterations over 10 threads started - 0 msec
|2015-11-25 00:36:58.914 +0800|INFO |Test$Reporter|main|Test for 5000000 iterations over 10 threads stopped - 1264 msec
|2015-11-25 00:36:59.244 +0800|INFO |Test$Reporter|main|Test for 5000000 iterations over 100 threads started - 0 msec
|2015-11-25 00:37:01.101 +0800|INFO |Test$Reporter|main|Test for 5000000 iterations over 100 threads stopped - 1857 msec
|2015-11-25 00:37:01.431 +0800|INFO |Test$Reporter|main|Test for 5000000 iterations over 1000 threads started - 0 msec
|2015-11-25 00:37:02.976 +0800|INFO |Test$Reporter|main|Test for 5000000 iterations over 1000 threads stopped - 1545 msec
|2015-11-25 00:37:03.322 +0800|INFO |Test$Reporter|main|Test for 5000000 iterations over 10000 threads started - 0 msec
|2015-11-25 00:37:07.146 +0800|INFO |Test$Reporter|main|Test for 5000000 iterations over 10000 threads stopped - 3824 msec

-- LogLevel - TRACE
|2015-11-25 00:37:22.640 +0800|INFO |Test$Reporter|main|Test for 5000000 iterations over 1 threads started - 0 msec
|2015-11-25 00:37:28.303 +0800|INFO |Test$Reporter|main|Test for 5000000 iterations over 1 threads stopped - 5663 msec
|2015-11-25 00:37:28.633 +0800|INFO |Test$Reporter|main|Test for 5000000 iterations over 10 threads started - 0 msec
|2015-11-25 00:37:33.204 +0800|INFO |Test$Reporter|main|Test for 5000000 iterations over 10 threads stopped - 4571 msec
|2015-11-25 00:37:33.566 +0800|INFO |Test$Reporter|main|Test for 5000000 iterations over 100 threads started - 0 msec
|2015-11-25 00:37:38.308 +0800|INFO |Test$Reporter|main|Test for 5000000 iterations over 100 threads stopped - 4742 msec
|2015-11-25 00:37:38.670 +0800|INFO |Test$Reporter|main|Test for 5000000 iterations over 1000 threads started - 0 msec
|2015-11-25 00:37:43.881 +0800|INFO |Test$Reporter|main|Test for 5000000 iterations over 1000 threads stopped - 5211 msec
|2015-11-25 00:37:44.274 +0800|INFO |Test$Reporter|main|Test for 5000000 iterations over 10000 threads started - 0 msec
|2015-11-25 00:37:52.448 +0800|INFO |Test$Reporter|main|Test for 5000000 iterations over 10000 threads stopped - 8174 msec
"LogLevel - OFF" означает, что накладные расходы - исключительно на то самое ужасное "соединение строк".
"LogLevel - TRACE" - соединение строк и вывод в NULL-аппендер. Который, как следует из его названия, никуда и ничего не пишет.

Вроде, всё очевидно - если логирование корректно настроено, то:
1. Составлять строчку для сообщения "плюсиками" - нефатально;
2. Накладные расходы на ввод-вывод - достаточно высоки;
3. Протоколирование из многих потоков заметно только тогда, когда этих потоков [i]действительно много
.
...
Рейтинг: 0 / 0
Нетормозящее логирование в Джаве.
    #39112620
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ладно. Давай на этом закончим. Я просто хотел подытожить что когда мне нужен
перформанс от логгирования я НЕ ЛОГГИРУЮ вообще а веду учёт событий
класса АНАЛИТИКА от лог-файла. До сегодняшнего дня мне это удавалось.
Кроме тех случаев когда в message толкали текстовый файл построчно или нужно
было фиксировать timestamps. Впрочем последнее было крайне редко.
...
Рейтинг: 0 / 0
Нетормозящее логирование в Джаве.
    #39112625
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Странные вы, всё-таки, люди ...
"Не логирую вообще" и тут же "аналитика лог-файла".
"timestamp нужен крайне редко", хотя формирование этих штампов делает сама библиотека и думать об этом вообще не надо. Вот измерять интервалы, да - "только хардкор".
...
Рейтинг: 0 / 0
Нетормозящее логирование в Джаве.
    #39113196
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
может бинарный лог попробовать? + ssd диски?
...
Рейтинг: 0 / 0
Нетормозящее логирование в Джаве.
    #39161807
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не знаю, было ли уже в данной теме. Наткнулся на интересный документ:

Проверка утверждений (assertions) и условная компиляция

В конце статьи приводится пример с условной компиляции. Лично для меня это было новой информацией. Может еще кому интересно будет.
...
Рейтинг: 0 / 0
Нетормозящее логирование в Джаве.
    #39161842
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1может бинарный лог попробовать?
На запись они одинаковы.

Бинарность была-бы бонусом если-бы нужно были вычитывать
потом из этого файла records по номерам или индексировать.
...
Рейтинг: 0 / 0
Нетормозящее логирование в Джаве.
    #39163180
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevЛично для меня это было новой информацией 18441954
...
Рейтинг: 0 / 0
22 сообщений из 72, страница 3 из 3
Форумы / Java [игнор отключен] [закрыт для гостей] / Нетормозящее логирование в Джаве.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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