powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Нетормозящее логирование в Джаве.
25 сообщений из 72, страница 2 из 3
Нетормозящее логирование в Джаве.
    #39107900
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей АрсеньевЕсли вывод в журнал идет на отдельный канал ввода-вывода с независимым массивом дисков и основной поток занят работой, а не только сбросом информации в журнал... то в этом случае логирование нас вряд ли нагружает и без выкрутасов.Нет. Я конечно представляю себе как встроить препроцессор который будет высматривать в коде макросы условной компиляции перед передачей их javac и как устроить инвалидацию загруженных классов в класслоадере и подсовывание прошедших компиляцию через препроцессор. Но чисто теоретически. На практике до такой фигни руки не доходили. И вряд ли дойдут.Когда мне захотелось сделать так, чтобы отладочная версия приложения собиралась отдельно, чтобы я определил "public final static" флаги и сделал обёртку, которая начиналась с "if (глобально | локально) return;".
Это позволяло глобально включить отладку или глобально отключить, но включить в отдельной иерархии классов.
Обёртка делала, разумеется, делала несколько больше, чем (примитивное) управление сборкой и однострочная выдача.
Не так кошерно, как препроцессор и сохраняет все недостатки раздельной сборки realease/debug, но имеет право на жизнь и не требует никаких извращений.

Это я всё к тому, что иногда "желание странного" должно наказываться. Чтобы не желали.

P.S. Серверная JVM умеет генерировать более оптимальный (машинный) код, а не то, что вы подумали.
...
Рейтинг: 0 / 0
Нетормозящее логирование в Джаве.
    #39108033
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovКогда мне захотелось сделать так, чтобы отладочная версия приложения собиралась отдельно
Это то понятно.

Я про вариант включить отладку в каком-нибудь наборе классов, назовем его драйвером, на лету. И выключить, когда стало понятно в чем дело.

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

Вариант 2. Динамический. Часть кода вызывающая логгер включается и выключается. Блеск джавы в том, что это можно провернуть практически из коробки, в отличии от статически компилирующих систем. А нищета в том, что это "моветон" и поэтому надо очень постараться, чтобы такое провернуть.
...
Рейтинг: 0 / 0
Нетормозящее логирование в Джаве.
    #39108129
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей АрсеньевЯ про вариант включить отладку в каком-нибудь наборе классов, назовем его драйвером, на лету. И выключить, когда стало понятно в чем дело"... ты только не обижайся" (ц) х/ф "Мимино".
Не знаю почему это не сделано искаропки, но достаточно дёрнуть configureAndWatch и настройки протоколирования будут меняться по мере надобности.
Насколько мне известно, log4j 1.x может терять сообщения при такой перенастройке, но не факт, что это критично.
Т.е. мы опять приходим к тому, что есть рабочее решение, но хочется изобрести своё.
...
Рейтинг: 0 / 0
Нетормозящее логирование в Джаве.
    #39108371
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Странно что в топике никто не вспомнил про шаблон Strategy.
...
Рейтинг: 0 / 0
Нетормозящее логирование в Джаве.
    #39108713
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovТ.е. мы опять приходим к тому, что есть рабочее решение, но хочется изобрести своё.
Еще раз в log4j есть коробочное решение позволяющее в этом фрагменте кода
Код: java
1.
logger.debug("i="+i);


не выполнять
Код: java
1.
"i="+i


если установлен уровень, при котором debug игнорируется?
...
Рейтинг: 0 / 0
Нетормозящее логирование в Джаве.
    #39109239
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей АрсеньевЕще раз в log4j есть коробочное решение позволяющее в этом фрагменте кодаЕщё раз - вы уже продемонстрировали, что это критично?

P.S. Я, как бы, шесть лет администрировал промышленную систему, где на практически каждую ошибку разработчики отвечали "требуются отладочные логи".
И всего один раз, когда им требовалось прикрыть честь мундира, среди прочих придирок было указано, что их волшебный пузырёк в виде собственного аппендера не использовался и это, якобы, создало фатальные проблемы.
...
Рейтинг: 0 / 0
Нетормозящее логирование в Джаве.
    #39110947
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov,

