powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / log4j2 и потоки
10 сообщений из 10, страница 1 из 1
log4j2 и потоки
    #39361680
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день,
может кто сможет подсказать, почему не выводит данные в лог в цикле и после цикла?


Код: 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.
        

    public static final Logger logger = LogManager.getLogger();
    ...
    public static void main(String[] args) {
        ...
        ...
        Runtime.getRuntime().addShutdownHook(new Thread() {
            public void run() {
                logger.info("Disconnecting from stomp.");
                try {
                    stompConnection.disconnect();
                } catch (Exception e) {
                    DownloadMeter.logger.error("Error connect to stomp", e);
                }
                logger.info("Force closing sessions: " + sessions.size());
                for(Map.Entry<String, Session> entry : sessions.asMap().entrySet()) {
                    logger.debug("Close session id = " + entry.getKey());
                    try {
                        entry.getValue().close();
                    } catch (Exception e) {
                        logger.error("Error close session", e);
                    }
                }
                logger.info("Close 123123");

            }
        });
    }




Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
15:35:52.033 [main] DEBUG  Debug mode
15:35:52.486 [main] INFO   Connect to stomp server...
15:35:52.504 [main] INFO   Success connected to 192.168.4.230
15:35:54.264 [Thread-1] INFO   Disconnecting from stomp.
15:35:54.264 [Thread-1] INFO   Force closing sessions: 1

Process finished with exit code 1


И еще меня мучает вопрос, когда я делаю вот так:

Код: java
1.
logger.info("Force closing sessions: " + sessions.size());


В продакшене эта строчка не будет давать никакого эффекта, но каждый раз будет выполняться конкатенация. Как правильно такое сделать? Через мейкеры?
...
Рейтинг: 0 / 0
log4j2 и потоки
    #39361682
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
 Cache<String, Session> sessions = CacheBuilder
            .newBuilder()
            .initialCapacity(30000)
            .maximumSize(5000000)
            .expireAfterAccess(60, TimeUnit.SECONDS)
            .removalListener((RemovalListener<String, Session>) notification -> {
                Session session = notification.getValue();
                if (session != null) {
                    logger.debug("Close session: " + notification.getKey());
                    session.close();
                }
            })
            .build();
...
Рейтинг: 0 / 0
log4j2 и потоки
    #39361688
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да и вообще вместо педалирования этого цикла вполне хватило бы
Код: java
1.
                sessions.invalidateAll();


И RemovalListener был бы вызван. Но я сначала долго не мог понять, почему он не срабатывал. Как оказалось, он срабатывал, но так же как и в случае с циклом - просто не писал логи. Но мне уже стало интересно и я навелосипедил цикл.
...
Рейтинг: 0 / 0
log4j2 и потоки
    #39361690
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hett,

Интересная ситуация. А оно стабильно так повторяется? Log4j вешает свой хук. Возможно, он выполняется раньше и когда дело доходит до этого цикла, log4j уже ничего не логирует. Скорее всего там исключение выкидывается.
Оберните в try/catch с выводом в System.out.

А в качестве решения, можно отключить хук от log4j и вырубать его самостоятельно из вашего хука.
...
Рейтинг: 0 / 0
log4j2 и потоки
    #39361696
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HettИ еще меня мучает вопрос, когда я делаю вот так:
Код: java
1.
logger.info("Force closing sessions: " + sessions.size());


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

Во-первых что страшного в конкатенации, тем более она выполняется один раз при закрытии JVM?
Но вообще в мануале пишут, что так же как и в slf4j можно подставлять параметры через фигурные скобки.
https://logging.apache.org/log4j/2.x/performance.html
...
Рейтинг: 0 / 0
log4j2 и потоки
    #39361699
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HettКак оказалось, он срабатывал, но так же как и в случае с циклом - просто не писал логи. Но мне уже стало интересно и я навелосипедил цикл.
Как обычно. Значит нет там исключения. Просто надо родной хук логгера отключить и вызывать его самому.
...
Рейтинг: 0 / 0
log4j2 и потоки
    #39361730
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczHettИ еще меня мучает вопрос, когда я делаю вот так:
Код: java
1.
logger.info("Force closing sessions: " + sessions.size());



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

Во-первых что страшного в конкатенации, тем более она выполняется один раз при закрытии JVM?
Но вообще в мануале пишут, что так же как и в slf4j можно подставлять параметры через фигурные скобки.
https://logging.apache.org/log4j/2.x/performance.html

Есть места где конкатенаций значительно больше и выполняется не только при закрытии, а достаточно много. Я так понял, что узким местом здесь как раз является сама конкатенация в виду создания нового объекта.
...
Рейтинг: 0 / 0
log4j2 и потоки
    #39361735
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczHett,

Интересная ситуация. А оно стабильно так повторяется? Log4j вешает свой хук. Возможно, он выполняется раньше и когда дело доходит до этого цикла, log4j уже ничего не логирует. Скорее всего там исключение выкидывается.
Оберните в try/catch с выводом в System.out.

А в качестве решения, можно отключить хук от log4j и вырубать его самостоятельно из вашего хука.

Повторяется стабильно.
Решение с выключением хука и обработкой его из моего процесса помогло, спасибо :)
Судя по всему два хука выполнялись параллельно и в лог попадало только то, что успевал записать до закрытия.
...
Рейтинг: 0 / 0
log4j2 и потоки
    #39361736
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczНо вообще в мануале пишут, что так же как и в slf4j можно подставлять параметры через фигурные скобки.

Почитал, в общем-то да, думаю это будет быстрее.
...
Рейтинг: 0 / 0
log4j2 и потоки
    #39361740
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HettBlazkowiczНо вообще в мануале пишут, что так же как и в slf4j можно подставлять параметры через фигурные скобки.

Почитал, в общем-то да, думаю это будет быстрее.

Только точнее сказать он не поддерживает скобки {}, а предлагает аналог:

Код: java
1.
2.
3.
if (logger.isDebugEnabled()) {
    logger.debug("Entry number: " + i + " is " + entry[i].toString());
}



если я правильно понял.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / log4j2 и потоки
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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