日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

日志库EasyLogging++学习系列(4)—— 格式说明符

發布時間:2025/3/12 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 日志库EasyLogging++学习系列(4)—— 格式说明符 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在上一篇文章中,主要記錄了如何使用 Easylogging++ 的配置功能,雖然已經用了很大的篇幅盡可能詳細地加以記錄,不過相信有些細心的小伙伴可能已經發現遺漏了些什么,請看下面兩句摘自 my_log.conf 配置文件的語句:

[cpp] view plaincopy print?
  • FORMAT??????????=???"[%level?|?%datetime]?|?%msg"????
  • FILENAME????????=???"log\\log_%datetime{%Y%M%d}.log"???
  • FORMAT = "[%level | %datetime] | %msg" FILENAME = "log\\log_%datetime{%Y%M%d}.log"

    對于等號右邊的值,比如 %level、%datetime{%Y%M%d} 這些特殊符號的意義和用法在上一文中并沒有提及,所以就在這里對此進行一個補充說明。而這些特殊的符號,就是?Easylogging++ 用于控制日志輸出的格式說明符。



    輸出格式說明符


    和C語言的格式化輸出一樣,Easylogging++ 也可以格式化輸出日志,下面的表格列舉了GitHub上給出的?Easylogging++ 支持的輸出格式說明符:


    SpecifierReplaced By
    %loggerLogger ID
    %threadThread ID - Uses std::thread if available, otherwise GetCurrentThreadId() on windows
    %levelSeverity level (Info, Debug, Error, Warning, Fatal, Verbose, Trace)
    %levshortSeverity level (Short version i.e, I for Info and respectively D, E, W, F, V, T)
    %vlevelVerbosity level (Applicable to verbose logging)
    %datetimeDate and/or time - Pattern is customizable - see Date/Time Format Specifiers below
    %userUser currently running application
    %hostComputer name application is running on
    %fileFile name of source file (Full path)
    %fbaseFile name of source file (Only base name)
    %lineSource line number
    %funcLogging function
    %locSource filename and line number of logging (separated by colon)
    %msgActual log message
    %Escape character (e.g, %%level will write %level)

    另外,Easylogging++ 還提供了讓我們自定義格式說明符的能力。下面的代碼演示了如何自定義 %ip_addr 這個格式說明符:

    [cpp] view plaincopy print?
  • #include?"easylogging++.h"??
  • ??
  • INITIALIZE_EASYLOGGINGPP??
  • ??
  • const?char*?getIp(void)???
  • {??
  • ????return?"192.168.1.1";??
  • }??
  • ??
  • int?main(void)???
  • {??
  • ????///?自定義格式說明符?%ip_addr??
  • ????el::Helpers::installCustomFormatSpecifier(el::CustomFormatSpecifier("%ip_addr",?getIp));??
  • ??
  • ????///?利用自定義格式說明符?%ip_addr?進行日志輸出??
  • ????el::Loggers::reconfigureAllLoggers(el::ConfigurationType::Format,?"%datetime?%level?%ip_addr?:?%msg");??
  • ????LOG(INFO)?<<?"This?is?request?from?client";??
  • ??
  • ????system("pause");??
  • ????return?0;??
  • }??
  • #include "easylogging++.h"INITIALIZE_EASYLOGGINGPPconst char* getIp(void) {return "192.168.1.1"; }int main(void) {/// 自定義格式說明符 %ip_addrel::Helpers::installCustomFormatSpecifier(el::CustomFormatSpecifier("%ip_addr", getIp));/// 利用自定義格式說明符 %ip_addr 進行日志輸出el::Loggers::reconfigureAllLoggers(el::ConfigurationType::Format, "%datetime %level %ip_addr : %msg");LOG(INFO) << "This is request from client";system("pause");return 0; }

    時間格式說明符


    在輸出格式說明符中有一個專門用于格式化輸出時間的說明符:%datetime ,而?Easylogging++ ?已經默認為?%datetime 設置了一個時間輸出格式。然而,我們可以利用時間格式說明符重新自定義時間的輸出格式,下面的表格列舉了GitHub上給出的?Easylogging++ ?支持的時間格式說明符:


    SpecifierReplaced By
    %dDay of month (zero-padded)
    %aDay of the week - short (Mon, Tue, Wed, Thu, Fri, Sat, Sun)
    %ADay of the week - long (Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday)
    %MMonth (zero-padded)
    %bMonth - short (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec)
    %BMonth - Long (January, February, March, April, May, June, July, August, September, October, November, December)
    %yYear - Two digit (13, 14 etc)
    %YYear - Four digit (2013, 2014 etc)
    %hHour (12-hour format)
    %HHour (24-hour format)
    %mMinute (zero-padded)
    %sSecond (zero-padded)
    %gMilliseconds (width is configured by ConfigurationType::MillisecondsWidth)
    %FAM/PM designation
    %Escape character
    需要注意的是,在?Easylogging++ 中,時間的輸出格式最大僅支持 30 個字符。



    注意事項


    在剛開始使用?Easylogging++ 作為我的日志庫的時候,我曾經寫過下面這樣一個配置文件:

    [plain] view plaincopy print?
  • *?GLOBAL:??
  • ????FORMAT??????????????????=???"[%level?|?%datetime]?|?%msg"??
  • ????ENABLED?????????????????=???true??
  • ????TO_FILE?????????????????=???true??
  • ????TO_STANDARD_OUTPUT??????=???true??
  • ????MILLISECONDS_WIDTH??????=???3??
  • ????PERFORMANCE_TRACKING????=???false??
  • ????MAX_LOG_FILE_SIZE???????=???2097152?##???
  • ????LOG_FLUSH_THRESHOLD?????=???0??
  • *?INFO:??
  • ????FILENAME????????????????=???"log\\server_%level_%datetime{%Y%M%d%H}.log"??
  • *?DEBUG:??
  • ????ENABLED?????????????????=???false??
  • *?WARNING:??
  • ????FILENAME????????????????=???"log\\server_%level_%datetime{%Y%M%d%H}.log"??
  • *?TRACE:??
  • ????FILENAME????????????????=???"log\\server_%level_%datetime{%Y%M%d%H}.log"??
  • *?VERBOSE:??
  • ????ENABLED?????????????????=???false??
  • *?ERROR:??
  • ????FILENAME????????????????=???"log\\server_%level_%datetime{%Y%M%d%H}.log"??
  • *?FATAL:??
  • ????ENABLED?????????????????=???false??
  • * GLOBAL:FORMAT = "[%level | %datetime] | %msg"ENABLED = trueTO_FILE = trueTO_STANDARD_OUTPUT = trueMILLISECONDS_WIDTH = 3PERFORMANCE_TRACKING = falseMAX_LOG_FILE_SIZE = 2097152 ## LOG_FLUSH_THRESHOLD = 0 * INFO:FILENAME = "log\\server_%level_%datetime{%Y%M%d%H}.log" * DEBUG:ENABLED = false * WARNING:FILENAME = "log\\server_%level_%datetime{%Y%M%d%H}.log" * TRACE:FILENAME = "log\\server_%level_%datetime{%Y%M%d%H}.log" * VERBOSE:ENABLED = false * ERROR:FILENAME = "log\\server_%level_%datetime{%Y%M%d%H}.log" * FATAL:ENABLED = false配置文件的意思很簡單,就是我想讓不同級別的日志保存在不同的文件中而已,但是事實上,如果使用上面的這個配置文件,那么在 log 日志文件夾下就只會生成一個名稱為?server_%level_2015102715.log 的日志文件,并且所有級別的日志都只會保存在這個日志文件中。


    從上面給出的反例中可以看出,對于輸出格式說明符,只適用于配置項 FORMAT;而時間格式說明符,不僅適用于配置項 FORMAT,同樣還適用于配置項 FILENAME。這一點,通過查看?Easylogging++ 的源碼也可以得到證實。當然,如果我們想要讓配置項 FILENAME 也能夠使用輸出格式說明符,可以通過修改源碼去實現。建議有興趣的小伙伴參考一下函數 updateFormatSpec() ,然后在函數?resolveFilename() 中修改即可。

    總結

    以上是生活随笔為你收集整理的日志库EasyLogging++学习系列(4)—— 格式说明符的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。