Мы рассматриваем теоретическую возможность или практику.
На практике чаще всего, если не перегибать палку с полным протоколированием каждого чиха это действительно редко важно.
Ну разве что сериализация объекта i в методе toString() не занимает пол часа. :)

С точки зрения большинства реальных задач, не требующих максимальной производительности, как я уже писал, гораздо лучше, чтобы логгер не изменял своего влияния на работающую систему, чем не оказывал его, когда не надо. Поэтому задача ТС про нетормозящее логгирование, для меня больше академическая, чем реальная.
...
Рейтинг: 0 / 0
Нетормозящее логирование в Джаве.
    #39111012
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На самом деле логгирование высоконагруженных участков кода - это
в корне неверная идея. Что там ловим?

Я-бы предложил завести целочисленные счетчики в code-blocks и вести учёт количества
событий. Тоесть если ставится вопрос - а были ли исключения класса Х или ошибки типа
Y или срабатывал ли кейс Z - то этот вариант успешно работает.

Сбрасывать состояние счётчиков можно в обычный лог по времени (раз в сутки),
по финализатору или по спец-методам деструкции для контейнеров
или по "кнопке" если есть JMX.

Мой вариант отчёта - всегда компактен не флудит простынями текстовых файлов и
самое главное - он не ударяет по производительности.
...
Рейтинг: 0 / 0
Нетормозящее логирование в Джаве.
    #39111039
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНа самом деле логгирование высоконагруженных участков кода - это
в корне неверная идея
+1
Хотя это противоречит теме)).
ЗЫ. Например в SSO сервере шибболе, есть замечательная возможность в рантайме включить нужный уровень логирования.
И через минут 10 у вас побегут более подробные логи.
Подебажили и выключили.
Да, противоречит топику, но ...красиво.
...
Рейтинг: 0 / 0
Нетормозящее логирование в Джаве.
    #39111054
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я готов удивиться вместе с вами. И поцокать языком. Но обычно
у меня подобные задачи возникали всего пару раз в жизни.
Первое - была проверка гипотезы. Заходим-ли мы в if- блок
хотя-бы раз в месяц. Это был баг безопасности. И я его подтвердил.
За месяц было 2-3 события.

Второе - был сбор статистики. Нужно было учесть каких событий
в процентном соотношении больше. События не фиксировались в БД
и был вариант реализовать это только в java-коде. Реализовал.
Посчитали. Фиксировать в логах было невыгодно т.к. high-лоад
и админы паниковали. Насчёт места.
...
Рейтинг: 0 / 0
Нетормозящее логирование в Джаве.
    #39111124
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНа самом деле логгирование высоконагруженных участков кода - это
в корне неверная идеяНа самом деле неверной является идея, что некоторые участки кода табуированы для протоколирования.
У протоколирования есть вполне конкретные практические задачи.
Конкретно программистов, обычно, касается задача "найти ошибку постфактум".Что там ловим?Что надо, то и ловим.
И это может быть и заранее предусмотренный сценарий и "затычка по месту на конкретную проблему".Мой вариант отчёта - всегда компактен не флудит простынями текстовых файлов и самое главное - он не ударяет по производительности."Маша наклеила девяносто марок, а профессор - только десять. Но зато все правильно" (ц) Е.Успенский, "Двадцать пять профессий Маши Филипенко".
Компактным должен быть тот протокол, по которому персонал, эксплуатирующий систему получает информацию о работе этой системы.
А вот если ищем ошибку, то компактность отходит на второй план.
...
Рейтинг: 0 / 0
Нетормозящее логирование в Джаве.
    #39111137
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей АрсеньевМы рассматриваем теоретическую возможность или практикуПрактику.гораздо лучше, чтобы логгер не изменял своего влияния на работающую систему, чем не оказывал его, когда не надо"Мы пойдём простым логическим ходом".
Максимально возможный уровень детализации, обычно, trace. Изредка - all.
Предлагаете сохранить все накладные расходы на трассировку для уровня info?
...
Рейтинг: 0 / 0
Нетормозящее логирование в Джаве.
    #39111149
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тут несколько моментов :

