<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                這幾天在為自己寫的一個網絡爬蟲加一個UI控制界面,之前的爬蟲核心是以命令行啟動的,所以日志信息由log4j直接輸出的控制臺,可是現在有了UI,就不能再將日志信息輸出到控制臺了,必須將日志信息以某種方式截取,輸出到界面上。 在網上找了一下相關代碼,確實不少,但經過實踐檢驗之后,發現要么是代碼太多太麻煩,要么是性能太差(爬蟲運行時每秒鐘產生日志信息超過百行很隨意),大都不適用。無奈,只好自己絞盡腦汁,才勉強做出來一個能用的。現在把代碼貼出來,供學習交流,歡迎拍磚! 廢話不多說,看代碼: Java代碼 /* * To change this template, choose Tools | Templates * and open the template in the editor. */ package cn.ysh.studio.gui.log; import java.io.IOException; import java.io.PipedReader; import java.io.PipedWriter; import java.io.Writer; import org.apache.log4j.Logger; import org.apache.log4j.Appender; import org.apache.log4j.WriterAppender; /** * * 類描述: * 重置log4j的Appender的Writer * @author 楊勝寒 * @date 2011-12-20 創建 * @version 1.0 */ publicabstractclass LogAppender extends Thread { protected PipedReader reader; public LogAppender(String appenderName) throws IOException { Logger root = Logger.getRootLogger(); // 獲取子記錄器的輸出源 Appender appender = root.getAppender(appenderName); // 定義一個未連接的輸入流管道 reader = new PipedReader(); // 定義一個已連接的輸出流管理,并連接到reader Writer writer = new PipedWriter(reader); // 設置 appender 輸出流 ((WriterAppender) appender).setWriter(writer); } } 這個類是一個基類,實際上是不能夠直接使用的,由它的子類負責將來自控制臺的日志信息輸出到UI組件。 比如現在需要將日志信息截獲,輸出到一個JLabel組件,代碼如下: Java代碼 /* * To change this template, choose Tools | Templates * and open the template in the editor. */ package cn.ysh.studio.gui.log; import java.io.IOException; import java.util.Scanner; import javax.swing.JLabel; /** * * 類描述: * 不間斷地掃描輸入流 * 將掃描到的字符流顯示在JLabel上 * @author 楊勝寒 * @date 2011-12-20 創建 * @version 1.0 */ publicclass LabelLogAppender extends LogAppender { private JLabel label; /** * 默認的構造 * @param label 記錄器名稱,該記錄器輸出的日志信息將被截取并輸出到指定的JLabel組件 * @throws IOException */ public LabelLogAppender(JLabel label) throws IOException { super("label"); this.label = label; } @Override publicvoid run() { // 不間斷地掃描輸入流 Scanner scanner = new Scanner(reader); // 將掃描到的字符流顯示在指定的JLabel上 while (scanner.hasNextLine()) { try { //睡眠 Thread.sleep(100); String line = scanner.nextLine(); label.setText(line); line = null; } catch (Exception ex) { //異常信息不作處理 } } } } 實際上,將日志信息輸出到JTextArea或其他多行文本組件更加常見,比如MyEclipse或NetBeans等IDE。那么一下面的代碼就展示了如何將日志截獲并輸出到JTextArea組件,同時自動使垂直滾動條跟隨。請看到代碼: Java代碼 /* * To change this template, choose Tools | Templates * and open the template in the editor. */ package cn.ysh.studio.gui.log; import java.io.IOException; import java.util.Scanner; import javax.swing.JScrollPane; import javax.swing.JTextArea; /** * * 類描述: * 不間斷地掃描輸入流 * 將掃描到的字符流顯示在JTextArea上 * @author 楊勝寒 * @date 2011-12-20 創建 * @version 1.0 */ publicclass TextAreaLogAppender extends LogAppender { private JTextArea textArea; private JScrollPane scroll; /** * 默認的構造 * @param textArea 記錄器名稱,該記錄器輸出的日志信息將被截取并輸出到指定的JTextArea組件 * @param scroll JTextArea組件使用的滾動面板,因為在JTextArea中輸出日志時,默認會使垂直滾動條自動向下滾動,若不需要此功能,此參數可省略 * @throws IOException */ public TextAreaLogAppender(JTextArea textArea, JScrollPane scroll) throws IOException { super("textArea"); this.textArea = textArea; this.scroll = scroll; } @Override publicvoid run() { // 不間斷地掃描輸入流 Scanner scanner = new Scanner(reader); // 將掃描到的字符流輸出到指定的JTextArea組件 while (scanner.hasNextLine()) { try { //睡眠 Thread.sleep(100); String line = scanner.nextLine(); textArea.append(line); textArea.append("\n"); line = null; //使垂直滾動條自動向下滾動 scroll.getVerticalScrollBar().setValue(scroll.getVerticalScrollBar().getMaximum()); } catch (Exception ex) { //異常不做處理 } } } } 按照上述方式封轉之后,他們的使用就非常簡單了。在窗體組件繪制完成后,就可以啟動他們了: Java代碼 /* * To change this template, choose Tools | Templates * and open the template in the editor. */ package cn.ysh.studio.gui.test; import cn.ysh.studio.gui.log.LabelLogAppender; import cn.ysh.studio.gui.log.TextAreaLogAppender; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JScrollPane; import javax.swing.JTextArea; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; /** * * 類描述: * 測試日志輸出到UI組件 * @author 楊勝寒 * @date 2011-12-24 創建 * @version 1.0 */ publicclass LogDemoJFrame extends JFrame { private JLabel logLabel; private JScrollPane logScrollPane; private JTextArea logTextArea; privatefinalstatic Log log = LogFactory.getLog(LogDemoJFrame.class); public LogDemoJFrame() { logLabel = new javax.swing.JLabel(); logScrollPane = new javax.swing.JScrollPane(); logTextArea = new javax.swing.JTextArea(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); logLabel.setText(" "); logTextArea.setColumns(20); logTextArea.setRows(5); logScrollPane.setViewportView(logTextArea); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(layout.createSequentialGroup().addContainerGap().addComponent(logLabel, javax.swing.GroupLayout.DEFAULT_SIZE, 610, Short.MAX_VALUE).addContainerGap()).addComponent(logScrollPane, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 630, Short.MAX_VALUE)); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(layout.createSequentialGroup().addContainerGap().addComponent(logLabel).addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED).addComponent(logScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 305, Short.MAX_VALUE))); pack(); } publicvoid initLog() { try { Thread t1, t2; t1 = new LabelLogAppender(logLabel); t2 = new TextAreaLogAppender(logTextArea, logScrollPane); t1.start(); t2.start(); } catch (Exception e) { JOptionPane.showMessageDialog(this, e, "綁定日志輸出組件錯誤", JOptionPane.ERROR_MESSAGE); } } publicstaticvoid main(String[] s) { LogDemoJFrame logDemoFrame = new LogDemoJFrame(); logDemoFrame.initLog(); logDemoFrame.setVisible(true); for (int i = 0; i < 1000; i++) { log.info("測試日志輸出:" + i); } } } 很簡單的一個Demo,僅供參考。 下面是我的Log4j日志配置信息: Java代碼 log4j.appender.label=org.apache.log4j.ConsoleAppender log4j.appender.label.layout=org.apache.log4j.PatternLayout log4j.appender.label.layout.ConversionPattern=%m%n log4j.appender.textArea=org.apache.log4j.ConsoleAppender log4j.appender.textArea.layout=org.apache.log4j.PatternLayout log4j.appender.textArea.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [ %p ] %m%n log4j.rootLogger=INFO,label,textArea 其實鑒于上述方法,還可以實現更多自定義log4j日志輸出功能,在此不再贅述。 原創文章,轉載請注明出處: http://www.yshjava.cn/post/322.html
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看