2011-04-13 49 views
1

以下類使用JInternalFrame來存放顯示所有重定向的println和err語句的Textarea。在java中將log4j語句重定向到自定義控制檯

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語句。我應該在代碼中將記錄器語句重定向到textarea中進行哪些修改?

+2

您使用哪種日誌框架?內置的Java一個? Log4J的? – 2011-04-13 07:32:53

+0

我正在使用log4j。 – 2011-04-13 08:55:46

+0

有沒有你創建兩個流而不是一個的原因? – 2011-04-13 17:26:17

回答

5

你應該實現一個自定義的Log4J記錄器。有很多有用的基類可以擴展。我會推薦使用org.apache.log4j.WriterAppender

2

在替換它們之前,Log4J記錄器可能會獲取對System.out和System.err的引用。所以你可以實現一個自定義的Appender,或者嘗試擊敗Log4J。如果你有啓動控制權,後者可能是可能的。

+0

Sinec log4j通常會在應用程序啓動的早期階段進行配置,我不認爲這是可行的。只有在Log4J中配置了ConsoleAppender時,它纔會起作用。但是由於提問者也想重定向他的標準流,所以他可能會在應用程序啓動前執行此操作。所以+1 – Daniel 2011-04-13 11:15:22

+0

@丹尼爾一般我同意,但在這種情況下,它是一個UI應用程序,所以我想@VeeKay有這些選項。 – 2011-04-13 17:25:10

相關問題