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? 
    }

}

2 ответа

Решение

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

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

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

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

Другие вопросы по тегам