[{"data":1,"prerenderedAt":1976},["ShallowReactive",2],{"content-zh-TW-api":3},{"doc":4,"debug":1907},{"id":5,"title":6,"body":7,"description":1900,"extension":1901,"meta":1902,"navigation":84,"path":1903,"seo":1904,"stem":1905,"__hash__":1906},"content\u002Fzh-TW\u002Fapi.md","API 參考",{"type":8,"value":9,"toc":1861},"minimark",[10,14,43,46,55,62,92,97,108,190,217,222,247,250,296,304,314,344,350,358,367,381,389,398,405,407,415,422,449,453,462,477,508,512,519,671,681,789,798,958,962,977,1024,1028,1036,1078,1080,1087,1140,1157,1159,1167,1178,1211,1215,1304,1475,1477,1484,1492,1524,1528,1534,1550,1554,1636,1665,1667,1671,1701,1708,1710,1717,1737,1795,1801,1803,1807,1857],[11,12,6],"h1",{"id":13},"api-參考",[15,16,17,36],"blockquote",{},[18,19,20,21,31,32,35],"p",{},"內容來源以 ",[22,23,27],"a",{"href":24,"rel":25},"https:\u002F\u002Fgithub.com\u002Fozakboy\u002FOzaLog\u002Fblob\u002Fmain\u002FOzaLog\u002FOzaLog\u002FLOG.cs",[26],"nofollow",[28,29,30],"code",{},"OzaLog\u002FOzaLog\u002FLOG.cs"," 為準,自動生成的 XML doc 隨 NuGet 套件以 ",[28,33,34],{},"file.xml"," 形式發佈。",[18,37,38,39,42],{},"所有公開型別都在 ",[28,40,41],{},"OzaLog"," 命名空間。",[44,45],"hr",{},[47,48,50,51,54],"h2",{"id":49},"_1-log-靜態類別","1. ",[28,52,53],{},"LOG"," 靜態類別",[18,56,57,58,61],{},"所有日誌寫入的唯一入口。不必實例化、不必 ",[28,59,60],{},"LoggerFactory","、不必依賴注入。",[63,64,69],"pre",{"className":65,"code":66,"language":67,"meta":68,"style":68},"language-csharp shiki shiki-themes github-light","using OzaLog;\n\nLOG.Info_Log(\"Hello, OzaLog!\");\n","csharp","",[28,70,71,79,86],{"__ignoreMap":68},[72,73,76],"span",{"class":74,"line":75},"line",1,[72,77,78],{},"using OzaLog;\n",[72,80,82],{"class":74,"line":81},2,[72,83,85],{"emptyLinePlaceholder":84},true,"\n",[72,87,89],{"class":74,"line":88},3,[72,90,91],{},"LOG.Info_Log(\"Hello, OzaLog!\");\n",[93,94,96],"h3",{"id":95},"_11-各-loglevel-寫入方法","1.1 各 LogLevel 寫入方法",[18,98,99,100,103,104,107],{},"每個 ",[28,101,102],{},"LogLevel","(Trace \u002F Debug \u002F Info \u002F Warn \u002F Error \u002F Fatal)各提供 5 個多載。命名慣例:",[28,105,106],{},"\u003CLevel>_Log","。",[63,109,111],{"className":65,"code":110,"language":67,"meta":68,"style":68},"\u002F\u002F 純訊息\nLOG.Info_Log(string message);\n\n\u002F\u002F 控制是否寫檔(true=寫檔,false=只在 EnableConsoleOutput=true 時走主控台)\nLOG.Info_Log(string message, bool writeTxt);\n\n\u002F\u002F 含 {0}\u002F{1}\u002F... placeholder 的格式化訊息\nLOG.Info_Log(string message, string[] args, bool writeTxt = true, bool immediateFlush = false);\n\n\u002F\u002F 物件 — 自動序列化為 JSON\nLOG.Info_Log\u003CT>(T obj, bool writeTxt = true, bool immediateFlush = false) where T : class;\n\n\u002F\u002F 物件 + 標頭訊息\nLOG.Info_Log\u003CT>(string message, T obj, bool writeTxt = true, bool immediateFlush = false) where T : class;\n",[28,112,113,118,123,127,133,139,144,150,156,161,167,173,178,184],{"__ignoreMap":68},[72,114,115],{"class":74,"line":75},[72,116,117],{},"\u002F\u002F 純訊息\n",[72,119,120],{"class":74,"line":81},[72,121,122],{},"LOG.Info_Log(string message);\n",[72,124,125],{"class":74,"line":88},[72,126,85],{"emptyLinePlaceholder":84},[72,128,130],{"class":74,"line":129},4,[72,131,132],{},"\u002F\u002F 控制是否寫檔(true=寫檔,false=只在 EnableConsoleOutput=true 時走主控台)\n",[72,134,136],{"class":74,"line":135},5,[72,137,138],{},"LOG.Info_Log(string message, bool writeTxt);\n",[72,140,142],{"class":74,"line":141},6,[72,143,85],{"emptyLinePlaceholder":84},[72,145,147],{"class":74,"line":146},7,[72,148,149],{},"\u002F\u002F 含 {0}\u002F{1}\u002F... placeholder 的格式化訊息\n",[72,151,153],{"class":74,"line":152},8,[72,154,155],{},"LOG.Info_Log(string message, string[] args, bool writeTxt = true, bool immediateFlush = false);\n",[72,157,159],{"class":74,"line":158},9,[72,160,85],{"emptyLinePlaceholder":84},[72,162,164],{"class":74,"line":163},10,[72,165,166],{},"\u002F\u002F 物件 — 自動序列化為 JSON\n",[72,168,170],{"class":74,"line":169},11,[72,171,172],{},"LOG.Info_Log\u003CT>(T obj, bool writeTxt = true, bool immediateFlush = false) where T : class;\n",[72,174,176],{"class":74,"line":175},12,[72,177,85],{"emptyLinePlaceholder":84},[72,179,181],{"class":74,"line":180},13,[72,182,183],{},"\u002F\u002F 物件 + 標頭訊息\n",[72,185,187],{"class":74,"line":186},14,[72,188,189],{},"LOG.Info_Log\u003CT>(string message, T obj, bool writeTxt = true, bool immediateFlush = false) where T : class;\n",[18,191,192],{},[193,194,195,196,199,200,203,204,203,207,203,210,203,213,216],"strong",{},"把 ",[28,197,198],{},"Info"," 換成 ",[28,201,202],{},"Trace","、",[28,205,206],{},"Debug",[28,208,209],{},"Warn",[28,211,212],{},"Error",[28,214,215],{},"Fatal"," 即得對應級別方法。",[218,219,221],"h4",{"id":220},"自動立即-flush","自動立即 flush",[18,223,224,227,228,231,232,235,236,239,240,242,243,246],{},[28,225,226],{},"Error_Log"," 與 ",[28,229,230],{},"Fatal_Log"," ",[193,233,234],{},"永遠","會觸發同步 immediate flush,不管使用者傳入的 ",[28,237,238],{},"immediateFlush"," 參數。這是確保程式 crash 前 log 已落盤的關鍵機制。其他級別則尊重 ",[28,241,238],{}," 參數(預設 ",[28,244,245],{},"false",")。",[218,248,249],{"id":249},"物件多載的行為",[251,252,253,280],"ul",{},[254,255,256,257,260,261,264,265,268,269,203,272,275,276,279],"li",{},"當 ",[28,258,259],{},"obj is Exception"," 且 ",[28,262,263],{},"level >= Warn"," 時,物件透過 ",[28,266,267],{},"ExceptionHandler.CreateSerializableException(...)"," 展開,遞迴包含 ",[28,270,271],{},"InnerException",[28,273,274],{},"Data"," 字典、",[28,277,278],{},"StackTrace","、與反射出的非標準屬性。",[254,281,282,283,286,287,203,290,203,293,107],{},"其他情況直接用 ",[28,284,285],{},"System.Text.Json"," 序列化:",[28,288,289],{},"WriteIndented=false",[28,291,292],{},"DefaultIgnoreCondition=WhenWritingNull",[28,294,295],{},"Encoder=UnsafeRelaxedJsonEscaping",[93,297,299,300,303],{"id":298},"_12-customname_log-自訂檔名分桶","1.2 ",[28,301,302],{},"CustomName_Log"," — 自訂檔名分桶",[18,305,306,307,203,310,313],{},"把 log 路由到自訂檔名,而非級別預設檔。對交易場景特別有用(",[28,308,309],{},"BTC_Log.txt",[28,311,312],{},"ETH_Log.txt"," 各自一檔)。",[63,315,317],{"className":65,"code":316,"language":67,"meta":68,"style":68},"LOG.CustomName_Log(string name, string message);\nLOG.CustomName_Log(string name, string message, bool writeTxt);\nLOG.CustomName_Log(string name, string message, string[] args, bool writeTxt = true, bool immediateFlush = false);\nLOG.CustomName_Log\u003CT>(string name, T obj, bool writeTxt = true, bool immediateFlush = false) where T : class;\nLOG.CustomName_Log\u003CT>(string name, string message, T obj, bool writeTxt = true, bool immediateFlush = false) where T : class;\n",[28,318,319,324,329,334,339],{"__ignoreMap":68},[72,320,321],{"class":74,"line":75},[72,322,323],{},"LOG.CustomName_Log(string name, string message);\n",[72,325,326],{"class":74,"line":81},[72,327,328],{},"LOG.CustomName_Log(string name, string message, bool writeTxt);\n",[72,330,331],{"class":74,"line":88},[72,332,333],{},"LOG.CustomName_Log(string name, string message, string[] args, bool writeTxt = true, bool immediateFlush = false);\n",[72,335,336],{"class":74,"line":129},[72,337,338],{},"LOG.CustomName_Log\u003CT>(string name, T obj, bool writeTxt = true, bool immediateFlush = false) where T : class;\n",[72,340,341],{"class":74,"line":135},[72,342,343],{},"LOG.CustomName_Log\u003CT>(string name, string message, T obj, bool writeTxt = true, bool immediateFlush = false) where T : class;\n",[18,345,346,347],{},"→ 檔案路徑:",[28,348,349],{},"{baseDir}\u002F{LogPath}\u002F{yyyyMMdd}\u002F{CustomPath}\u002F{name}_Log.{ext}",[93,351,353,354,357],{"id":352},"_13-logconfigure-一次性配置","1.3 ",[28,355,356],{},"LOG.Configure(...)"," — 一次性配置",[63,359,361],{"className":65,"code":360,"language":67,"meta":68,"style":68},"public static void Configure(Action\u003CLogConfiguration.LogOptions> configure);\n",[28,362,363],{"__ignoreMap":68},[72,364,365],{"class":74,"line":75},[72,366,360],{},[18,368,369,372,373,376,377,380],{},[193,370,371],{},"不可重入","。第二次呼叫拋 ",[28,374,375],{},"InvalidOperationException(\"OzaLog 已初始化（Configure 不可重入）\")","。若從未呼叫 ",[28,378,379],{},"Configure",",首次寫 log 會自動以預設值初始化。",[93,382,384,385,388],{"id":383},"_14-loggetcurrentoptions-唯讀配置視圖","1.4 ",[28,386,387],{},"LOG.GetCurrentOptions()"," — 唯讀配置視圖",[63,390,392],{"className":65,"code":391,"language":67,"meta":68,"style":68},"public static LogConfiguration.ILogOptions GetCurrentOptions();\n",[28,393,394],{"__ignoreMap":68},[72,395,396],{"class":74,"line":75},[72,397,391],{},[18,399,400,401,404],{},"回傳一個包裝目前 ",[28,402,403],{},"LogOptions"," 的唯讀介面。用於診斷與驗證執行中設定。",[44,406],{},[47,408,410,411,414],{"id":409},"_2-logquote-報價-pipeline-v31","2. ",[28,412,413],{},"LOG.Quote(...)"," — 報價 pipeline (v3.1+)",[18,416,417,418,421],{},"報價 pipeline 是",[193,419,420],{},"獨立","的非同步寫入管道,專為高頻 tick\u002Fquote 資料設計,與主 logger 完全分離。欄位命名對齊 Binance REST API 24hr Ticker schema。",[15,423,424,430,439],{},[18,425,426,429],{},[193,427,428],{},"前置條件",":必須在配置階段啟用 pipeline:",[63,431,433],{"className":65,"code":432,"language":67,"meta":68,"style":68},"LOG.Configure(o => o.ConfigureQuote(q => q.Enable = true));\n",[28,434,435],{"__ignoreMap":68},[72,436,437],{"class":74,"line":75},[72,438,432],{},[18,440,441,442,445,446,448],{},"若沒有設 ",[28,443,444],{},"Enable = true",",所有 ",[28,447,413],{}," 呼叫都靜默 no-op(也不會啟動背景執行緒)。",[93,450,452],{"id":451},"_21-a2-核心-api-struct-多載","2.1 A2 核心 API — struct 多載",[63,454,456],{"className":65,"code":455,"language":67,"meta":68,"style":68},"public static void Quote(in QuoteRecord record);\n",[28,457,458],{"__ignoreMap":68},[72,459,460],{"class":74,"line":75},[72,461,455],{},[18,463,464,465,468,469,472,473,476],{},"零配置入隊。在呼叫端",[193,466,467],{},"同步","驗證 ",[28,470,471],{},"record",",以下情況拋 ",[28,474,475],{},"ArgumentException",":",[251,478,479,489,498],{},[254,480,481,484,485,488],{},[28,482,483],{},"Symbol"," 或 ",[28,486,487],{},"Bucket"," 為 null 或空字串",[254,490,491,227,494,497],{},[28,492,493],{},"Extras",[28,495,496],{},"ExtrasJson"," 同時設定",[254,499,500,502,503,507],{},[28,501,493],{}," 含有撞名內建欄位的 key(見 ",[22,504,506],{"href":505},"#24-extras-%E7%9A%84%E4%BF%9D%E7%95%99-key","§2.4",")",[93,509,511],{"id":510},"_22-a1-便利多載","2.2 A1 便利多載",[18,513,514,515,518],{},"內部建構 ",[28,516,517],{},"QuoteRecord"," 後委派給 struct 多載。",[63,520,522],{"className":65,"code":521,"language":67,"meta":68,"style":68},"\u002F\u002F 最簡 tick — 只填 last\nLOG.Quote(string symbol, string bucket, long ticks, decimal last);\n\n\u002F\u002F 含 bid\u002Fask\nLOG.Quote(string symbol, string bucket, long ticks,\n          decimal last, decimal bid, decimal ask);\n\n\u002F\u002F 含 bid\u002Fask + 買賣量\nLOG.Quote(string symbol, string bucket, long ticks,\n          decimal last,\n          decimal bid, decimal bidQty,\n          decimal ask, decimal askQty);\n\n\u002F\u002F 完整 ticker — 對齊 Binance REST API \u002Fapi\u002Fv3\u002Fticker\u002F24hr\nLOG.QuoteTicker(string symbol, string bucket, long ticks,\n                decimal last,\n                decimal? lastQty = null,\n                decimal? bid = null, decimal? bidQty = null,\n                decimal? ask = null, decimal? askQty = null,\n                decimal? open = null, decimal? prevClose = null,\n                decimal? high = null, decimal? low = null,\n                decimal? volume = null, decimal? quoteVolume = null);\n\n\u002F\u002F 完整 ticker + Extras 字典\nLOG.QuoteTicker(string symbol, string bucket, long ticks,\n                decimal last,\n                IReadOnlyDictionary\u003Cstring, object> extras,\n                \u002F* 其餘選填欄位同上 *\u002F);\n",[28,523,524,529,534,538,543,548,553,557,562,566,571,576,581,585,590,596,602,608,614,620,626,632,638,643,649,654,659,665],{"__ignoreMap":68},[72,525,526],{"class":74,"line":75},[72,527,528],{},"\u002F\u002F 最簡 tick — 只填 last\n",[72,530,531],{"class":74,"line":81},[72,532,533],{},"LOG.Quote(string symbol, string bucket, long ticks, decimal last);\n",[72,535,536],{"class":74,"line":88},[72,537,85],{"emptyLinePlaceholder":84},[72,539,540],{"class":74,"line":129},[72,541,542],{},"\u002F\u002F 含 bid\u002Fask\n",[72,544,545],{"class":74,"line":135},[72,546,547],{},"LOG.Quote(string symbol, string bucket, long ticks,\n",[72,549,550],{"class":74,"line":141},[72,551,552],{},"          decimal last, decimal bid, decimal ask);\n",[72,554,555],{"class":74,"line":146},[72,556,85],{"emptyLinePlaceholder":84},[72,558,559],{"class":74,"line":152},[72,560,561],{},"\u002F\u002F 含 bid\u002Fask + 買賣量\n",[72,563,564],{"class":74,"line":158},[72,565,547],{},[72,567,568],{"class":74,"line":163},[72,569,570],{},"          decimal last,\n",[72,572,573],{"class":74,"line":169},[72,574,575],{},"          decimal bid, decimal bidQty,\n",[72,577,578],{"class":74,"line":175},[72,579,580],{},"          decimal ask, decimal askQty);\n",[72,582,583],{"class":74,"line":180},[72,584,85],{"emptyLinePlaceholder":84},[72,586,587],{"class":74,"line":186},[72,588,589],{},"\u002F\u002F 完整 ticker — 對齊 Binance REST API \u002Fapi\u002Fv3\u002Fticker\u002F24hr\n",[72,591,593],{"class":74,"line":592},15,[72,594,595],{},"LOG.QuoteTicker(string symbol, string bucket, long ticks,\n",[72,597,599],{"class":74,"line":598},16,[72,600,601],{},"                decimal last,\n",[72,603,605],{"class":74,"line":604},17,[72,606,607],{},"                decimal? lastQty = null,\n",[72,609,611],{"class":74,"line":610},18,[72,612,613],{},"                decimal? bid = null, decimal? bidQty = null,\n",[72,615,617],{"class":74,"line":616},19,[72,618,619],{},"                decimal? ask = null, decimal? askQty = null,\n",[72,621,623],{"class":74,"line":622},20,[72,624,625],{},"                decimal? open = null, decimal? prevClose = null,\n",[72,627,629],{"class":74,"line":628},21,[72,630,631],{},"                decimal? high = null, decimal? low = null,\n",[72,633,635],{"class":74,"line":634},22,[72,636,637],{},"                decimal? volume = null, decimal? quoteVolume = null);\n",[72,639,641],{"class":74,"line":640},23,[72,642,85],{"emptyLinePlaceholder":84},[72,644,646],{"class":74,"line":645},24,[72,647,648],{},"\u002F\u002F 完整 ticker + Extras 字典\n",[72,650,652],{"class":74,"line":651},25,[72,653,595],{},[72,655,657],{"class":74,"line":656},26,[72,658,601],{},[72,660,662],{"class":74,"line":661},27,[72,663,664],{},"                IReadOnlyDictionary\u003Cstring, object> extras,\n",[72,666,668],{"class":74,"line":667},28,[72,669,670],{},"                \u002F* 其餘選填欄位同上 *\u002F);\n",[93,672,674,675,677,678,507],{"id":673},"_23-quoterecord公開-readonly-struct","2.3 ",[28,676,517],{},"(公開 ",[28,679,680],{},"readonly struct",[63,682,684],{"className":65,"code":683,"language":67,"meta":68,"style":68},"public readonly struct QuoteRecord\n{\n    \u002F\u002F 必填\n    public readonly string Symbol;     \u002F\u002F 例如 \"BTCUSDT\"\n    public readonly string Bucket;     \u002F\u002F 例如 \"binance_spot\"\n    public readonly long   Ticks;      \u002F\u002F 事件時間,caller 傳入\n    public readonly decimal Last;      \u002F\u002F 最後成交價\n\n    \u002F\u002F 選填(全部 decimal?)\n    public readonly decimal? LastQty;       \u002F\u002F 最後一筆成交數量\n    public readonly decimal? Bid, BidQty;   \u002F\u002F 最佳買價 + 量\n    public readonly decimal? Ask, AskQty;   \u002F\u002F 最佳賣價 + 量\n    public readonly decimal? Open, PrevClose;\n    public readonly decimal? High, Low;\n    public readonly decimal? Volume;        \u002F\u002F 累積基礎資產成交量\n    public readonly decimal? QuoteVolume;   \u002F\u002F 累積計價資產成交量\n\n    \u002F\u002F 自訂欄位 — 二擇一,同時設定拋例外\n    public readonly IReadOnlyDictionary\u003Cstring, object>? Extras;\n    public readonly string? ExtrasJson;     \u002F\u002F 預序列化的 JSON 物件字串\n}\n",[28,685,686,691,696,701,706,711,716,721,725,730,735,740,745,750,755,760,765,769,774,779,784],{"__ignoreMap":68},[72,687,688],{"class":74,"line":75},[72,689,690],{},"public readonly struct QuoteRecord\n",[72,692,693],{"class":74,"line":81},[72,694,695],{},"{\n",[72,697,698],{"class":74,"line":88},[72,699,700],{},"    \u002F\u002F 必填\n",[72,702,703],{"class":74,"line":129},[72,704,705],{},"    public readonly string Symbol;     \u002F\u002F 例如 \"BTCUSDT\"\n",[72,707,708],{"class":74,"line":135},[72,709,710],{},"    public readonly string Bucket;     \u002F\u002F 例如 \"binance_spot\"\n",[72,712,713],{"class":74,"line":141},[72,714,715],{},"    public readonly long   Ticks;      \u002F\u002F 事件時間,caller 傳入\n",[72,717,718],{"class":74,"line":146},[72,719,720],{},"    public readonly decimal Last;      \u002F\u002F 最後成交價\n",[72,722,723],{"class":74,"line":152},[72,724,85],{"emptyLinePlaceholder":84},[72,726,727],{"class":74,"line":158},[72,728,729],{},"    \u002F\u002F 選填(全部 decimal?)\n",[72,731,732],{"class":74,"line":163},[72,733,734],{},"    public readonly decimal? LastQty;       \u002F\u002F 最後一筆成交數量\n",[72,736,737],{"class":74,"line":169},[72,738,739],{},"    public readonly decimal? Bid, BidQty;   \u002F\u002F 最佳買價 + 量\n",[72,741,742],{"class":74,"line":175},[72,743,744],{},"    public readonly decimal? Ask, AskQty;   \u002F\u002F 最佳賣價 + 量\n",[72,746,747],{"class":74,"line":180},[72,748,749],{},"    public readonly decimal? Open, PrevClose;\n",[72,751,752],{"class":74,"line":186},[72,753,754],{},"    public readonly decimal? High, Low;\n",[72,756,757],{"class":74,"line":592},[72,758,759],{},"    public readonly decimal? Volume;        \u002F\u002F 累積基礎資產成交量\n",[72,761,762],{"class":74,"line":598},[72,763,764],{},"    public readonly decimal? QuoteVolume;   \u002F\u002F 累積計價資產成交量\n",[72,766,767],{"class":74,"line":604},[72,768,85],{"emptyLinePlaceholder":84},[72,770,771],{"class":74,"line":610},[72,772,773],{},"    \u002F\u002F 自訂欄位 — 二擇一,同時設定拋例外\n",[72,775,776],{"class":74,"line":616},[72,777,778],{},"    public readonly IReadOnlyDictionary\u003Cstring, object>? Extras;\n",[72,780,781],{"class":74,"line":622},[72,782,783],{},"    public readonly string? ExtrasJson;     \u002F\u002F 預序列化的 JSON 物件字串\n",[72,785,786],{"class":74,"line":628},[72,787,788],{},"}\n",[18,790,791,476],{},[193,792,793,794,797],{},"欄位對照 Binance ",[28,795,796],{},"\u002Fapi\u002Fv3\u002Fticker\u002F24hr"," 回應",[799,800,801,818],"table",{},[802,803,804],"thead",{},[805,806,807,812,815],"tr",{},[808,809,810],"th",{},[28,811,517],{},[808,813,814],{},"Binance JSON",[808,816,817],{},"說明",[819,820,821,837,852,874,895,928,943],"tbody",{},[805,822,823,829,834],{},[824,825,826],"td",{},[28,827,828],{},"Last",[824,830,831],{},[28,832,833],{},"lastPrice",[824,835,836],{},"必填",[805,838,839,844,849],{},[824,840,841],{},[28,842,843],{},"LastQty",[824,845,846],{},[28,847,848],{},"lastQty",[824,850,851],{},"最後一筆成交數量",[805,853,854,863,871],{},[824,855,856,859,860],{},[28,857,858],{},"Bid"," \u002F ",[28,861,862],{},"BidQty",[824,864,865,859,868],{},[28,866,867],{},"bidPrice",[28,869,870],{},"bidQty",[824,872,873],{},"最佳買單",[805,875,876,884,892],{},[824,877,878,859,881],{},[28,879,880],{},"Ask",[28,882,883],{},"AskQty",[824,885,886,859,889],{},[28,887,888],{},"askPrice",[28,890,891],{},"askQty",[824,893,894],{},"最佳賣單",[805,896,897,911,925],{},[824,898,899,859,902,859,905,859,908],{},[28,900,901],{},"Open",[28,903,904],{},"PrevClose",[28,906,907],{},"High",[28,909,910],{},"Low",[824,912,913,859,916,859,919,859,922],{},[28,914,915],{},"openPrice",[28,917,918],{},"prevClosePrice",[28,920,921],{},"highPrice",[28,923,924],{},"lowPrice",[824,926,927],{},"區間統計",[805,929,930,935,940],{},[824,931,932],{},[28,933,934],{},"Volume",[824,936,937],{},[28,938,939],{},"volume",[824,941,942],{},"24h 基礎資產量",[805,944,945,950,955],{},[824,946,947],{},[28,948,949],{},"QuoteVolume",[824,951,952],{},[28,953,954],{},"quoteVolume",[824,956,957],{},"24h 計價資產量",[93,959,961],{"id":960},"_24-extras-的保留-key","2.4 Extras 的保留 key",[18,963,964,965,967,968,970,971,973,974,976],{},"下列 key 是 schema 內建的保留欄位。放在 ",[28,966,493],{},"(Dictionary)會在呼叫端",[193,969,467],{},"拋 ",[28,972,475],{},";放在 ",[28,975,496],{},"(字串)則在 dispatcher 端拋(記錄到主控台,該筆記錄被丟棄)。",[15,978,979],{},[18,980,981,203,984,203,987,203,990,203,993,203,995,203,998,203,1000,203,1003,203,1005,203,1008,203,1011,203,1014,203,1017,203,1019,203,1021],{},[28,982,983],{},"ts",[28,985,986],{},"symbol",[28,988,989],{},"bucket",[28,991,992],{},"last",[28,994,848],{},[28,996,997],{},"bid",[28,999,870],{},[28,1001,1002],{},"ask",[28,1004,891],{},[28,1006,1007],{},"open",[28,1009,1010],{},"prevClose",[28,1012,1013],{},"high",[28,1015,1016],{},"low",[28,1018,939],{},[28,1020,954],{},[28,1022,1023],{},"extras",[93,1025,1027],{"id":1026},"_25-檔名規則","2.5 檔名規則",[63,1029,1034],{"className":1030,"code":1032,"language":1033},[1031],"language-text","{baseDir}\u002F{LogPath}\u002F{yyyyMMdd}\u002F{QuotePath}\u002F{Bucket}_{Symbol}_Quote.{ext}\n","text",[28,1035,1032],{"__ignoreMap":68},[251,1037,1038,1046,1067],{},[254,1039,1040,476,1043,1045],{},[193,1041,1042],{},"不分子目錄",[28,1044,487],{}," 變成檔名前綴,不會建立子資料夾。",[254,1047,1048,476,1051,859,1053,1055,1056,507,1059,1062,1063,1066],{},[193,1049,1050],{},"自動 sanitize",[28,1052,483],{},[28,1054,487],{}," 中的檔系統非法字元(",[28,1057,1058],{},"\u002F \\ : * ? \" \u003C > |",[193,1060,1061],{},"僅在檔名中","會被替換為 ",[28,1064,1065],{},"-","。原始字串仍會出現在檔案內容裡。",[254,1068,1069,1070,1073,1074,1077],{},"換日、LRU 淘汰、size-based 檔案分割(",[28,1071,1072],{},"_part2_Quote.{ext}"," 等)行為跟主 logger 一致,但走獨立的 ",[28,1075,1076],{},"QuoteFileStreamPool",",互不影響。",[44,1079],{},[47,1081,1083,1084,1086],{"id":1082},"_3-loglevel-enum","3. ",[28,1085,102],{}," enum",[63,1088,1090],{"className":65,"code":1089,"language":67,"meta":68,"style":68},"public enum LogLevel\n{\n    Trace      = 0,\n    Debug      = 1,\n    Info       = 2,\n    Warn       = 3,\n    Error      = 4,\n    Fatal      = 5,\n    CustomName = 99,   \u002F\u002F LOG.CustomName_Log(...) 內部使用\n}\n",[28,1091,1092,1097,1101,1106,1111,1116,1121,1126,1131,1136],{"__ignoreMap":68},[72,1093,1094],{"class":74,"line":75},[72,1095,1096],{},"public enum LogLevel\n",[72,1098,1099],{"class":74,"line":81},[72,1100,695],{},[72,1102,1103],{"class":74,"line":88},[72,1104,1105],{},"    Trace      = 0,\n",[72,1107,1108],{"class":74,"line":129},[72,1109,1110],{},"    Debug      = 1,\n",[72,1112,1113],{"class":74,"line":135},[72,1114,1115],{},"    Info       = 2,\n",[72,1117,1118],{"class":74,"line":141},[72,1119,1120],{},"    Warn       = 3,\n",[72,1122,1123],{"class":74,"line":146},[72,1124,1125],{},"    Error      = 4,\n",[72,1127,1128],{"class":74,"line":152},[72,1129,1130],{},"    Fatal      = 5,\n",[72,1132,1133],{"class":74,"line":158},[72,1134,1135],{},"    CustomName = 99,   \u002F\u002F LOG.CustomName_Log(...) 內部使用\n",[72,1137,1138],{"class":74,"line":163},[72,1139,788],{},[15,1141,1142],{},[18,1143,1144,1145,1148,1149,1152,1153,1156],{},"v3.0 把舊的 ",[28,1146,1147],{},"CostomName"," 改名為 ",[28,1150,1151],{},"CustomName","(拼字修正,屬於 breaking change)。",[28,1154,1155],{},"LOG.CustomName_Log(...)"," 方法名稱原本就拼對。",[44,1158],{},[47,1160,1162,1163,1166],{"id":1161},"_4-logoutputformat-enum-v31","4. ",[28,1164,1165],{},"LogOutputFormat"," enum (v3.1+)",[18,1168,1169,1170,1173,1174,1177],{},"決定",[193,1171,1172],{},"主 logger"," 的輸出格式。透過 ",[28,1175,1176],{},"LogOptions.OutputFormat"," 設定。",[63,1179,1181],{"className":65,"code":1180,"language":67,"meta":68,"style":68},"public enum LogOutputFormat\n{\n    Txt  = 0,   \u002F\u002F 純文字,副檔名 .txt(預設)\n    Log  = 1,   \u002F\u002F 內容同 Txt,副檔名 .log\n    Json = 2,   \u002F\u002F NDJSON(每行一個 JSON 物件),副檔名 .json\n}\n",[28,1182,1183,1188,1192,1197,1202,1207],{"__ignoreMap":68},[72,1184,1185],{"class":74,"line":75},[72,1186,1187],{},"public enum LogOutputFormat\n",[72,1189,1190],{"class":74,"line":81},[72,1191,695],{},[72,1193,1194],{"class":74,"line":88},[72,1195,1196],{},"    Txt  = 0,   \u002F\u002F 純文字,副檔名 .txt(預設)\n",[72,1198,1199],{"class":74,"line":129},[72,1200,1201],{},"    Log  = 1,   \u002F\u002F 內容同 Txt,副檔名 .log\n",[72,1203,1204],{"class":74,"line":135},[72,1205,1206],{},"    Json = 2,   \u002F\u002F NDJSON(每行一個 JSON 物件),副檔名 .json\n",[72,1208,1209],{"class":74,"line":141},[72,1210,788],{},[93,1212,1214],{"id":1213},"_41-json-格式-schemandjson","4.1 Json 格式 schema(NDJSON)",[63,1216,1220],{"className":1217,"code":1218,"language":1219,"meta":68,"style":68},"language-json shiki shiki-themes github-light","{\"ts\":1715587425123,\"lv\":\"Info\",\"nm\":\"\",\"tid\":12,\"tn\":\"MainThread\",\"msg\":\"hello\",\"data\":{...}}\n","json",[28,1221,1222],{"__ignoreMap":68},[72,1223,1224,1228,1232,1234,1237,1240,1243,1245,1249,1251,1254,1256,1259,1261,1264,1266,1269,1271,1274,1276,1279,1281,1284,1286,1289,1291,1294,1297,1301],{"class":74,"line":75},[72,1225,1227],{"class":1226},"sgsFI","{",[72,1229,1231],{"class":1230},"sYu0t","\"ts\"",[72,1233,476],{"class":1226},[72,1235,1236],{"class":1230},"1715587425123",[72,1238,1239],{"class":1226},",",[72,1241,1242],{"class":1230},"\"lv\"",[72,1244,476],{"class":1226},[72,1246,1248],{"class":1247},"sYBdl","\"Info\"",[72,1250,1239],{"class":1226},[72,1252,1253],{"class":1230},"\"nm\"",[72,1255,476],{"class":1226},[72,1257,1258],{"class":1247},"\"\"",[72,1260,1239],{"class":1226},[72,1262,1263],{"class":1230},"\"tid\"",[72,1265,476],{"class":1226},[72,1267,1268],{"class":1230},"12",[72,1270,1239],{"class":1226},[72,1272,1273],{"class":1230},"\"tn\"",[72,1275,476],{"class":1226},[72,1277,1278],{"class":1247},"\"MainThread\"",[72,1280,1239],{"class":1226},[72,1282,1283],{"class":1230},"\"msg\"",[72,1285,476],{"class":1226},[72,1287,1288],{"class":1247},"\"hello\"",[72,1290,1239],{"class":1226},[72,1292,1293],{"class":1230},"\"data\"",[72,1295,1296],{"class":1226},":{",[72,1298,1300],{"class":1299},"sB1qb","...",[72,1302,1303],{"class":1226},"}}\n",[799,1305,1306,1322],{},[802,1307,1308],{},[805,1309,1310,1313,1316,1319],{},[808,1311,1312],{},"欄位",[808,1314,1315],{},"型別",[808,1317,1318],{},"是否一定存在",[808,1320,1321],{},"含義",[819,1323,1324,1342,1378,1394,1419,1443,1459],{},[805,1325,1326,1330,1336,1339],{},[824,1327,1328],{},[28,1329,983],{},[824,1331,1332,1335],{},[28,1333,1334],{},"long","(epoch_ms)",[824,1337,1338],{},"是",[824,1340,1341],{},"事件時間戳,Unix epoch 後的毫秒數",[805,1343,1344,1349,1354,1356],{},[824,1345,1346],{},[28,1347,1348],{},"lv",[824,1350,1351],{},[28,1352,1353],{},"string",[824,1355,1338],{},[824,1357,1358,859,1361,859,1364,859,1366,859,1369,859,1372,859,1375],{},[28,1359,1360],{},"\"Trace\"",[28,1362,1363],{},"\"Debug\"",[28,1365,1248],{},[28,1367,1368],{},"\"Warn\"",[28,1370,1371],{},"\"Error\"",[28,1373,1374],{},"\"Fatal\"",[28,1376,1377],{},"\"CustomName\"",[805,1379,1380,1385,1389,1391],{},[824,1381,1382],{},[28,1383,1384],{},"nm",[824,1386,1387],{},[28,1388,1353],{},[824,1390,1338],{},[824,1392,1393],{},"log 名稱(CustomName 的值;級別 log 則為空字串)",[805,1395,1396,1401,1406,1413],{},[824,1397,1398],{},[28,1399,1400],{},"tid",[824,1402,1403],{},[28,1404,1405],{},"int",[824,1407,1408,1409,1412],{},"僅當 ",[28,1410,1411],{},"ShowThreadId=true"," 時",[824,1414,1415,1416],{},"呼叫端執行緒的 ",[28,1417,1418],{},"ManagedThreadId",[805,1420,1421,1426,1430,1438],{},[824,1422,1423],{},[28,1424,1425],{},"tn",[824,1427,1428],{},[28,1429,1353],{},[824,1431,1408,1432,260,1435,1412],{},[28,1433,1434],{},"ShowThreadName=true",[28,1436,1437],{},"Thread.Name != null",[824,1439,1415,1440],{},[28,1441,1442],{},"Thread.Name",[805,1444,1445,1450,1454,1456],{},[824,1446,1447],{},[28,1448,1449],{},"msg",[824,1451,1452],{},[28,1453,1353],{},[824,1455,1338],{},[824,1457,1458],{},"訊息文字(即使為空字串也會輸出)",[805,1460,1461,1466,1469,1472],{},[824,1462,1463],{},[28,1464,1465],{},"data",[824,1467,1468],{},"object",[824,1470,1471],{},"僅當存在時",[824,1473,1474],{},"物件多載的 payload 解析後的 JSON(Exception 或任意物件)",[44,1476],{},[47,1478,1480,1481,1166],{"id":1479},"_5-quoteoutputformat-enum-v31","5. ",[28,1482,1483],{},"QuoteOutputFormat",[18,1485,1169,1486,1173,1489,1177],{},[193,1487,1488],{},"報價 pipeline",[28,1490,1491],{},"LogOptions.QuoteOptions.OutputFormat",[63,1493,1495],{"className":65,"code":1494,"language":67,"meta":68,"style":68},"public enum QuoteOutputFormat\n{\n    Txt  = 0,   \u002F\u002F 人類可讀 key=value,副檔名 .txt(預設)\n    Log  = 1,   \u002F\u002F 內容同 Txt,副檔名 .log\n    Json = 2,   \u002F\u002F NDJSON,副檔名 .json\n}\n",[28,1496,1497,1502,1506,1511,1515,1520],{"__ignoreMap":68},[72,1498,1499],{"class":74,"line":75},[72,1500,1501],{},"public enum QuoteOutputFormat\n",[72,1503,1504],{"class":74,"line":81},[72,1505,695],{},[72,1507,1508],{"class":74,"line":88},[72,1509,1510],{},"    Txt  = 0,   \u002F\u002F 人類可讀 key=value,副檔名 .txt(預設)\n",[72,1512,1513],{"class":74,"line":129},[72,1514,1201],{},[72,1516,1517],{"class":74,"line":135},[72,1518,1519],{},"    Json = 2,   \u002F\u002F NDJSON,副檔名 .json\n",[72,1521,1522],{"class":74,"line":141},[72,1523,788],{},[93,1525,1527],{"id":1526},"_51-txt-log-格式","5.1 Txt \u002F Log 格式",[63,1529,1532],{"className":1530,"code":1531,"language":1033},[1031],"[2026-05-13 10:23:45.123] binance_spot BTCUSDT last=60123.5 bid=60123.0 ask=60124.0 bidQty=0.5 askQty=1.2\n",[28,1533,1531],{"__ignoreMap":68},[251,1535,1536,1539,1542],{},[254,1537,1538],{},"ISO 8601 時間戳前綴(給人類看)",[254,1540,1541],{},"null 的選填欄位略過(行長變動)",[254,1543,1544,1546,1547],{},[28,1545,493],{}," 字典項目展開成更多 ",[28,1548,1549],{},"k=v",[93,1551,1553],{"id":1552},"_52-json-格式ndjson","5.2 Json 格式(NDJSON)",[63,1555,1557],{"className":1217,"code":1556,"language":1219,"meta":68,"style":68},"{\"ts\":1715587425123,\"symbol\":\"BTCUSDT\",\"bucket\":\"binance_spot\",\"last\":60123.5,\"bid\":60123.0,\"ask\":60124.0,\"extras\":{\"funding\":0.0001}}\n",[28,1558,1559],{"__ignoreMap":68},[72,1560,1561,1563,1565,1567,1569,1571,1574,1576,1579,1581,1584,1586,1589,1591,1594,1596,1599,1601,1604,1606,1609,1611,1614,1616,1619,1621,1624,1626,1629,1631,1634],{"class":74,"line":75},[72,1562,1227],{"class":1226},[72,1564,1231],{"class":1230},[72,1566,476],{"class":1226},[72,1568,1236],{"class":1230},[72,1570,1239],{"class":1226},[72,1572,1573],{"class":1230},"\"symbol\"",[72,1575,476],{"class":1226},[72,1577,1578],{"class":1247},"\"BTCUSDT\"",[72,1580,1239],{"class":1226},[72,1582,1583],{"class":1230},"\"bucket\"",[72,1585,476],{"class":1226},[72,1587,1588],{"class":1247},"\"binance_spot\"",[72,1590,1239],{"class":1226},[72,1592,1593],{"class":1230},"\"last\"",[72,1595,476],{"class":1226},[72,1597,1598],{"class":1230},"60123.5",[72,1600,1239],{"class":1226},[72,1602,1603],{"class":1230},"\"bid\"",[72,1605,476],{"class":1226},[72,1607,1608],{"class":1230},"60123.0",[72,1610,1239],{"class":1226},[72,1612,1613],{"class":1230},"\"ask\"",[72,1615,476],{"class":1226},[72,1617,1618],{"class":1230},"60124.0",[72,1620,1239],{"class":1226},[72,1622,1623],{"class":1230},"\"extras\"",[72,1625,1296],{"class":1226},[72,1627,1628],{"class":1230},"\"funding\"",[72,1630,476],{"class":1226},[72,1632,1633],{"class":1230},"0.0001",[72,1635,1303],{"class":1226},[251,1637,1638,1643,1646,1654],{},[254,1639,1640,1642],{},[28,1641,983],{}," = epoch_ms(與主 logger 一致)",[254,1644,1645],{},"只輸出非 null 欄位",[254,1647,1648,1650,1651,1653],{},[28,1649,493],{}," nested 在 ",[28,1652,1623],{}," 子物件(不平攤到 top level) — 保持乾淨的 schema 邊界",[254,1655,1656,1657,231,1660,859,1662,1664],{},"Quote NDJSON ",[193,1658,1659],{},"不含",[28,1661,1400],{},[28,1663,1425],{},"(報價是市場事件,非程式內部事件)",[44,1666],{},[47,1668,1670],{"id":1669},"_6-唯讀配置視圖","6. 唯讀配置視圖",[63,1672,1674],{"className":65,"code":1673,"language":67,"meta":68,"style":68},"LogConfiguration.ILogOptions current = LOG.GetCurrentOptions();\nConsole.WriteLine(current.OutputFormat);             \u002F\u002F LogOutputFormat\nConsole.WriteLine(current.TimeFormat);               \u002F\u002F \"HH:mm:ss.fff\" 等\nConsole.WriteLine(current.HighPrecisionTimestamp);   \u002F\u002F bool\nConsole.WriteLine(current.QuoteOptions.Enable);      \u002F\u002F bool\n",[28,1675,1676,1681,1686,1691,1696],{"__ignoreMap":68},[72,1677,1678],{"class":74,"line":75},[72,1679,1680],{},"LogConfiguration.ILogOptions current = LOG.GetCurrentOptions();\n",[72,1682,1683],{"class":74,"line":81},[72,1684,1685],{},"Console.WriteLine(current.OutputFormat);             \u002F\u002F LogOutputFormat\n",[72,1687,1688],{"class":74,"line":88},[72,1689,1690],{},"Console.WriteLine(current.TimeFormat);               \u002F\u002F \"HH:mm:ss.fff\" 等\n",[72,1692,1693],{"class":74,"line":129},[72,1694,1695],{},"Console.WriteLine(current.HighPrecisionTimestamp);   \u002F\u002F bool\n",[72,1697,1698],{"class":74,"line":135},[72,1699,1700],{},"Console.WriteLine(current.QuoteOptions.Enable);      \u002F\u002F bool\n",[18,1702,1703,1704,107],{},"完整屬性列表見",[22,1705,1707],{"href":1706},".\u002Fconfiguration","配置選項",[44,1709],{},[47,1711,1713,1714,507],{"id":1712},"_7-例外序列化serializableexceptioninfo","7. 例外序列化(",[28,1715,1716],{},"SerializableExceptionInfo",[18,1718,1719,1720,1722,1723,859,1726,859,1729,1732,1733,1736],{},"當你以 ",[28,1721,209],{}," 級別或以上呼叫 ",[28,1724,1725],{},"Warn_Log\u003CT>(ex)",[28,1727,1728],{},"Error_Log\u003CT>(ex)",[28,1730,1731],{},"Fatal_Log\u003CT>(ex)"," 並傳入 ",[28,1734,1735],{},"Exception"," 物件時,runtime 會展開為:",[63,1738,1740],{"className":65,"code":1739,"language":67,"meta":68,"style":68},"class SerializableExceptionInfo\n{\n    string Type;          \u002F\u002F ex.GetType().FullName\n    string Message;\n    string Source;\n    string HelpLink;\n    string StackTrace;\n    Dictionary\u003Cstring, string> Data;             \u002F\u002F 從 ex.Data 展開\n    SerializableExceptionInfo InnerException;    \u002F\u002F 遞迴\n    Dictionary\u003Cstring, string> AdditionalProperties;  \u002F\u002F 反射撈的非標準屬性\n}\n",[28,1741,1742,1747,1751,1756,1761,1766,1771,1776,1781,1786,1791],{"__ignoreMap":68},[72,1743,1744],{"class":74,"line":75},[72,1745,1746],{},"class SerializableExceptionInfo\n",[72,1748,1749],{"class":74,"line":81},[72,1750,695],{},[72,1752,1753],{"class":74,"line":88},[72,1754,1755],{},"    string Type;          \u002F\u002F ex.GetType().FullName\n",[72,1757,1758],{"class":74,"line":129},[72,1759,1760],{},"    string Message;\n",[72,1762,1763],{"class":74,"line":135},[72,1764,1765],{},"    string Source;\n",[72,1767,1768],{"class":74,"line":141},[72,1769,1770],{},"    string HelpLink;\n",[72,1772,1773],{"class":74,"line":146},[72,1774,1775],{},"    string StackTrace;\n",[72,1777,1778],{"class":74,"line":152},[72,1779,1780],{},"    Dictionary\u003Cstring, string> Data;             \u002F\u002F 從 ex.Data 展開\n",[72,1782,1783],{"class":74,"line":158},[72,1784,1785],{},"    SerializableExceptionInfo InnerException;    \u002F\u002F 遞迴\n",[72,1787,1788],{"class":74,"line":163},[72,1789,1790],{},"    Dictionary\u003Cstring, string> AdditionalProperties;  \u002F\u002F 反射撈的非標準屬性\n",[72,1792,1793],{"class":74,"line":169},[72,1794,788],{},[18,1796,1797,1798,1800],{},"結果以 JSON 序列化寫入 log 行(或在 Json 輸出模式下放進 ",[28,1799,1465],{}," 欄位)。",[44,1802],{},[47,1804,1806],{"id":1805},"_8-版本相容性說明","8. 版本相容性說明",[251,1808,1809,1816,1825],{},[254,1810,1811,1812,1815],{},"v3.1 新增內容",[193,1813,1814],{},"全部是 additive"," — 沒移除或重命名任何公開 API。",[254,1817,1818,1820,1821,1824],{},[28,1819,403],{}," 與新 ",[28,1822,1823],{},"QuoteOptions"," 的所有新選項都預設為 v3.0 行為 — 現有程式碼不需修改。",[254,1826,1827,1828,1831,1832,203,1835,203,1838,203,1841,203,1844,203,1847,1849,1850,1853,1854,1856],{},"新加的 ",[28,1829,1830],{},"ILogOptions"," 介面成員(",[28,1833,1834],{},"OutputFormat",[28,1836,1837],{},"TimeFormat",[28,1839,1840],{},"ShowThreadId",[28,1842,1843],{},"ShowThreadName",[28,1845,1846],{},"HighPrecisionTimestamp",[28,1848,1823],{},")是",[193,1851,1852],{},"唯讀",";函式庫消費者通常只透過 ",[28,1855,387],{}," 讀取,所以這對典型用法不算 breaking change。",[1858,1859,1860],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}html pre.shiki code .sB1qb, html code.shiki .sB1qb{--shiki-default:#B31D28;--shiki-default-font-style:italic}",{"title":68,"searchDepth":81,"depth":88,"links":1862},[1863,1876,1885,1887,1891,1896,1897,1899],{"id":49,"depth":81,"text":1864,"children":1865},"1. LOG 靜態類別",[1866,1870,1872,1874],{"id":95,"depth":88,"text":96,"children":1867},[1868,1869],{"id":220,"depth":129,"text":221},{"id":249,"depth":129,"text":249},{"id":298,"depth":88,"text":1871},"1.2 CustomName_Log — 自訂檔名分桶",{"id":352,"depth":88,"text":1873},"1.3 LOG.Configure(...) — 一次性配置",{"id":383,"depth":88,"text":1875},"1.4 LOG.GetCurrentOptions() — 唯讀配置視圖",{"id":409,"depth":81,"text":1877,"children":1878},"2. LOG.Quote(...) — 報價 pipeline (v3.1+)",[1879,1880,1881,1883,1884],{"id":451,"depth":88,"text":452},{"id":510,"depth":88,"text":511},{"id":673,"depth":88,"text":1882},"2.3 QuoteRecord(公開 readonly struct)",{"id":960,"depth":88,"text":961},{"id":1026,"depth":88,"text":1027},{"id":1082,"depth":81,"text":1886},"3. LogLevel enum",{"id":1161,"depth":81,"text":1888,"children":1889},"4. LogOutputFormat enum (v3.1+)",[1890],{"id":1213,"depth":88,"text":1214},{"id":1479,"depth":81,"text":1892,"children":1893},"5. QuoteOutputFormat enum (v3.1+)",[1894,1895],{"id":1526,"depth":88,"text":1527},{"id":1552,"depth":88,"text":1553},{"id":1669,"depth":81,"text":1670},{"id":1712,"depth":81,"text":1898},"7. 例外序列化(SerializableExceptionInfo)",{"id":1805,"depth":81,"text":1806},"OzaLog v3.1 完整公開 API — LOG 靜態類別、LogOptions、QuoteRecord、各 enum。","md",{},"\u002Fzh-tw\u002Fapi",{"title":6,"description":1900},"zh-TW\u002Fapi","6Hs16YACDgd44USQ__QXrETGhdWmjIYTLtoRUlxabLY",{"matched":1908,"target":1909,"all":1910},"fallback (.all() + manual match)","\u002Fzh-TW\u002Fapi",[1911,1916,1921,1926,1931,1936,1941,1946,1947,1952,1957,1962,1966,1971],{"path":1912,"id":1913,"stem":1914,"title":1915},"\u002Fen\u002Fapi","content\u002Fen\u002Fapi.md","en\u002Fapi","API Reference",{"path":1917,"id":1918,"stem":1919,"title":1920},"\u002Fen\u002Fasync-pipeline","content\u002Fen\u002Fasync-pipeline.md","en\u002Fasync-pipeline","HFT Async Architecture",{"path":1922,"id":1923,"stem":1924,"title":1925},"\u002Fen\u002Fbenchmarks","content\u002Fen\u002Fbenchmarks.md","en\u002Fbenchmarks","Benchmarks",{"path":1927,"id":1928,"stem":1929,"title":1930},"\u002Fen\u002Fchangelog","content\u002Fen\u002Fchangelog.md","en\u002Fchangelog","Changelog",{"path":1932,"id":1933,"stem":1934,"title":1935},"\u002Fen\u002Fconfiguration","content\u002Fen\u002Fconfiguration.md","en\u002Fconfiguration","Configuration",{"path":1937,"id":1938,"stem":1939,"title":1940},"\u002Fen\u002Fgetting-started","content\u002Fen\u002Fgetting-started.md","en\u002Fgetting-started","Getting Started",{"path":1942,"id":1943,"stem":1944,"title":1945},"\u002Fen\u002Fmigration","content\u002Fen\u002Fmigration.md","en\u002Fmigration","Migration Guide",{"path":1903,"id":5,"stem":1905,"title":6},{"path":1948,"id":1949,"stem":1950,"title":1951},"\u002Fzh-tw\u002Fasync-pipeline","content\u002Fzh-TW\u002Fasync-pipeline.md","zh-TW\u002Fasync-pipeline","HFT 非同步架構",{"path":1953,"id":1954,"stem":1955,"title":1956},"\u002Fzh-tw\u002Fbenchmarks","content\u002Fzh-TW\u002Fbenchmarks.md","zh-TW\u002Fbenchmarks","效能對比",{"path":1958,"id":1959,"stem":1960,"title":1961},"\u002Fzh-tw\u002Fchangelog","content\u002Fzh-TW\u002Fchangelog.md","zh-TW\u002Fchangelog","版本歷史",{"path":1963,"id":1964,"stem":1965,"title":1707},"\u002Fzh-tw\u002Fconfiguration","content\u002Fzh-TW\u002Fconfiguration.md","zh-TW\u002Fconfiguration",{"path":1967,"id":1968,"stem":1969,"title":1970},"\u002Fzh-tw\u002Fgetting-started","content\u002Fzh-TW\u002Fgetting-started.md","zh-TW\u002Fgetting-started","快速開始",{"path":1972,"id":1973,"stem":1974,"title":1975},"\u002Fzh-tw\u002Fmigration","content\u002Fzh-TW\u002Fmigration.md","zh-TW\u002Fmigration","升級指南",1778734456321]