[{"data":1,"prerenderedAt":1602},["ShallowReactive",2],{"content-en-configuration":3},{"doc":4,"debug":1599},{"id":5,"title":6,"body":7,"description":1592,"extension":1593,"meta":1594,"navigation":58,"path":1595,"seo":1596,"stem":1597,"__hash__":1598},"content\u002Fen\u002Fconfiguration.md","Configuration",{"type":8,"value":9,"toc":1573},"minimark",[10,14,36,102,105,114,119,260,264,453,457,599,603,647,665,672,697,706,714,720,812,814,822,835,912,1130,1142,1144,1151,1158,1243,1253,1255,1265,1562,1569],[11,12,6],"h1",{"id":13},"configuration",[15,16,17,18,22,23,27,28,31,32,35],"p",{},"All configuration is set ",[19,20,21],"strong",{},"once"," at process start via ",[24,25,26],"code",{},"LOG.Configure(...)",". The call is ",[19,29,30],{},"not re-entrant"," — a second call throws ",[24,33,34],{},"InvalidOperationException",". If you skip it entirely, defaults apply on first log write.",[37,38,43],"pre",{"className":39,"code":40,"language":41,"meta":42,"style":42},"language-csharp shiki shiki-themes github-light","using OzaLog;\n\nLOG.Configure(o =>\n{\n    o.KeepDays = -7;\n    o.SetFileSizeInMB(50);\n    o.OutputFormat = LogOutputFormat.Json;\n    o.ConfigureQuote(q => q.Enable = true);\n});\n","csharp","",[24,44,45,53,60,66,72,78,84,90,96],{"__ignoreMap":42},[46,47,50],"span",{"class":48,"line":49},"line",1,[46,51,52],{},"using OzaLog;\n",[46,54,56],{"class":48,"line":55},2,[46,57,59],{"emptyLinePlaceholder":58},true,"\n",[46,61,63],{"class":48,"line":62},3,[46,64,65],{},"LOG.Configure(o =>\n",[46,67,69],{"class":48,"line":68},4,[46,70,71],{},"{\n",[46,73,75],{"class":48,"line":74},5,[46,76,77],{},"    o.KeepDays = -7;\n",[46,79,81],{"class":48,"line":80},6,[46,82,83],{},"    o.SetFileSizeInMB(50);\n",[46,85,87],{"class":48,"line":86},7,[46,88,89],{},"    o.OutputFormat = LogOutputFormat.Json;\n",[46,91,93],{"class":48,"line":92},8,[46,94,95],{},"    o.ConfigureQuote(q => q.Enable = true);\n",[46,97,99],{"class":48,"line":98},9,[46,100,101],{},"});\n",[103,104],"hr",{},[106,107,109,110,113],"h2",{"id":108},"_1-logoptions-main-logger","1. ",[24,111,112],{},"LogOptions"," — main logger",[115,116,118],"h3",{"id":117},"_11-file-output","1.1 File output",[120,121,122,141],"table",{},[123,124,125],"thead",{},[126,127,128,132,135,138],"tr",{},[129,130,131],"th",{},"Option",[129,133,134],{},"Type",[129,136,137],{},"Default",[129,139,140],{},"Description",[142,143,144,172,197,215,242],"tbody",{},[126,145,146,152,157,162],{},[147,148,149],"td",{},[24,150,151],{},"KeepDays",[147,153,154],{},[24,155,156],{},"int",[147,158,159],{},[24,160,161],{},"-3",[147,163,164,167,168,171],{},[19,165,166],{},"Must be negative."," Number of days of logs to keep. Older dated subdirectories are deleted by ",[24,169,170],{},"LogRetentionCleaner"," running every 60 s in the background.",[126,173,174,179,184,190],{},[147,175,176],{},[24,177,178],{},"MaxFileSize",[147,180,181],{},[24,182,183],{},"long",[147,185,186,189],{},[24,187,188],{},"50 * 1024 * 1024"," (50 MB)",[147,191,192,193,196],{},"File size threshold for size-based splitting. When a file exceeds this, the next write opens ",[24,194,195],{},"{name}_part2_Log.{ext}",".",[126,198,199,204,207,210],{},[147,200,201],{},[24,202,203],{},"SetFileSizeInMB(int megabytes)",[147,205,206],{},"method",[147,208,209],{},"—",[147,211,212,213,196],{},"Convenience setter for ",[24,214,178],{},[126,216,217,222,227,232],{},[147,218,219],{},[24,220,221],{},"LogPath",[147,223,224],{},[24,225,226],{},"string",[147,228,229],{},[24,230,231],{},"\"logs\"",[147,233,234,235,238,239,196],{},"Root directory under ",[24,236,237],{},"AppDomain.CurrentDomain.BaseDirectory",". Full path becomes ",[24,240,241],{},"{baseDir}\u002F{LogPath}\u002F{yyyyMMdd}\u002F{TypeDirectories.*}\u002F{name}_Log.{ext}",[126,243,244,249,254,257],{},[147,245,246],{},[24,247,248],{},"TypeDirectories",[147,250,251],{},[24,252,253],{},"LogTypeDirectories",[147,255,256],{},"see §1.5",[147,258,259],{},"Per-LogLevel subdirectory configuration.",[115,261,263],{"id":262},"_12-output-format-v31","1.2 Output format (v3.1+)",[120,265,266,278],{},[123,267,268],{},[126,269,270,272,274,276],{},[129,271,131],{},[129,273,134],{},[129,275,137],{},[129,277,140],{},[142,279,280,316,352,387,425],{},[126,281,282,287,292,297],{},[147,283,284],{},[24,285,286],{},"OutputFormat",[147,288,289],{},[24,290,291],{},"LogOutputFormat",[147,293,294],{},[24,295,296],{},"Txt",[147,298,299,300,302,303,306,307,310,311,196],{},"Global selector: ",[24,301,296],{}," \u002F ",[24,304,305],{},"Log"," (same content, different extension) \u002F ",[24,308,309],{},"Json"," (NDJSON). See ",[312,313,315],"a",{"href":314},".\u002Fapi#4-logoutputformat-enum-v31","API §4",[126,317,318,323,327,332],{},[147,319,320],{},[24,321,322],{},"TimeFormat",[147,324,325],{},[24,326,226],{},[147,328,329],{},[24,330,331],{},"\"HH:mm:ss.fff\"",[147,333,334,335,338,339,341,342,344,345,351],{},"Free-form .NET ",[24,336,337],{},"DateTime"," format string for the message prefix in ",[24,340,296],{},"\u002F",[24,343,305],{}," modes. ",[19,346,347,348,350],{},"Not used in ",[24,349,309],{}," mode"," (which always emits epoch_ms). Invalid format strings fall back to default.",[126,353,354,359,364,369],{},[147,355,356],{},[24,357,358],{},"ShowThreadId",[147,360,361],{},[24,362,363],{},"bool",[147,365,366],{},[24,367,368],{},"true",[147,370,371,372,375,376,341,378,380,381,384,385,196],{},"Toggle ",[24,373,374],{},"[T:tid]"," prefix in ",[24,377,296],{},[24,379,305],{},"; toggle ",[24,382,383],{},"tid"," field in ",[24,386,309],{},[126,388,389,394,398,403],{},[147,390,391],{},[24,392,393],{},"ShowThreadName",[147,395,396],{},[24,397,363],{},[147,399,400],{},[24,401,402],{},"false",[147,404,405,406,409,410,341,412,414,415,418,419,421,422,424],{},"Toggle thread name display. When the calling thread has no ",[24,407,408],{},"Thread.Name",", the entire thread segment is omitted regardless. In ",[24,411,296],{},[24,413,305],{}," mode the output combines as ",[24,416,417],{},"[T:tid\u002FName]"," if both ",[24,420,358],{}," and ",[24,423,393],{}," are true.",[126,426,427,432,436,440],{},[147,428,429],{},[24,430,431],{},"HighPrecisionTimestamp",[147,433,434],{},[24,435,363],{},[147,437,438],{},[24,439,402],{},[147,441,442,443,446,447,449,450,196],{},"Opt-in ",[24,444,445],{},"Stopwatch","-hybrid mode for µs-level precision. Raises caller-side ticks read from ~5 ns to ~30 ns. Useful only if your ",[24,448,322],{}," uses precision finer than ",[24,451,452],{},".fff",[115,454,456],{"id":455},"_13-async-pipeline-behavior","1.3 Async pipeline behavior",[120,458,459,471],{},[123,460,461],{},[126,462,463,465,467,469],{},[129,464,131],{},[129,466,134],{},[129,468,137],{},[129,470,140],{},[142,472,473,494,518,546,575],{},[126,474,475,480,484,488],{},[147,476,477],{},[24,478,479],{},"EnableAsyncLogging",[147,481,482],{},[24,483,363],{},[147,485,486],{},[24,487,368],{},[147,489,490,491,493],{},"If ",[24,492,402],{},", calls write synchronously on the caller thread (no batching, no FileStream pool — slower for HFT but simpler to reason about).",[126,495,496,501,505,509],{},[147,497,498],{},[24,499,500],{},"EnableConsoleOutput",[147,502,503],{},[24,504,363],{},[147,506,507],{},[24,508,368],{},[147,510,490,511,513,514,517],{},[24,512,368],{},", every log line is also written to ",[24,515,516],{},"Console.WriteLine"," on the caller thread.",[126,519,520,525,529,539],{},[147,521,522],{},[24,523,524],{},"MaxOpenFileStreams",[147,526,527],{},[24,528,156],{},[147,530,531,534,535,538],{},[24,532,533],{},"100"," (range ",[24,536,537],{},"[4, 4096]",")",[147,540,541,542,545],{},"LRU upper bound for the persistent ",[24,543,544],{},"FileStreamPool",". When exceeded, the least-recently-written stream is closed.",[126,547,548,553,557,564],{},[147,549,550],{},[24,551,552],{},"DiskFlushIntervalMs",[147,554,555],{},[24,556,156],{},[147,558,559,534,561,538],{},[24,560,533],{},[24,562,563],{},"[10, 10000]",[147,565,566,567,570,571,574],{},"Period for ",[24,568,569],{},"FileStreamPool.FlushAll()"," — buffered writes flushed to disk (but not ",[24,572,573],{},"fsync","-ed; OS decides write-back).",[126,576,577,582,587,592],{},[147,578,579],{},[24,580,581],{},"OnDropped",[147,583,584],{},[24,585,586],{},"Action",[147,588,589],{},[24,590,591],{},"null",[147,593,594,595,598],{},"Callback fired ",[19,596,597],{},"once per drop event"," when the queue is full and the oldest entry is dropped. Body must be light (called on dispatcher thread).",[115,600,602],{"id":601},"_14-global-exception-capture-opt-in","1.4 Global exception capture (opt-in)",[120,604,605,617],{},[123,606,607],{},[126,608,609,611,613,615],{},[129,610,131],{},[129,612,134],{},[129,614,137],{},[129,616,140],{},[142,618,619],{},[126,620,621,626,630,634],{},[147,622,623],{},[24,624,625],{},"EnableGlobalExceptionCapture",[147,627,628],{},[24,629,363],{},[147,631,632],{},[24,633,402],{},[147,635,490,636,638,639,642,643,646],{},[24,637,368],{},", subscribes to ",[24,640,641],{},"AppDomain.UnhandledException"," + ",[24,644,645],{},"TaskScheduler.UnobservedTaskException"," and logs them at Fatal level with synchronous immediate flush. Off by default to avoid clashing with the host app's existing handlers.",[648,649,650],"blockquote",{},[15,651,652,653,656,657,660,661,664],{},"Does ",[19,654,655],{},"not"," intercept WPF ",[24,658,659],{},"DispatcherUnhandledException",", WinForms ",[24,662,663],{},"ThreadException",", or ASP.NET Core middleware exceptions — library can't reach those framework objects. Host app must hook those itself.",[115,666,668,669,671],{"id":667},"_15-logtypedirectories-per-level-subdirectories","1.5 ",[24,670,253],{}," — per-level subdirectories",[37,673,675],{"className":39,"code":674,"language":41,"meta":42,"style":42},"o.TypeDirectories.DirectoryPath = \"LogFiles\";   \u002F\u002F default if level-specific path is null\no.TypeDirectories.ErrorPath     = \"ErrorLogs\";  \u002F\u002F route Error level to a separate folder\no.TypeDirectories.FatalPath     = \"FatalLogs\";\n\u002F\u002F TracePath \u002F DebugPath \u002F InfoPath \u002F WarnPath \u002F CustomPath also available\n",[24,676,677,682,687,692],{"__ignoreMap":42},[46,678,679],{"class":48,"line":49},[46,680,681],{},"o.TypeDirectories.DirectoryPath = \"LogFiles\";   \u002F\u002F default if level-specific path is null\n",[46,683,684],{"class":48,"line":55},[46,685,686],{},"o.TypeDirectories.ErrorPath     = \"ErrorLogs\";  \u002F\u002F route Error level to a separate folder\n",[46,688,689],{"class":48,"line":62},[46,690,691],{},"o.TypeDirectories.FatalPath     = \"FatalLogs\";\n",[46,693,694],{"class":48,"line":68},[46,695,696],{},"\u002F\u002F TracePath \u002F DebugPath \u002F InfoPath \u002F WarnPath \u002F CustomPath also available\n",[15,698,699,700,702,703,196],{},"If a level-specific path is ",[24,701,591],{},", it falls back to ",[24,704,705],{},"DirectoryPath",[115,707,709,710,713],{"id":708},"_16-asynclogoptions-dispatcher-tuning","1.6 ",[24,711,712],{},"AsyncLogOptions"," — dispatcher tuning",[15,715,716,717,196],{},"Configured via ",[24,718,719],{},"o.ConfigureAsync(a => { ... })",[120,721,722,737],{},[123,723,724],{},[126,725,726,728,730,732,735],{},[129,727,131],{},[129,729,134],{},[129,731,137],{},[129,733,734],{},"Range",[129,736,140],{},[142,738,739,762,789],{},[126,740,741,746,750,754,759],{},[147,742,743],{},[24,744,745],{},"MaxBatchSize",[147,747,748],{},[24,749,156],{},[147,751,752],{},[24,753,533],{},[147,755,756],{},[24,757,758],{},"[1, 1000]",[147,760,761],{},"Max items drained by the dispatcher per wake-up.",[126,763,764,769,773,778,783],{},[147,765,766],{},[24,767,768],{},"MaxQueueSize",[147,770,771],{},[24,772,156],{},[147,774,775],{},[24,776,777],{},"10000",[147,779,780],{},[24,781,782],{},"[1000, 100000]",[147,784,785,786,788],{},"Queue capacity. When exceeded, drop oldest + ",[24,787,581],{}," callback fires.",[126,790,791,796,800,805,809],{},[147,792,793],{},[24,794,795],{},"FlushIntervalMs",[147,797,798],{},[24,799,156],{},[147,801,802],{},[24,803,804],{},"1000",[147,806,807],{},[24,808,563],{},[147,810,811],{},"Dispatcher wake-up interval. The semaphore wait times out at this interval if no signals arrive.",[103,813],{},[106,815,817,818,821],{"id":816},"_2-quoteoptions-quote-pipeline-v31","2. ",[24,819,820],{},"QuoteOptions"," — Quote pipeline (v3.1+)",[15,823,716,824,827,828,834],{},[24,825,826],{},"o.ConfigureQuote(q => { ... })",". ",[19,829,830,831],{},"Default is ",[24,832,833],{},"Enable = false"," — the Quote pipeline must be explicitly opted into.",[37,836,838],{"className":39,"code":837,"language":41,"meta":42,"style":42},"LOG.Configure(o =>\n{\n    o.ConfigureQuote(q =>\n    {\n        q.Enable = true;\n        q.OutputFormat = QuoteOutputFormat.Json;\n        q.QuotePath = \"Quotes\";\n        q.MaxOpenStreams = 500;\n        q.MaxQueueSize = 50_000;\n        q.MaxBatchSize = 500;\n        q.FlushIntervalMs = 100;\n        q.OnDropped = droppedCount => MyMetrics.RecordDrops(droppedCount);\n    });\n});\n",[24,839,840,844,848,853,858,863,868,873,878,883,889,895,901,907],{"__ignoreMap":42},[46,841,842],{"class":48,"line":49},[46,843,65],{},[46,845,846],{"class":48,"line":55},[46,847,71],{},[46,849,850],{"class":48,"line":62},[46,851,852],{},"    o.ConfigureQuote(q =>\n",[46,854,855],{"class":48,"line":68},[46,856,857],{},"    {\n",[46,859,860],{"class":48,"line":74},[46,861,862],{},"        q.Enable = true;\n",[46,864,865],{"class":48,"line":80},[46,866,867],{},"        q.OutputFormat = QuoteOutputFormat.Json;\n",[46,869,870],{"class":48,"line":86},[46,871,872],{},"        q.QuotePath = \"Quotes\";\n",[46,874,875],{"class":48,"line":92},[46,876,877],{},"        q.MaxOpenStreams = 500;\n",[46,879,880],{"class":48,"line":98},[46,881,882],{},"        q.MaxQueueSize = 50_000;\n",[46,884,886],{"class":48,"line":885},10,[46,887,888],{},"        q.MaxBatchSize = 500;\n",[46,890,892],{"class":48,"line":891},11,[46,893,894],{},"        q.FlushIntervalMs = 100;\n",[46,896,898],{"class":48,"line":897},12,[46,899,900],{},"        q.OnDropped = droppedCount => MyMetrics.RecordDrops(droppedCount);\n",[46,902,904],{"class":48,"line":903},13,[46,905,906],{},"    });\n",[46,908,910],{"class":48,"line":909},14,[46,911,101],{},[120,913,914,928],{},[123,915,916],{},[126,917,918,920,922,924,926],{},[129,919,131],{},[129,921,134],{},[129,923,137],{},[129,925,734],{},[129,927,140],{},[142,929,930,960,988,1013,1040,1063,1085,1106],{},[126,931,932,937,941,945,947],{},[147,933,934],{},[24,935,936],{},"Enable",[147,938,939],{},[24,940,363],{},[147,942,943],{},[24,944,402],{},[147,946,209],{},[147,948,949,952,953,955,956,959],{},[19,950,951],{},"Required."," When ",[24,954,402],{},", all ",[24,957,958],{},"LOG.Quote(...)"," calls are silent no-ops and no background thread is started.",[126,961,962,966,971,975,977],{},[147,963,964],{},[24,965,286],{},[147,967,968],{},[24,969,970],{},"QuoteOutputFormat",[147,972,973],{},[24,974,296],{},[147,976,209],{},[147,978,979,302,981,302,983,985,986,196],{},[24,980,296],{},[24,982,305],{},[24,984,309],{},". Independent from main logger's ",[24,987,286],{},[126,989,990,995,999,1004,1006],{},[147,991,992],{},[24,993,994],{},"QuotePath",[147,996,997],{},[24,998,226],{},[147,1000,1001],{},[24,1002,1003],{},"\"Quotes\"",[147,1005,209],{},[147,1007,1008,1009,1012],{},"Subdirectory under ",[24,1010,1011],{},"{LogPath}\u002F{yyyyMMdd}\u002F"," for quote files.",[126,1014,1015,1020,1024,1029,1033],{},[147,1016,1017],{},[24,1018,1019],{},"MaxOpenStreams",[147,1021,1022],{},[24,1023,156],{},[147,1025,1026],{},[24,1027,1028],{},"500",[147,1030,1031],{},[24,1032,537],{},[147,1034,1035,1036,1039],{},"LRU upper bound for the independent ",[24,1037,1038],{},"QuoteFileStreamPool",". Higher than main logger because crypto\u002Fequities symbol counts run to thousands.",[126,1041,1042,1046,1050,1055,1060],{},[147,1043,1044],{},[24,1045,768],{},[147,1047,1048],{},[24,1049,156],{},[147,1051,1052],{},[24,1053,1054],{},"50000",[147,1056,1057],{},[24,1058,1059],{},"[1000, 1_000_000]",[147,1061,1062],{},"Quote queue capacity. Drop-oldest on overflow. Higher than main logger because quote throughput is typically 100×–1000× higher.",[126,1064,1065,1069,1073,1077,1082],{},[147,1066,1067],{},[24,1068,745],{},[147,1070,1071],{},[24,1072,156],{},[147,1074,1075],{},[24,1076,1028],{},[147,1078,1079],{},[24,1080,1081],{},"[1, 10000]",[147,1083,1084],{},"Max records drained per dispatcher wake-up.",[126,1086,1087,1091,1095,1099,1103],{},[147,1088,1089],{},[24,1090,795],{},[147,1092,1093],{},[24,1094,156],{},[147,1096,1097],{},[24,1098,533],{},[147,1100,1101],{},[24,1102,563],{},[147,1104,1105],{},"Dispatcher wake-up interval.",[126,1107,1108,1112,1117,1121,1123],{},[147,1109,1110],{},[24,1111,581],{},[147,1113,1114],{},[24,1115,1116],{},"Action\u003Clong>",[147,1118,1119],{},[24,1120,591],{},[147,1122,209],{},[147,1124,1125,1126,1129],{},"Callback invoked when drops happen. Parameter is the ",[19,1127,1128],{},"newly-dropped count"," since the last callback invocation (not cumulative).",[648,1131,1132],{},[15,1133,1134,1135,421,1137,1139,1140,196],{},"The Quote pipeline reuses the main logger's ",[24,1136,151],{},[24,1138,178],{}," settings for retention and file splitting. Quote files are cleaned up by the same ",[24,1141,170],{},[103,1143],{},[106,1145,1147,1148],{"id":1146},"_3-read-back-via-loggetcurrentoptions","3. Read-back via ",[24,1149,1150],{},"LOG.GetCurrentOptions()",[15,1152,1153,1154,1157],{},"After ",[24,1155,1156],{},"Configure",", you can inspect the live configuration via the read-only view:",[37,1159,1161],{"className":39,"code":1160,"language":41,"meta":42,"style":42},"var current = LOG.GetCurrentOptions();\n\n\u002F\u002F Main logger\nConsole.WriteLine(current.OutputFormat);                  \u002F\u002F Json\nConsole.WriteLine(current.TimeFormat);                    \u002F\u002F \"HH:mm:ss.fff\"\nConsole.WriteLine(current.ShowThreadId);                  \u002F\u002F true\nConsole.WriteLine(current.ShowThreadName);                \u002F\u002F false\nConsole.WriteLine(current.HighPrecisionTimestamp);        \u002F\u002F false\nConsole.WriteLine(current.MaxOpenFileStreams);            \u002F\u002F 100\nConsole.WriteLine(current.AsyncOptions.MaxQueueSize);     \u002F\u002F 10000\n\n\u002F\u002F Quote pipeline\nConsole.WriteLine(current.QuoteOptions.Enable);           \u002F\u002F true\nConsole.WriteLine(current.QuoteOptions.OutputFormat);     \u002F\u002F Json\nConsole.WriteLine(current.QuoteOptions.QuotePath);        \u002F\u002F \"Quotes\"\nConsole.WriteLine(current.QuoteOptions.MaxOpenStreams);   \u002F\u002F 500\n",[24,1162,1163,1168,1172,1177,1182,1187,1192,1197,1202,1207,1212,1216,1221,1226,1231,1237],{"__ignoreMap":42},[46,1164,1165],{"class":48,"line":49},[46,1166,1167],{},"var current = LOG.GetCurrentOptions();\n",[46,1169,1170],{"class":48,"line":55},[46,1171,59],{"emptyLinePlaceholder":58},[46,1173,1174],{"class":48,"line":62},[46,1175,1176],{},"\u002F\u002F Main logger\n",[46,1178,1179],{"class":48,"line":68},[46,1180,1181],{},"Console.WriteLine(current.OutputFormat);                  \u002F\u002F Json\n",[46,1183,1184],{"class":48,"line":74},[46,1185,1186],{},"Console.WriteLine(current.TimeFormat);                    \u002F\u002F \"HH:mm:ss.fff\"\n",[46,1188,1189],{"class":48,"line":80},[46,1190,1191],{},"Console.WriteLine(current.ShowThreadId);                  \u002F\u002F true\n",[46,1193,1194],{"class":48,"line":86},[46,1195,1196],{},"Console.WriteLine(current.ShowThreadName);                \u002F\u002F false\n",[46,1198,1199],{"class":48,"line":92},[46,1200,1201],{},"Console.WriteLine(current.HighPrecisionTimestamp);        \u002F\u002F false\n",[46,1203,1204],{"class":48,"line":98},[46,1205,1206],{},"Console.WriteLine(current.MaxOpenFileStreams);            \u002F\u002F 100\n",[46,1208,1209],{"class":48,"line":885},[46,1210,1211],{},"Console.WriteLine(current.AsyncOptions.MaxQueueSize);     \u002F\u002F 10000\n",[46,1213,1214],{"class":48,"line":891},[46,1215,59],{"emptyLinePlaceholder":58},[46,1217,1218],{"class":48,"line":897},[46,1219,1220],{},"\u002F\u002F Quote pipeline\n",[46,1222,1223],{"class":48,"line":903},[46,1224,1225],{},"Console.WriteLine(current.QuoteOptions.Enable);           \u002F\u002F true\n",[46,1227,1228],{"class":48,"line":909},[46,1229,1230],{},"Console.WriteLine(current.QuoteOptions.OutputFormat);     \u002F\u002F Json\n",[46,1232,1234],{"class":48,"line":1233},15,[46,1235,1236],{},"Console.WriteLine(current.QuoteOptions.QuotePath);        \u002F\u002F \"Quotes\"\n",[46,1238,1240],{"class":48,"line":1239},16,[46,1241,1242],{},"Console.WriteLine(current.QuoteOptions.MaxOpenStreams);   \u002F\u002F 500\n",[15,1244,1245,1246,302,1249,1252],{},"All read-back values are wrapped in ",[24,1247,1248],{},"ReadOnlyLogOptions",[24,1250,1251],{},"ReadOnlyQuoteOptions"," — consumers cannot mutate the live config through this view.",[103,1254],{},[106,1256,1258,1259,1261,1262,1264],{"id":1257},"_4-defaults-summary-when-logconfigure-is-not-called","4. Defaults summary (when ",[24,1260,26],{}," is ",[19,1263,655],{}," called)",[120,1266,1267,1279],{},[123,1268,1269],{},[126,1270,1271,1274,1277],{},[129,1272,1273],{},"Group",[129,1275,1276],{},"Setting",[129,1278,137],{},[142,1280,1281,1294,1305,1317,1331,1344,1356,1368,1380,1392,1405,1417,1429,1441,1454,1467,1480,1497,1510,1523,1536,1549],{},[126,1282,1283,1286,1290],{},[147,1284,1285],{},"File",[147,1287,1288],{},[24,1289,151],{},[147,1291,1292],{},[24,1293,161],{},[126,1295,1296,1298,1302],{},[147,1297,1285],{},[147,1299,1300],{},[24,1301,178],{},[147,1303,1304],{},"50 MB",[126,1306,1307,1309,1313],{},[147,1308,1285],{},[147,1310,1311],{},[24,1312,221],{},[147,1314,1315],{},[24,1316,231],{},[126,1318,1319,1321,1326],{},[147,1320,1285],{},[147,1322,1323],{},[24,1324,1325],{},"TypeDirectories.DirectoryPath",[147,1327,1328],{},[24,1329,1330],{},"\"LogFiles\"",[126,1332,1333,1336,1340],{},[147,1334,1335],{},"Format",[147,1337,1338],{},[24,1339,286],{},[147,1341,1342],{},[24,1343,296],{},[126,1345,1346,1348,1352],{},[147,1347,1335],{},[147,1349,1350],{},[24,1351,322],{},[147,1353,1354],{},[24,1355,331],{},[126,1357,1358,1360,1364],{},[147,1359,1335],{},[147,1361,1362],{},[24,1363,358],{},[147,1365,1366],{},[24,1367,368],{},[126,1369,1370,1372,1376],{},[147,1371,1335],{},[147,1373,1374],{},[24,1375,393],{},[147,1377,1378],{},[24,1379,402],{},[126,1381,1382,1384,1388],{},[147,1383,1335],{},[147,1385,1386],{},[24,1387,431],{},[147,1389,1390],{},[24,1391,402],{},[126,1393,1394,1397,1401],{},[147,1395,1396],{},"Async",[147,1398,1399],{},[24,1400,479],{},[147,1402,1403],{},[24,1404,368],{},[126,1406,1407,1409,1413],{},[147,1408,1396],{},[147,1410,1411],{},[24,1412,500],{},[147,1414,1415],{},[24,1416,368],{},[126,1418,1419,1421,1425],{},[147,1420,1396],{},[147,1422,1423],{},[24,1424,524],{},[147,1426,1427],{},[24,1428,533],{},[126,1430,1431,1433,1437],{},[147,1432,1396],{},[147,1434,1435],{},[24,1436,552],{},[147,1438,1439],{},[24,1440,533],{},[126,1442,1443,1445,1450],{},[147,1444,1396],{},[147,1446,1447],{},[24,1448,1449],{},"AsyncOptions.MaxBatchSize",[147,1451,1452],{},[24,1453,533],{},[126,1455,1456,1458,1463],{},[147,1457,1396],{},[147,1459,1460],{},[24,1461,1462],{},"AsyncOptions.MaxQueueSize",[147,1464,1465],{},[24,1466,777],{},[126,1468,1469,1471,1476],{},[147,1470,1396],{},[147,1472,1473],{},[24,1474,1475],{},"AsyncOptions.FlushIntervalMs",[147,1477,1478],{},[24,1479,804],{},[126,1481,1482,1485,1490],{},[147,1483,1484],{},"Quote",[147,1486,1487],{},[24,1488,1489],{},"QuoteOptions.Enable",[147,1491,1492],{},[19,1493,1494,1496],{},[24,1495,402],{}," (opt-in)",[126,1498,1499,1501,1506],{},[147,1500,1484],{},[147,1502,1503],{},[24,1504,1505],{},"QuoteOptions.OutputFormat",[147,1507,1508],{},[24,1509,296],{},[126,1511,1512,1514,1519],{},[147,1513,1484],{},[147,1515,1516],{},[24,1517,1518],{},"QuoteOptions.QuotePath",[147,1520,1521],{},[24,1522,1003],{},[126,1524,1525,1527,1532],{},[147,1526,1484],{},[147,1528,1529],{},[24,1530,1531],{},"QuoteOptions.MaxOpenStreams",[147,1533,1534],{},[24,1535,1028],{},[126,1537,1538,1540,1545],{},[147,1539,1484],{},[147,1541,1542],{},[24,1543,1544],{},"QuoteOptions.MaxQueueSize",[147,1546,1547],{},[24,1548,1054],{},[126,1550,1551,1554,1558],{},[147,1552,1553],{},"Misc",[147,1555,1556],{},[24,1557,625],{},[147,1559,1560],{},[24,1561,402],{},[15,1563,1564,1565,196],{},"→ For a one-page API summary see ",[312,1566,1568],{"href":1567},".\u002Fapi","API Reference",[1570,1571,1572],"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);}",{"title":42,"searchDepth":55,"depth":62,"links":1574},[1575,1586,1588,1590],{"id":108,"depth":55,"text":1576,"children":1577},"1. LogOptions — main logger",[1578,1579,1580,1581,1582,1584],{"id":117,"depth":62,"text":118},{"id":262,"depth":62,"text":263},{"id":455,"depth":62,"text":456},{"id":601,"depth":62,"text":602},{"id":667,"depth":62,"text":1583},"1.5 LogTypeDirectories — per-level subdirectories",{"id":708,"depth":62,"text":1585},"1.6 AsyncLogOptions — dispatcher tuning",{"id":816,"depth":55,"text":1587},"2. QuoteOptions — Quote pipeline (v3.1+)",{"id":1146,"depth":55,"text":1589},"3. Read-back via LOG.GetCurrentOptions()",{"id":1257,"depth":55,"text":1591},"4. Defaults summary (when LOG.Configure(...) is not called)","Complete reference of LogOptions, AsyncLogOptions, QuoteOptions exposed by LOG.Configure() (v3.1).","md",{},"\u002Fen\u002Fconfiguration",{"title":6,"description":1592},"en\u002Fconfiguration","kWMeDnEHGB0TB5FwpKpFhXmcYHsuerqH8xDuSmJ3kxs",{"matched":1600,"target":1595,"all":1601},"path()",null,1778734455527]