1) Это разные подходы между :

Код: java
1.
2.
3.
      
System.out.println("");
System.err.println("");



разное потоки - разное выполнение ...
2) кошерное оформление теста :


Код: java
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.
  import java.util.concurrent.TimeUnit;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.LogManager;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.BenchmarkMode;
import org.openjdk.jmh.annotations.Fork;
import org.openjdk.jmh.annotations.Measurement;
import org.openjdk.jmh.annotations.Mode;
import org.openjdk.jmh.annotations.OutputTimeUnit;
import org.openjdk.jmh.annotations.Param;
import org.openjdk.jmh.annotations.Scope;
import org.openjdk.jmh.annotations.State;
import org.openjdk.jmh.annotations.Warmup;
import org.openjdk.jmh.infra.Blackhole;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;
import ru.stoloto.isalnikov.benchmarkfactorial.Factorial;



@Warmup(iterations = 5)
@Measurement(iterations = 10)
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.MILLISECONDS)
@State(Scope.Benchmark)
@Fork(2)
public class Test
{
  final static LogManager logMgr = new LogManager();
  final static Logger log = logMgr.getLogger(Test.class);
  
  
  
    @Param({"10", "100", "1000", "10000", "50000", "100000"})
    private int n;
   
   
    public int logger(int n) {

        for (int i = 0; i < n; i++) {
            log.trace(Level.TRACE + ": " + i);
            log.debug(Level.DEBUG + ": " + i);
            log.info(Level.INFO + " : " + i);
            log.warn(Level.WARN + " : " + i);
            log.error(Level.ERROR + ": " + i);
            log.fatal(Level.FATAL + ": " + i);
        }

        logMgr.shutdown();
        return 0;
    }
  
    @Benchmark
    public void log(Blackhole bh) {
        bh.consume(logger(n));
    }
   
   
  public static void main(String[] args)  throws RunnerException 
  {

   
              
      Options opt = new OptionsBuilder()
              .include(Factorial.class.getSimpleName())
              .forks(1)
              .build();

      new Runner(opt).run();
      
  }
}
     




# Run progress: 83,33% complete, ETA 00:00:15
# Fork: 1 of 1
# Warmup Iteration 1: log4j:WARN No appenders could be found for logger (ru.stoloto.isalnikov.benchmarkfactorial.AATest).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
91,891 ms/op
# Warmup Iteration 2: 66,285 ms/op
# Warmup Iteration 3: 73,935 ms/op
# Warmup Iteration 4: 62,913 ms/op
# Warmup Iteration 5: 63,678 ms/op
Iteration 1: 61,813 ms/op
Iteration 2: 63,478 ms/op
Iteration 3: 62,874 ms/op
Iteration 4: 63,440 ms/op
Iteration 5: 62,798 ms/op
Iteration 6: 63,161 ms/op
Iteration 7: 63,945 ms/op
Iteration 8: 63,840 ms/op
Iteration 9: 66,408 ms/op
Iteration 10: 63,668 ms/op


Result "log":
63,543 ±(99.9%) 1,791 ms/op [Average]
(min, avg, max) = (61,813, 63,543, 66,408), stdev = 1,185
CI (99.9%): [61,752, 65,333] (assumes normal distribution)


# Run complete. Total time: 00:01:32

Benchmark (n) Mode Cnt Score Error Units
AATest.log 10 avgt 10 0,007 ± 0,002 ms/op
AATest.log 100 avgt 10 0,057 ± 0,002 ms/op
AATest.log 1000 avgt 10 0,591 ± 0,076 ms/op
AATest.log 10000 avgt 10 5,968 ± 0,144 ms/op
AATest.log 50000 avgt 10 31,255 ± 0,839 ms/op
AATest.log 100000 avgt 10 63,543 ± 1,791 ms/op



