Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / log4j2 и потоки / 10 сообщений из 10, страница 1 из 1
07.12.2016, 11:41
    #39361680
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
log4j2 и потоки
Добрый день,
может кто сможет подсказать, почему не выводит данные в лог в цикле и после цикла?


Код: 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
07.12.2016, 11:42
    #39361682
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
log4j2 и потоки
Код: 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
07.12.2016, 11:46
    #39361688
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
log4j2 и потоки
Да и вообще вместо педалирования этого цикла вполне хватило бы
Код: java
1.
                sessions.invalidateAll();


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

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

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


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

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



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

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

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

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

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

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

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

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

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

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



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


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