2015-09-07 3 views
0

Существует класс A и класс B. Они оба используют класс C с помощью композиции. Класс A и класс B необходимо генерировать самостоятельно в разных файлах, например: class A генерирует журнал в файл «log_A.log» и класс B - в «log_B.log».Как записать общий класс, используемый двумя классами

Мой вопрос: как написать журнал класса С, относящийся к классу, который вызывает метод класса С? Я имею в виду: если метод класса C был вызван из класса A, журнал класса C должен быть сгенерирован для файла журнала для класса A - «log_A.log». Если метод класса C вызывается из класса B, журнал класса C должен быть сгенерирован для файла «log_B.log». И одна вещь еще - уровень протоколирования для класса C должна быть такой же, как для лесопогрузчика класса А или В.

Например, класс A:

//loggerA - it's logger that writes to file "log_A.log" 
private static final Logger log = Logger.getLogger("loggerA"); 
public void method(){ 
    log.debug("Write to log of class A"); 
    C c = new C(); 
    c.method(); //activity in class C should be written to "log_A.log" as well 
} 

В классе B:

private static final Logger log = Logger.getLogger("loggerB"); 
public void method(){ 
    log.debug("Write to log of class B"); 
    C c = new C(); 
    c.method(); //activity in class C should be written to "log_B.log" as well 
} 

В классе C:

private static final Logger log = Logger.getLogger(???); 
public void method(){ 

    log.debug("Any log message"); 

} 

PS Я использую LOG4J 1.2.16

Я могу попробовать сделать следующее: В классе C:

public void method(String logger){ 
    final Logger log = Logger.getLogger(logger); //Use the logger of calling class 
    log.debug("Any log message"); 

} 

Но я думаю, что это грязное решение

ответ

2

Создать конструктор класса С, который принимает регистратор, как параметр. Сейчас пока инстанцировании C в любом другом классе, пройти регистратор этого класса для C. Что-то вроде -

class C { 
    public C(Logger log) { 
     this.log = log; 
    } 
} 

, а затем в А или В, используйте его как -

C c = new C(this.log); 
c.method(); 
+0

Вы можете удалить статический keywork от регистратора C. Это не имеет смысла, поскольку нам нужен разный регистратор для каждого экземпляра. Infact, сохраняя его статичным, создаст проблемы, поскольку регистратор другого экземпляра будет изменен. –

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