3) когда вывод в лог пишется как конкатенация - такой код всегда будет выполняться - даже если перед ним будет стоять условие if( тут нужно проверить ) в отличии от форматного кода ... через % - который выполняется в момент вызова -

замените :
Код: java
1.
logger.debug("i="+i);



на

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
  log.debug("i= %d", i);

или String.format("i= %d", 5) ;

+  добавить для наглядности 

if(log.isDebugEnabled()){
}




перепишите заново тесты и будет вам счастье :) + результаты тестов сюда - на обозрение ;)
...
Рейтинг: 0 / 0
Нетормозящее логирование в Джаве.
    #39111155
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4) логгирование через аспекты (АОП / Proxy ) (+ включение/выключение логгирования , когда это требуется )
...
Рейтинг: 0 / 0
Нетормозящее логирование в Джаве.
    #39111157
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum13) когда вывод в лог пишется как конкатенация - такой код всегда будет выполняться - даже если перед ним будет стоять условие if( тут нужно проверить )Вы уверены:
Код: sql
1.
if (false) синтаксически.корректная.фигня(разная, фигня);

?
...
Рейтинг: 0 / 0
Нетормозящее логирование в Джаве.
    #39111188
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovКомпактным должен быть тот протокол, по которому персонал, эксплуатирующий систему получает информацию о работе этой системы.А вот если ищем ошибку, то компактность отходит на второй план.
Вася. Я совершенно не понял твой сарказм.
И я буду настаивать на своей правоте в рамках
решаемых в этом форуме задач. Давай побольше
примеров (хороших и разных) и непредвзятых
и я буду думать как с помощью учёта вхождений в
codeblocks получить любую ценную для тебя и для нас
информацию по ошибкам.
...
Рейтинг: 0 / 0
Нетормозящее логирование в Джаве.
    #39111218
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovAtum13) когда вывод в лог пишется как конкатенация - такой код всегда будет выполняться - даже если перед ним будет стоять условие if( тут нужно проверить )Вы уверены:
Код: sql
1.
if (false) синтаксически.корректная.фигня(разная, фигня);

?

Где то был тест на сам if - (как вариант - задачка на n мерные матрицы
с кучей вложенных форов и проверками на if / сложности n3 и выше)

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

ps

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

но очень похоже на правду ...


if - тормозит
и тормозит конкатенация это 100% - которую нужно заменить на формат ... - который даёт первоманс ...
...
Рейтинг: 0 / 0
Нетормозящее логирование в Джаве.
    #39111265
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1, припомни плиз условие этой задачки. Там суть наверное не в if была а в изменении
сложности.
...
Рейтинг: 0 / 0
Нетормозящее логирование в Джаве.
    #39111286
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonAtum1, припомни плиз условие этой задачки. Там суть наверное не в if была а в изменении
сложности.

не именно в if - просто когда if ов много - это реально они реально торомозят т.к. это такты , это лишние проверки итд ...
...
Рейтинг: 0 / 0
Нетормозящее логирование в Джаве.
    #39111301
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1просто когда if ов много - это реально они реально торомозят
не верю.
Раз уж у нас академический спор)).
...
Рейтинг: 0 / 0
Нетормозящее логирование в Джаве.
    #39111320
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне тоже не верится.
...
Рейтинг: 0 / 0
Нетормозящее логирование в Джаве.
    #39111361
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonДавай побольше примеров (хороших и разных) и непредвзятыхНе я заявил об этом баге на вебовском форуме, но наткнувшись на условия, при которых ошибка стабильно воспроизводилась я смог:
1. Доказать, что ошибка вообще есть;
2. Доказать, что ошибка есть в коде, в правильности которого разработчик поначалу не сомневался.
И то и другое потребовало вдумчивого ковыряния в отладочных логах .

