перенаправление log4j на настольное приложение в разгаре - PullRequest
3 голосов
/ 10 сентября 2010

У меня есть приложение с графическим интерфейсом на качелях, реализованное в NetBeans.Для различной функциональности, предоставляемой вводом пользователя, используется jar, который использует log4j для ведения журнала.Все в порядке, но я должен перенаправить информацию из log4j в текстовую область в моем графическом интерфейсе.Я обнаружил, что для перенаправления из log4j в текстовую область колебания необходимо расширить AppenderSkeleton.Моя проблема в том, что я не могу изменить графический интерфейс (например, чтобы иметь JTextArea, который расширяет AppenderSkeleton), поэтому у меня должен быть такой класс, который добавляется к моей JTextarea.Теперь мое приложение инициализирует до log4j.Моя проблема в том, что я не могу найти способ установить в качестве свойства пользовательский класс AppenderSkeleton, ссылку на jtextarea моего графического интерфейса, так что, когда log4j инициализирует appender, он будет передавать ссылку на текстовую область приложения.Я попытался в файле конфигурации log4J что-то вроде: log4j.appender.myAppender.theTextArea = path.to.myFrameclass.theTextArea, чтобы log4j вызывал установщик в моем приложении и метод получения из моего фрейма для установки текстовой области, но этоне работа.Как я могу сделать инициализацию appender log4j, перенаправить информацию в мое приложение?Или у моего приложения есть способ инициализировать пользовательский appender и уведомить log4j об использовании его для регистрации?Спасибо!

Ответы [ 2 ]

4 голосов
/ 11 сентября 2010

Самый простой вариант - программно добавить ваш аппендер после инициализации вашего графического интерфейса. Примерно так:

Logger.getRootLogger().addAppender(yourTextAreaAppender);

РЕДАКТИРОВАТЬ: Чтобы войти только уровень INFO, выполните следующие действия:

yourTextAreaAppender.addFilter(new Filter() {
    @Override
    public int decide(LoggingEvent event) {
        if (event.getLevel().equals(Level.INFO)) {
            return ACCEPT;
        } else {
            return DENY;
        }
    }
});
1 голос
/ 01 сентября 2011

Ну, это может быть довольно просто,

  1. Укажите свойство в файле log4j.property, в моем случае это:

    log4j.rootLogger=S
    log4j.appender.S=com.ibm.nzna.projects.qit.gui.StatusMessageAppender
    log4j.appender.S.layout=org.apache.log4j.PatternLayout
    log4j.appender.S.layout.ConversionPattern=%m
    
  2. Запись нового класса со следующим кодом:

    import org.apache.log4j.AppenderSkeleton;
    import org.apache.log4j.Level;
    import org.apache.log4j.spi.LoggingEvent;
    
    /**
     * @author Ashish Tyagi
     *
     */
    public class StatusMessageAppender extends AppenderSkeleton {
        private StatusBar statusBar = AppDefaultWin.getStatusBar();
        protected void append(LoggingEvent event) {
            if(event.getLevel().equals(Level.INFO)){
                    //here set the text of your swing component;
                   //in my case it is: statusBar.st_STATUS.setText(event.getMessage().toString());
            }
        }
    
        public void close() {
    
        }
        public boolean requiresLayout() {
            return false;
        }
    
    }
    
...