2011-05-16 2 views
3

У меня есть приложение, которое должно регистрировать два разных типа сообщений: сообщения журнала приложений и сообщения аудита. Сообщения журнала приложений соответствуют стандарту lo4j Logger, но для журнала аудита имеется несколько обязательных параметров.Оберните log4j или создайте собственный регистратор?

Я думаю, мне нужно обернуть log4j, чтобы добавить дополнительные требуемые параметры в методы debug(), info() и т. Д., Но я ненавижу идею обертывания log4j. Должен ли я:

  1. Оберните log4j полностью и укажите мой собственный класс Logger, который вызывает log4j logger за сценой?
  2. Расширить класс log4j Logger и добавить методы «журнала аудита» с моими требуемыми параметрами?
  3. ли что-то еще более элегантным, так что я не оборачивать библиотека протоколирования ...

ответ

4

«сообщение» в error, warn и т.д. методы в log4j Logger произвольный объект; он не должен быть строкой. Вы можете создать свой собственный класс сообщений, чтобы содержать различные параметры. Регистраторы могут добавлять данные по-разному, используя собственный класс Layout для добавления регистратора аудита.

+0

Это отличная идея, но я не вижу способа обеспечить, чтобы разработчики предоставляли необходимые параметры для записей журнала аудита. – Brian

+0

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

+0

Да, если только наши регистрации были только «лучшей практикой» и не требовались в определенных обстоятельствах по требованиям наших клиентов. Я думаю, что я застрял в обертке log4j, чтобы добавить необходимые параметры. – Brian

4

Я думаю, что вы можете использовать log4j для журналов приложений создания журналов, как:

private final static Logger log = new Logger(MyClass.class); 

И для журнала аудита создать определенную категорию:

private final static Logger log = new Logger("AuditTrail"); 

Имея различный Appender вы можете поделиться accross несколько классов позволят вам настроить конечный результат вывода и формат, как вы когда-либо хотите в файле конфигурации.

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

0

Может быть, вы можете прочитать api NDC/MDC log4j. Надеюсь, что это может вам помочь.

1

Это будет работать: До сих пор это лучшее решение, я получил ...

(кредит hellojava в LOG4J: Modify logged message using custom appender)

Создание пользовательского Log4j макета, такие как этот:

import java.util.HashMap; 
import java.util.Map; 

import org.apache.log4j.Level; 
import org.apache.log4j.PatternLayout; 
import org.apache.log4j.spi.LoggingEvent; 

public class AuditLayout extends PatternLayout { 
    // Audit Summary Map: 
    // <Level, Counter> 

    private static Map<Level, Integer> auditMap = new HashMap<Level, Integer>(); 

    public static Map<Level, Integer> getAuditMap() { 
     return auditMap; 
    } 

    public static void setAuditMap(Map<Level, Integer> auditMap) { 
     AuditLayout.auditMap = auditMap; 
    } 

    @Override 
    public String format(LoggingEvent event) { 

     if (event.getMessage() != null && event.getMessage() instanceof String) { 
      // Check the message level and update the audit object accordingly: 
      if (!auditMap.containsKey(event.getLevel())) { 
       auditMap.put(event.getLevel(), 1); 
      } else { 
       int i = auditMap.get(event.getLevel());  
       i++; 
       auditMap.put(event.getLevel(), i); 
      } 
     } 
     return super.format(event); 
    } 
} 

Это очень простой макет, который проверяет уровень журнала и содержит сводку на Карте; т.е. DEBUG> 2, INFO> 10 и т.д.

Установите новый макет в файле log4j.properties (используйте один из ваших appenders):

# CONSOLE: 
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender 
log4j.appender.CONSOLE.Threshold=DEBUG 
# BEFORE::: log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout 
# AFTER::: 
log4j.appender.CONSOLE.layout=com.ca.utils.AuditLayout 
log4j.appender.CONSOLE.layout.ConversionPattern=%d{MM/dd/yyyy HH:mm:ss} %-5p %c line: %L - %m%n 

Теперь использовать свой auditMap в макете от вашего Основной класс, основанный на объекте Logger:

private static AuditLayout auditLayout = null; 
... 
if (log.getRootLogger().getAppender("CONSOLE").getLayout() instanceof AuditLayout) 
    auditLayout = (AuditLayout) log.getRootLogger().getAppender("CONSOLE").getLayout(); 
... 
System.out.println("auditLayout: " + auditLayout.getAuditMap().toString()); 

Надеюсь, это поможет!

Смежные вопросы