<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Log4Qt 輸出重定向(控制臺(tái))

          共 5917字,需瀏覽 12分鐘

           ·

          2021-10-13 10:43

          星標(biāo)/置頂 公眾號(hào)??硬核文章第一時(shí)間送達(dá)!


          1

          繼承關(guān)系


          Log4Qt 支持自定義輸出,格式化由 Layout 完成,輸出地則由 Appender 控制。Appender 表示將日志輸出到什么地方,常見的 Appender 有控制臺(tái)、文件、數(shù)據(jù)庫等。


          Log4Qt::Appender 繼承關(guān)系圖:



          在該層次結(jié)構(gòu)中,頂級(jí)類是 Appender,它是 Log4Qt API 中所有其他輸出地的基類。


          • AppenderSkeleton:實(shí)現(xiàn)一般 Appender 的功能

            通常來講,自定義輸出需要繼承 AppenderSkeleton,并實(shí)現(xiàn)其中的幾個(gè)方法。

          • TelnetAppender:將日志事件附加到只讀套接字(telnet)

          • SignalAppender:在附加日志事件的同時(shí),會(huì)發(fā)射一個(gè) appended(const QString &) 信號(hào)。

          • DatabaseAppender:將日志事件附加到數(shù)據(jù)庫

          • WriterAppender:將日志事件附加到 QTextStream

            • DailyFileAppender:每天創(chuàng)建一個(gè)日志文件

            • RollingFileAppender:在達(dá)到特定大小時(shí)滾動(dòng)日志文件

            • DailyRollingFileAppender:以指定的頻率滾動(dòng)日志文件

            • ConsoleAppender:將日志事件附加到 stdoutstderr

            • FileAppender:將日志事件附加到文件


          注意:除了這些之外,還有其他的一些 Appender,這里就不再列出了。



          2

          Logger-to-Appender 協(xié)作


          目前為止,我們已經(jīng)了解了 Logger 對(duì)象如何封裝日志信息,以及不同的 Appender 對(duì)象如何將日志信息打印到不同的目的地。但是 Logger 對(duì)象是如何將日志信息傳遞給 Appender 對(duì)象的呢?創(chuàng)建一個(gè)名為 LoggingEvent 的中間鏈接對(duì)象可以實(shí)現(xiàn)這一點(diǎn)。


          1. LoggingEvent 類封裝了所有相關(guān)的日志信息,例如:Logger 實(shí)例、日志消息、日志級(jí)別、時(shí)間戳等。

          2. 在將日志請(qǐng)求移交給任何關(guān)聯(lián)的 Appender 之前,Logger 會(huì)使用與日志記錄相關(guān)的信息創(chuàng)建 LoggingEvent 對(duì)象的實(shí)例。

          3. 然后,Logger 對(duì)象調(diào)用 Appender 對(duì)象的 doAppend(LoggingEvent event) 方法。

          4. doAppend() 方法對(duì)日志請(qǐng)求執(zhí)行一些關(guān)鍵的檢查,例如:將請(qǐng)求的日志級(jí)別與 Logger 相關(guān)聯(lián)的任何 Appender 的閾值級(jí)別進(jìn)行比較,檢查 Appender 是否打開,并使用 Appender 檢查任何關(guān)聯(lián)的 Filter 對(duì)象。

          5. 如果找到 Filter 對(duì)象,它將調(diào)用該 Filter 對(duì)象以進(jìn)一步?jīng)Q定日志記錄請(qǐng)求。一旦批準(zhǔn),相關(guān)子類 Appender 對(duì)象的 append() 方法將接管并發(fā)布日志記錄信息。



          3

          ConsoleAppender


          ConsoleAppender 是一個(gè)非常簡單的類,用于將日志信息輸出到 stdoutstderr,可以通過名為 target 的屬性來配置日志消息的目的地。該類擴(kuò)展了 WriterAppender,任何打算將日志信息打印到控制臺(tái)的應(yīng)用程序都應(yīng)該使用它。



          可配置屬性


          下表描述了 ConsoleAppender 的可配置屬性以及對(duì)應(yīng)的方法:


          屬性方法描述
          immediateFlushsetImmediateFlush(bool)默認(rèn)情況下,該標(biāo)志被設(shè)置為 true,這將導(dǎo)致控制臺(tái)流在每個(gè)日志輸出請(qǐng)求中被刷新。
          thresholdsetThreshold(Level)Appender 使用的閾值級(jí)別,任何低于閾值的日志請(qǐng)求都將被忽略。
          targetsetTarget(const QString &)輸出目標(biāo),默認(rèn)是 STDOUT_TARGET。


          其中,targer 的枚舉及字符串(不區(qū)分大小寫)表示:


          enum Target
          {
              /*! The output target is standard out. */
              STDOUT_TARGET,
              /*! The output target is standard error. */
              STDERR_TARGET
          };
          Q_ENUM(Target)


          注意:threshold 是由 AppenderSkeleton 提供的,而 immediateFlush 則來自于 WriterAppender。



          4

          以編程方式配置


          在項(xiàng)目開發(fā)階段,往往需要在控制臺(tái)中輸出日志的內(nèi)容,這對(duì)于調(diào)試代碼來說非常方便。這時(shí),便可以很好的利用 ConsoleAppender



          和前面一樣,輸出一個(gè)簡單的信息:


          #include <QCoreApplication>
          #include <QTextCodec>
          #include <log4qt/logger.h>
          #include <log4qt/ttcclayout.h>
          #include <log4qt/consoleappender.h>
          #include <log4qt/loggerrepository.h>

          int main(int argc, char *argv[])
          {
              QCoreApplication a(argc, argv);

              // 創(chuàng)建一個(gè) TTCCLayout(輸出時(shí)間、線程、Logger 以及消息內(nèi)容)
              Log4Qt::Logger *logger = Log4Qt::Logger::rootLogger();
              Log4Qt::TTCCLayout *layout = new Log4Qt::TTCCLayout();
              layout->setName("My Layout");
              layout->activateOptions();

              // 創(chuàng)建一個(gè) ConsoleAppender(將日志內(nèi)容輸出到控制臺(tái)上)
              Log4Qt::ConsoleAppender *appender = new Log4Qt::ConsoleAppender();
              appender->setName("My Appender");
              appender->setLayout(layout);
              appender->setEncoding(QTextCodec::codecForName("UTF-8"));  // 設(shè)置編碼
              appender->setTarget(Log4Qt::ConsoleAppender::STDOUT_TARGET);  // 輸出到 stdout
              appender->setImmediateFlush(true);  // 立即刷新
              appender->setThreshold(Log4Qt::Level::INFO_INT);  // 設(shè)置閾值級(jí)別為 INFO
              appender->activateOptions();

              // 在 logger 上添加 appender
              logger->addAppender(appender);

              // 設(shè)置級(jí)別為 DEBUG
              logger->setLevel(Log4Qt::Level::DEBUG_INT);

              // 輸出信息
              logger->debug("Hello, Log4Qt!");
              logger->info("Hello, Qt!");

              // 關(guān)閉 logger
              logger->removeAllAppenders();
              logger->loggerRepository()->shutdown();

              return a.exec();
          }


          這里,我們將 ConsoleAppender 的閾值級(jí)別設(shè)置為 INFO,當(dāng)打印信息時(shí),只有 level >= INFO 的信息才會(huì)被輸出。所以,最終的輸出是“Hello, Qt!”,而沒有輸出“Hello, Log4Qt!”。



          5

          使用配置文件


          現(xiàn)在,編寫一個(gè)配置文件 - log4qt.properties,執(zhí)行與上例中相同的任務(wù):


          # 定義 rootLogger
          log4j.rootLogger=DEBUG, console

          # 定義 ConsoleAppender
          log4j.appender.console=org.apache.log4j.ConsoleAppender
          log4j.appender.console.target=STDOUT_TARGET
          log4j.appender.console.immediateFlush=true
          log4j.appender.console.threshold=INFO

          # 為 ConsoleAppender 定義 Layout
          log4j.appender.console.layout=org.apache.log4j.TTCCLayout

          然后,使用下面的程序:

          #include <QCoreApplication>
          #include <log4qt/logger.h>
          #include <log4qt/loggerrepository.h>

          int main(int argc, char *argv[])
          {
              QCoreApplication a(argc, argv);

              // 獲取 rootLogger
              Log4Qt::Logger* logger = Log4Qt::Logger::rootLogger();

              // 打印消息
              logger->debug("Hello, Log4Qt!");
              logger->info("Hello, Qt!");

              // 關(guān)閉 rootLogger
              logger->removeAllAppenders();
              logger->loggerRepository()->shutdown();

              return a.exec();
          }

          運(yùn)行程序,結(jié)果和上面的效果相同(效果圖不再展示,請(qǐng)自行嘗試)。



          往期推薦




          專輯 | 趣味設(shè)計(jì)模式
          專輯 | 音視頻開發(fā)
          專輯 | C++ 進(jìn)階
          專輯 | 超硬核 Qt
          專輯 | 玩轉(zhuǎn) Linux
          專輯 | GitHub 開源推薦
          專輯 | 程序人生


          關(guān)注公眾號(hào)「高效程序員」??,一起優(yōu)秀!

          回復(fù) “入群” 進(jìn)技術(shù)交流群,回復(fù) “1024” 獲取海量學(xué)習(xí)資源。
          瀏覽 36
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  色香蕉视频 | 激情文学视频一区 | 在线观看a网站 | 久久色无码视频 | 亚洲视频在线观看网站 |