2014-02-07 3 views
1

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

public static void main(String[] args) { 
     Date date = new Date(); 
     SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd-HH:mm:ss"); 
     Handler h = new FileHandler("../logs/MyLogFile_" 
       + sdf.format(date) + ".log", true); 
     h.setFormatter(new SingleLineFormatter()); 
     h.setLevel(Level.ALL); 
     logger.setUseParentHandlers(false); 
     logger.addHandler(h); 
} 

public void go(XMLConfig config) throws Exception {  
    Controller.setGlobalErrorHandler(new ErrorHandler(logger)); 
} 

public class ErrorHandler implements FDSErrorHandler { 

    private static Logger logger = Logger.getLogger("com.explore.lse"); 

    public ErrorHandler(Logger logger) { 
     this.logger = logger; 
    } 
} 

ответ

7

нет, это определенно разве :-)

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

public class MyClass { 
    private final static Logger log = LoggerFactory.getLogger(MyClass.class); //or the equivalent for your logging framework 

    //rest of the code 
} 

вы можете контролировать, какие классы (== регистраторы) перейти в то, что файлы, используя конфигурацию протоколирования (обычно XML).

иногда (иногда «редко» и в основном используется фреймворками), вы должны использовать «имена тем» вместо имен классов при извлечения регистраторов. так, например:

public class SomeSecurityRelatedClass { 

    public void authenticateUser(String username, String pass) { 
     if (!passCorrect(...)) { 
     LoggerFactory.getLogger("SECURITY").info("rejecting user .... //etc 
     } 
    } 
} 

и в то время как им разглагольствований, еще одним распространенным злоупотреблением имен регистратора, когда люди хотят, чтобы каким-то образом «знак» конкретные процессы в параллельной среде (скажем, вы хотите, чтобы все протоколирование, связанные с тем же запросы пользователя для доступа к одному файлу для каждого пользователя). Не используйте для этого имена журналов. вместо этого ознакомьтесь с концепцией MDCs. они поддерживаются по меньшей мере log4j и slf4j/Logback и могут использоваться для «тегов» процессов или добавления любых других дополнительных данных, которые вы хотите использовать в своих журналах.

+0

+1 для _definitely isn't_. –

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