Перенаправление инструкций log4j на пользовательскую консоль в java

#java #logging #log4j

#java #ведение журнала #log4j

Вопрос:

Следующий класс использует JInternalFrame, содержащий текстовую область, которая отображает все перенаправленные инструкции println и err.

 public class ConsoleFrame extends JInternalFrame
{
  JTextArea outArea = new JTextArea(10,100);
  static JInternalFrame cons;
  public ConsoleFrame() 
  {
    outArea.setLineWrap(true);
    JScrollPane pain = new JScrollPane(outArea);
    //pain.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
    this.add(pain);
    this.setVisible(true);
    this.setSize(1000,400); 
    this.setTitle("Groovy Console");
    this.closable = false;
    this.maximizable = false;
    this.isSelected = true;
    this.resizable = false;
    BasicInternalFrameUI ui = (BasicInternalFrameUI)this.getUI();
    Component north = ui.getNorthPane();
    MouseMotionListener[] actions =
    (MouseMotionListener[])north.getListeners(MouseMotionListener.class);

    for (int i = 0; i < actions.length; i  )
    north.removeMouseMotionListener( actions[i] );

    this.setFocusable(false);    
 //logger
    System.setErr(new PrintStream(new JTextAreaOutputStream(outArea)));
    System.setOut(new PrintStream(new JTextAreaOutputStream(outArea)));

    setConsole(this);
  }


  static public JInternalFrame getConsole(){
      return cons;
  }
  public void setConsole(JInternalFrame console){
      cons = console;
  }
  public class JTextAreaOutputStream extends OutputStream {
    JTextArea ta;

    public JTextAreaOutputStream(JTextArea t) {
      super();
      ta = t;
    }

    public void write(int i) {
      ta.append(Character.toString((char)i));
    }

    public void write(char[] buf, int off, int len) {
      String s = new String(buf, off, len);
      ta.append(s);
    }

  }

}
  

Этот класс перенаправляет только инструкции sysout и syserr. Какие изменения я должен внести в код, чтобы перенаправить инструкции logger в текстовую область?

Комментарии:

1. Какую платформу ведения журнала вы используете? Встроенный в Java? Log4J?

2. Если вы используете log4j, загляните в приложение консоли.

3. есть ли причина, по которой вы создаете два потока вместо одного?

4. Проверьте этот блог TextAreaAppender , надеюсь, это поможет

Ответ №1:

Вам следует реализовать пользовательский регистратор Log4J. Существуют очень полезные базовые классы для расширения. Я бы рекомендовал использовать org.apache.log4j.WriterAppender .

Ответ №2:

Вероятно, регистратор Log4J получает ссылки на System.out и System.err перед их заменой. Таким образом, вы можете либо реализовать пользовательское приложение, либо попытаться превзойти Log4J. Последнее может быть возможно, если у вас есть контроль над запуском.

Комментарии:

1. Поскольку log4j обычно настраивается очень рано при запуске приложения, я не думаю, что это возможно. И это будет работать, только если в Log4J настроено ConsoleAppender. Но поскольку запрашивающий также хочет перенаправить свои стандартные потоки, он мог бы также сделать это перед запуском приложения. Итак 1

2. @Daniel в целом я согласен, но в данном случае это приложение с пользовательским интерфейсом, поэтому я подумал, что у @VeeKay есть эти опции.