На прошлом месте работы было два случая, когда наличие предупреждения "запрос бла-бла-бла исполняется столько-то секунд" позволило выявить и решить две проблемы. Не критичные, но всё-таки.
Был случай когда, наоборот, я просил убрать бессмысленное предупреждение, а несколько позднее точно выяснил , что код, где это предупреждение выдавалось - содержал ошибку.
Про то, что на практически любую ошибку от меня требовали отладочных логов - я уже упоминал.
Это, что вспомнилось, так сказать, с ходу.
...
Рейтинг: 0 / 0
Нетормозящее логирование в Джаве.
    #39111362
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonМне тоже не верится.

завтра что нибудь придумаю .... :) если вы не троллите :)?!

Код: java
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.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
import java.util.concurrent.TimeUnit;
import org.openjdk.jmh.annotations.*;
import org.openjdk.jmh.infra.Blackhole;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;

@Warmup(iterations = 5)
@Measurement(iterations = 10)
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.MILLISECONDS)
@State(Scope.Benchmark)
@Fork(2)
public class IfTest {

    @Param({"1000", "2500"})
    private int n;

    public static int iftest1(int n) {
        int result = 0;
        for (int i = 0; i < n; i++) {
            if (i < n) {
                for (int j = 0; j < n; j++) {
                    if (j < n) {
                        for (int k = 0; k < n; k++) {
                            if (i == j) {
                                if (j == k) {
                                    result++;
                                }
                            }

                        }
                    }

                }
            }

        }
        return result;
    }


    public static int iftest2(int n) {
        int result = 0;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                for (int k = 0; k < n; k++) {
                    if (i == j) {
                        if (j == k) {
                            result++;
                        }
                    }

                }
            }

        }
        return result;
    }
    
    
        public static int iftest3(int n) {
        int result = 0;
        for (int i = 0; i < n; i++) {
            if (i - i == 0) {
                for (int j = 0; j < n; j++) {
                    if (j -j == 0) {
                        for (int k = 0; k < n; k++) {
                            if (i == j) {
                                if (j == k) {
                                    result++;
                                }
                            }

                        }
                    }

                }
            }

        }
        return result;
    }

    @Benchmark
    public void testIftest1(Blackhole bh) {
        bh.consume(iftest1(n));
    }

    @Benchmark
    public void testIftest2(Blackhole bh) {
        bh.consume(iftest2(n));
    }
    @Benchmark
    public void testIftest3(Blackhole bh) {
        bh.consume(iftest3(n));
    }

    public static void main(String[] args) throws RunnerException {

        Options opt = new OptionsBuilder()
                .include(IfTest.class.getSimpleName())
                .forks(1)
                .build();

        new Runner(opt).run();
    }

}



тут самое главное понять выбросит компилятор проверки или нет ...
...
Рейтинг: 0 / 0
Нетормозящее логирование в Джаве.
    #39111366
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
# Run complete. Total time: 00:03:02

Benchmark (n) Mode Cnt Score Error Units
IfTest.testIftest1 1000 avgt 10 1,306 ± 0,023 ms/op
IfTest.testIftest1 2500 avgt 10 8,069 ± 0,359 ms/op
IfTest.testIftest2 1000 avgt 10 1,009 ± 0,015 ms/op
IfTest.testIftest2 2500 avgt 10 6,235 ± 0,218 ms/op
IfTest.testIftest3 1000 avgt 10 1,000 ± 0,009 ms/op
IfTest.testIftest3 2500 avgt 10 6,083 ± 0,058 ms/op
...
Рейтинг: 0 / 0
Нетормозящее логирование в Джаве.
    #39111367
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1просто когда if ов много - это реально они реально торомозятВы, блин, контекст не теряйте - чтобы условный оператор тормозил на фоне тормозов ввода-вывода ...
...
Рейтинг: 0 / 0
25 сообщений из 72, страница 2 из 3
Форумы / Java [игнор отключен] [закрыт для гостей] / Нетормозящее логирование в Джаве.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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