Как назначить уникальный идентификатор для каждой транзакции, используя logback и slf4j

Я работаю над корпоративным j2ee-приложением для электронной коммерции, используя Spring framework, jersey framework. В настоящее время мы регистрируем все транзакции (транзакции, созданные путем использования сообщений из очереди/через запросы веб-службы).

Допустим, у меня есть сообщение, которое не удалось обработать в моем компоненте. Я хочу получить все журналы (информация обо всех уровнях журналов, отладка, ошибка...) для этой транзакции. В настоящее время я просматриваю имя потока, чтобы определить все журналы для этой транзакции. Я не хочу долго полагаться на это, так как возможно, что имена потоков могут быть одинаковыми через определенный момент времени.

2016-07-14 02:45:50,716 [DefaultMessageListenerContainer-3] DEBUG SomeClass — someMethod1 () — запись метода

2016-07-14 02:45:50,724 [DefaultMessageListenerContainer-3] SomeClass1 – someMethod2() количество вставленных строк: [1]

2016-07-14 02:45:50,724 [DefaultMessageListenerContainer-3] DEBUG SomeClass — someMethod1() — выход из метода

Возможно ли, что у меня могут быть журналы с чем-то вроде этого

2016-07-14 02:45:50,716 [sometransactionnbr] [DefaultMessageListenerContainer-3] DEBUG SomeClass — someMethod1 () — запись метода

2016-07-14 02:45:50,724 [sometransactionnbr] [DefaultMessageListenerContainer-3] SomeClass1 – someMethod2() количество вставленных строк: [1]

2016-07-14 02:45:50,724 [sometransactionnbr] [DefaultMessageListenerContainer-3] DEBUG SomeClass — someMethod1() — выход из метода

Как можно легко добавить этот «sometransactionnbr» без изменения кода для каждого написанного мной метода?


person daemon54    schedule 14.07.2016    source источник


Ответы (1)


Жаль, что нет быстрых изменений...

Во-первых, вам нужно использовать Mapped Diagnostic Context (MDC ), чтобы установить свой идентификатор транзакции. Этот служебный класс позволяет установить контекстную информацию, связанную с выполненной операцией (вы можете установить любую информацию, которая поможет вам более четко проверять журналы).

В идеале ваш transansationID должен быть установлен в начале вашей операции (бизнес-метод) и удален в конце. После настройки идентификатор транзакции доступен для любого зарегистрированного события (даже если эти события регистрируются вызовами внутренних методов. Таким образом, вам не нужно передавать такую ​​информацию внутренним методам... регистратор сделает это за вас).

(Очень важно: MDC связывает контекст с потоком, который выполняет метод MDC.put()... так что, если ваш сервер приложений повторно использует потоки (большинство из них), и вы не очищаете контекст правильно, вы будете регистрировать события с устаревшими контекстами (предыдущие выполнения в том же потоке)... Кроме того, контекст будет локальным для одного потока, поэтому, если вы вызываете другой метод, который выполняется в другом потоке, такой контекст информация передаваться не будет!!!(В таком случае вам нужно будет передать такую ​​информацию другим способом).

Во-вторых, вы должны изменить конфигурацию вашего регистратора, чтобы включить эти параметры контекста в свой шаблон.... Пример:

%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p [%c] [%X{txID}] (%t) %m%n

Где %X извлекает параметры из MDC.

Надеюсь, эта помощь...

ОБНОВЛЕНИЕ: Пример использования...

public class MyBusinessClass {
    private static TxIDGenerator generator = new TxIDGenerator();
    ...
    public void myBusinessMethod() {
        String txID = generator.nextValue();
        MDC.put("txID", txID);
        try {
            businessStuffA();
            businessStuffB();
            ...
            //some business stuff
        } finally {
            MDC.remove("txID");
        }
    }
}
person Carlitos Way    schedule 15.07.2016
comment
Я видел MDC раньше, но не думал, что весь поток потока использует один и тот же контекст. Что касается повторного использования потоков сервером приложений, это возможно. Я видел те же имена потоков в журналах. Как я могу обрабатывать контекст в такой ситуации. Изменится ли значение, поскольку я сгенерировал другой идентификатор транзакции в начале бизнес-метода? - person daemon54; 20.07.2016
comment
@ daemon54 ... Да, txID всегда будет меняться, если такое значение установлено в начале бизнес-метода. Однако всегда рекомендуется удалять такое значение с помощью метода: MDC.remove() в конце бизнес-метода, внутри блока finally... см. мой пример выше... - person Carlitos Way; 20.07.2016
comment
Сладкий. Что помогает. Спасибо. - person daemon54; 20.07.2016