log4j, вложенные диагностические контексты

У меня есть объект MySession (общий сеанс, а не сеть), который работает в своем потоке. Я хочу использовать класс NDC, чтобы включить некоторые данные, взятые из полей моего MySession: пользователь, который его создал, время начала и т. д. и т. д. Я хотел бы «отобразить» поля в сообщении. Это возможно или поддерживается только для сообщений? заранее спасибо

public class MySession {
    String userName;
    Date startTime;

    public void doSomething() {
        NDC.push(this);                                    //cannot do something like this?
        NDC.push(this.userName 
                  + " " + startTime.toString());          //or should I do this? 
    }

}

person AgostinoX    schedule 25.05.2011    source источник


Ответы (2)


NDC просто добавляет «контекст» (строку произвольной формы) ко всем сообщениям журнала (которые могут выводиться или не выводиться в зависимости от формата журнала). Вложенная часть означает, что NDC.pop() возвращается к предыдущему (следующему уровню вверх) контексту.

Тем не менее, в любой момент контекст представляет собой одну строку произвольной формы, поэтому вы правы, что вам нужно нажать что-то вроде this.username + '.' + this.startTime.toString(), как во втором примере. Из API видно, что push принимает строковый аргумент; этот контекст используется только с точки зрения того, что он является частью сообщения журнала (неявно String), поэтому не будет никакой пользы в принятии произвольных объектов другого типа.

person Andrzej Doyle    schedule 25.05.2011

Вы можете поместить практически любой текст (или текстовое представление любого объекта) в NDC. Рендеринг объектов в NDC не поддерживается, так как toString() почти всегда достаточно (или, по крайней мере, должно быть). Слишком много и/или сложный материал в NDC затруднит чтение журналов, поэтому рекомендуется ограничить содержимое NDC до необходимого минимума.

Например. в вашем случае указание времени начала сеанса в каждом сообщении журнала было бы излишним (и потенциально двусмысленным). Было бы лучше отправить только какой-то уникальный идентификатор сеанса в NDC (если у вас есть такая вещь, то есть) и зарегистрировать любые другие детали сеанса, такие как имя пользователя, время запуска в специальном сообщении (сообщениях) сразу после установки НДЦ. Это по-прежнему позволяет вам извлекать все необходимые данные сеанса из ваших журналов и идентифицировать соответствующий сеанс для любого конкретного сообщения журнала.

person Péter Török    schedule 25.05.2011
comment
хорошо, но если это так просто, разве это не клон, простое красивое имя для идентификатора потока, который уже предоставлен без NDC? - person AgostinoX; 25.05.2011
comment
@AgostinoX, нет, он гораздо более универсален и может использоваться так, как идентификатор потока не может. Например. в веб-приложении он может содержать идентификатор сеанса, где сеанс часто охватывает несколько запросов (и, следовательно, обрабатывается несколькими отдельными потоками). - person Péter Török; 25.05.2011