[{"data":1,"prerenderedAt":912},["ShallowReactive",2],{"content-en-getting-started":3},{"doc":4,"debug":909},{"id":5,"title":6,"body":7,"description":902,"extension":903,"meta":904,"navigation":113,"path":905,"seo":906,"stem":907,"__hash__":908},"content\u002Fen\u002Fgetting-started.md","Getting Started",{"type":8,"value":9,"toc":888},"minimark",[10,14,19,55,92,96,121,132,140,144,182,189,192,212,216,236,242,246,276,292,295,299,333,347,349,353,384,387,452,455,457,461,510,513,519,521,525,536,728,735,741,744,828,830,834,857,860,884],[11,12,6],"h1",{"id":13},"getting-started",[15,16,18],"h2",{"id":17},"install","Install",[20,21,26],"pre",{"className":22,"code":23,"language":24,"meta":25,"style":25},"language-bash shiki shiki-themes github-light","dotnet add package OzaLog --version 3.1.0\n","bash","",[27,28,29],"code",{"__ignoreMap":25},[30,31,34,38,42,45,48,52],"span",{"class":32,"line":33},"line",1,[30,35,37],{"class":36},"s7eDp","dotnet",[30,39,41],{"class":40},"sYBdl"," add",[30,43,44],{"class":40}," package",[30,46,47],{"class":40}," OzaLog",[30,49,51],{"class":50},"sYu0t"," --version",[30,53,54],{"class":50}," 3.1.0\n",[56,57,58,59,62,63,62,66,62,69,62,72,75,76,87,88,91],"p",{},"Supported target frameworks: ",[27,60,61],{},"netstandard2.0",", ",[27,64,65],{},"netstandard2.1",[27,67,68],{},"net8.0",[27,70,71],{},"net9.0",[27,73,74],{},"net10.0",". ",[77,78,79,80,82,83,82,85],"strong",{},"Zero NuGet dependencies on ",[27,81,68],{}," \u002F ",[27,84,71],{},[27,86,74],{}," (uses BCL built-in ",[27,89,90],{},"System.Text.Json",").",[15,93,95],{"id":94},"_1-first-log","1. First log",[20,97,101],{"className":98,"code":99,"language":100,"meta":25,"style":25},"language-csharp shiki shiki-themes github-light","using OzaLog;\n\nLOG.Info_Log(\"Hello, OzaLog!\");\n","csharp",[27,102,103,108,115],{"__ignoreMap":25},[30,104,105],{"class":32,"line":33},[30,106,107],{},"using OzaLog;\n",[30,109,111],{"class":32,"line":110},2,[30,112,114],{"emptyLinePlaceholder":113},true,"\n",[30,116,118],{"class":32,"line":117},3,[30,119,120],{},"LOG.Info_Log(\"Hello, OzaLog!\");\n",[56,122,123,124,131],{},"That's it — ",[77,125,126,127,130],{},"no ",[27,128,129],{},"Configure"," call required",". The first write auto-initializes with defaults. Log file appears at:",[20,133,138],{"className":134,"code":136,"language":137},[135],"language-text","{your-app-folder}\u002Flogs\u002F{yyyyMMdd}\u002FLogFiles\u002FInfo_Log.txt\n","text",[27,139,136],{"__ignoreMap":25},[15,141,143],{"id":142},"_2-all-log-levels","2. All log levels",[20,145,147],{"className":98,"code":146,"language":100,"meta":25,"style":25},"LOG.Trace_Log(\"for tracing\");\nLOG.Debug_Log(\"for debugging\");\nLOG.Info_Log(\"for general info\");\nLOG.Warn_Log(\"for warnings\");\nLOG.Error_Log(\"for errors\");     \u002F\u002F auto immediate flush\nLOG.Fatal_Log(\"for fatal errors\"); \u002F\u002F auto immediate flush\n",[27,148,149,154,159,164,170,176],{"__ignoreMap":25},[30,150,151],{"class":32,"line":33},[30,152,153],{},"LOG.Trace_Log(\"for tracing\");\n",[30,155,156],{"class":32,"line":110},[30,157,158],{},"LOG.Debug_Log(\"for debugging\");\n",[30,160,161],{"class":32,"line":117},[30,162,163],{},"LOG.Info_Log(\"for general info\");\n",[30,165,167],{"class":32,"line":166},4,[30,168,169],{},"LOG.Warn_Log(\"for warnings\");\n",[30,171,173],{"class":32,"line":172},5,[30,174,175],{},"LOG.Error_Log(\"for errors\");     \u002F\u002F auto immediate flush\n",[30,177,179],{"class":32,"line":178},6,[30,180,181],{},"LOG.Fatal_Log(\"for fatal errors\"); \u002F\u002F auto immediate flush\n",[15,183,185,186],{"id":184},"_3-per-symbol-files-with-customname_log","3. Per-symbol files with ",[27,187,188],{},"CustomName_Log",[56,190,191],{},"Common in trading scenarios — route each symbol's logs to a dedicated file:",[20,193,195],{"className":98,"code":194,"language":100,"meta":25,"style":25},"LOG.CustomName_Log(\"BTC\", \"tick 67890.12\");\nLOG.CustomName_Log(\"ETH\", \"tick 3567.45\");\n\u002F\u002F → BTC_Log.txt, ETH_Log.txt under {logs}\u002F{yyyyMMdd}\u002FLogFiles\u002F\n",[27,196,197,202,207],{"__ignoreMap":25},[30,198,199],{"class":32,"line":33},[30,200,201],{},"LOG.CustomName_Log(\"BTC\", \"tick 67890.12\");\n",[30,203,204],{"class":32,"line":110},[30,205,206],{},"LOG.CustomName_Log(\"ETH\", \"tick 3567.45\");\n",[30,208,209],{"class":32,"line":117},[30,210,211],{},"\u002F\u002F → BTC_Log.txt, ETH_Log.txt under {logs}\u002F{yyyyMMdd}\u002FLogFiles\u002F\n",[15,213,215],{"id":214},"_4-log-an-object-as-json","4. Log an object as JSON",[20,217,219],{"className":98,"code":218,"language":100,"meta":25,"style":25},"var quote = new { Symbol = \"BTCUSDT\", Price = 67890.12m, Volume = 1234m };\nLOG.Info_Log(quote);\nLOG.Info_Log(\"market snapshot\", quote);  \u002F\u002F with header message\n",[27,220,221,226,231],{"__ignoreMap":25},[30,222,223],{"class":32,"line":33},[30,224,225],{},"var quote = new { Symbol = \"BTCUSDT\", Price = 67890.12m, Volume = 1234m };\n",[30,227,228],{"class":32,"line":110},[30,229,230],{},"LOG.Info_Log(quote);\n",[30,232,233],{"class":32,"line":117},[30,234,235],{},"LOG.Info_Log(\"market snapshot\", quote);  \u002F\u002F with header message\n",[56,237,238,239,241],{},"The object is auto-serialized via ",[27,240,90],{},".",[15,243,245],{"id":244},"_5-log-an-exception","5. Log an exception",[20,247,249],{"className":98,"code":248,"language":100,"meta":25,"style":25},"try { \u002F* ... *\u002F }\ncatch (Exception ex)\n{\n    LOG.Error_Log(\"operation failed\", ex);\n}\n",[27,250,251,256,261,266,271],{"__ignoreMap":25},[30,252,253],{"class":32,"line":33},[30,254,255],{},"try { \u002F* ... *\u002F }\n",[30,257,258],{"class":32,"line":110},[30,259,260],{},"catch (Exception ex)\n",[30,262,263],{"class":32,"line":117},[30,264,265],{},"{\n",[30,267,268],{"class":32,"line":166},[30,269,270],{},"    LOG.Error_Log(\"operation failed\", ex);\n",[30,272,273],{"class":32,"line":172},[30,274,275],{},"}\n",[56,277,278,279,62,282,62,285,62,288,291],{},"Exceptions are expanded into a structured JSON with ",[27,280,281],{},"Type",[27,283,284],{},"Message",[27,286,287],{},"StackTrace",[27,289,290],{},"InnerException",", reflected non-standard properties.",[293,294],"hr",{},[15,296,298],{"id":297},"_6-configure-one-time-optional","6. Configure (one-time, optional)",[20,300,302],{"className":98,"code":301,"language":100,"meta":25,"style":25},"LOG.Configure(o =>\n{\n    o.KeepDays = -7;\n    o.SetFileSizeInMB(50);\n    o.EnableConsoleOutput = true;\n});\n",[27,303,304,309,313,318,323,328],{"__ignoreMap":25},[30,305,306],{"class":32,"line":33},[30,307,308],{},"LOG.Configure(o =>\n",[30,310,311],{"class":32,"line":110},[30,312,265],{},[30,314,315],{"class":32,"line":117},[30,316,317],{},"    o.KeepDays = -7;\n",[30,319,320],{"class":32,"line":166},[30,321,322],{},"    o.SetFileSizeInMB(50);\n",[30,324,325],{"class":32,"line":172},[30,326,327],{},"    o.EnableConsoleOutput = true;\n",[30,329,330],{"class":32,"line":178},[30,331,332],{},"});\n",[56,334,335,340,341,346],{},[77,336,337,339],{},[27,338,129],{}," is not re-entrant"," — call it exactly once at startup. See ",[342,343,345],"a",{"href":344},".\u002Fconfiguration","Configuration"," for the full option list.",[293,348],{},[15,350,352],{"id":351},"_7-v31-ndjson-output","7. v3.1: NDJSON output",[20,354,356],{"className":98,"code":355,"language":100,"meta":25,"style":25},"LOG.Configure(o =>\n{\n    o.OutputFormat = LogOutputFormat.Json;   \u002F\u002F emit NDJSON instead of plain text\n});\n\nLOG.Info_Log(\"price update\");\n",[27,357,358,362,366,371,375,379],{"__ignoreMap":25},[30,359,360],{"class":32,"line":33},[30,361,308],{},[30,363,364],{"class":32,"line":110},[30,365,265],{},[30,367,368],{"class":32,"line":117},[30,369,370],{},"    o.OutputFormat = LogOutputFormat.Json;   \u002F\u002F emit NDJSON instead of plain text\n",[30,372,373],{"class":32,"line":166},[30,374,332],{},[30,376,377],{"class":32,"line":172},[30,378,114],{"emptyLinePlaceholder":113},[30,380,381],{"class":32,"line":178},[30,382,383],{},"LOG.Info_Log(\"price update\");\n",[56,385,386],{},"Result (one line per log entry):",[20,388,392],{"className":389,"code":390,"language":391,"meta":25,"style":25},"language-json shiki shiki-themes github-light","{\"ts\":1715587425123,\"lv\":\"Info\",\"nm\":\"\",\"tid\":12,\"msg\":\"price update\"}\n","json",[27,393,394],{"__ignoreMap":25},[30,395,396,400,403,406,409,412,415,417,420,422,425,427,430,432,435,437,440,442,445,447,450],{"class":32,"line":33},[30,397,399],{"class":398},"sgsFI","{",[30,401,402],{"class":50},"\"ts\"",[30,404,405],{"class":398},":",[30,407,408],{"class":50},"1715587425123",[30,410,411],{"class":398},",",[30,413,414],{"class":50},"\"lv\"",[30,416,405],{"class":398},[30,418,419],{"class":40},"\"Info\"",[30,421,411],{"class":398},[30,423,424],{"class":50},"\"nm\"",[30,426,405],{"class":398},[30,428,429],{"class":40},"\"\"",[30,431,411],{"class":398},[30,433,434],{"class":50},"\"tid\"",[30,436,405],{"class":398},[30,438,439],{"class":50},"12",[30,441,411],{"class":398},[30,443,444],{"class":50},"\"msg\"",[30,446,405],{"class":398},[30,448,449],{"class":40},"\"price update\"",[30,451,275],{"class":398},[56,453,454],{},"→ pandas \u002F DuckDB \u002F jq \u002F Grafana \u002F Elasticsearch all read NDJSON natively.",[293,456],{},[15,458,460],{"id":459},"_8-v31-custom-time-format-thread-name","8. v3.1: Custom time format & thread name",[20,462,464],{"className":98,"code":463,"language":100,"meta":25,"style":25},"LOG.Configure(o =>\n{\n    o.TimeFormat = \"yyyy-MM-dd HH:mm:ss.fff\";  \u002F\u002F free-form .NET DateTime format\n    o.ShowThreadId = true;\n    o.ShowThreadName = true;\n});\n\nThread.CurrentThread.Name = \"Worker-1\";\nLOG.Info_Log(\"doing work\");\n",[27,465,466,470,474,479,484,489,493,498,504],{"__ignoreMap":25},[30,467,468],{"class":32,"line":33},[30,469,308],{},[30,471,472],{"class":32,"line":110},[30,473,265],{},[30,475,476],{"class":32,"line":117},[30,477,478],{},"    o.TimeFormat = \"yyyy-MM-dd HH:mm:ss.fff\";  \u002F\u002F free-form .NET DateTime format\n",[30,480,481],{"class":32,"line":166},[30,482,483],{},"    o.ShowThreadId = true;\n",[30,485,486],{"class":32,"line":172},[30,487,488],{},"    o.ShowThreadName = true;\n",[30,490,491],{"class":32,"line":178},[30,492,332],{},[30,494,496],{"class":32,"line":495},7,[30,497,114],{"emptyLinePlaceholder":113},[30,499,501],{"class":32,"line":500},8,[30,502,503],{},"Thread.CurrentThread.Name = \"Worker-1\";\n",[30,505,507],{"class":32,"line":506},9,[30,508,509],{},"LOG.Info_Log(\"doing work\");\n",[56,511,512],{},"Result:",[20,514,517],{"className":515,"code":516,"language":137},[135],"2026-05-14 10:23:45.123[T:7\u002FWorker-1] doing work\n",[27,518,516],{"__ignoreMap":25},[293,520],{},[15,522,524],{"id":523},"_9-v31-quote-pipeline-hft-tickquote-data","9. v3.1: Quote pipeline (HFT tick\u002Fquote data)",[56,526,527,528,531,532,535],{},"The ",[77,529,530],{},"Quote pipeline"," is an independent async pipeline for high-frequency market data. Field names align with the Binance ",[27,533,534],{},"\u002Fapi\u002Fv3\u002Fticker\u002F24hr"," schema.",[20,537,539],{"className":98,"code":538,"language":100,"meta":25,"style":25},"LOG.Configure(o =>\n{\n    o.ConfigureQuote(q =>\n    {\n        q.Enable = true;                          \u002F\u002F ⚠ Required — Quote pipeline is opt-in\n        q.OutputFormat = QuoteOutputFormat.Json;  \u002F\u002F emit NDJSON\n        q.OnDropped = n => Console.WriteLine($\"dropped {n} quotes\");\n    });\n});\n\n\u002F\u002F Minimal tick — just the last price\nLOG.Quote(\"BTCUSDT\", \"binance_spot\", DateTime.Now.Ticks, 67890.12m);\n\n\u002F\u002F Bid + ask snapshot\nLOG.Quote(\"ETHUSDT\", \"binance_spot\", DateTime.Now.Ticks,\n          last: 3567.45m, bid: 3567.00m, ask: 3568.00m);\n\n\u002F\u002F Full ticker\nLOG.QuoteTicker(\"BTCUSDT\", \"binance_spot\", DateTime.Now.Ticks,\n                last: 67890.12m,\n                bid: 67889.0m, bidQty: 1.2m,\n                ask: 67891.0m, askQty: 0.8m,\n                open: 67500m, high: 68000m, low: 67200m,\n                volume: 12345.67m, quoteVolume: 838_000_000m);\n\n\u002F\u002F With custom fields (Extras)\nvar extras = new Dictionary\u003Cstring, object>\n{\n    [\"funding\"] = 0.0001m,\n    [\"openInterest\"] = 12_345_678m,\n};\nLOG.QuoteTicker(\"BTCUSDT\", \"binance_perp\", DateTime.Now.Ticks,\n                last: 67890.12m, extras: extras,\n                bid: 67889m, ask: 67891m);\n",[27,540,541,545,549,554,559,564,569,574,579,583,588,594,600,605,611,617,623,628,634,640,646,652,658,664,670,675,681,687,692,698,704,710,716,722],{"__ignoreMap":25},[30,542,543],{"class":32,"line":33},[30,544,308],{},[30,546,547],{"class":32,"line":110},[30,548,265],{},[30,550,551],{"class":32,"line":117},[30,552,553],{},"    o.ConfigureQuote(q =>\n",[30,555,556],{"class":32,"line":166},[30,557,558],{},"    {\n",[30,560,561],{"class":32,"line":172},[30,562,563],{},"        q.Enable = true;                          \u002F\u002F ⚠ Required — Quote pipeline is opt-in\n",[30,565,566],{"class":32,"line":178},[30,567,568],{},"        q.OutputFormat = QuoteOutputFormat.Json;  \u002F\u002F emit NDJSON\n",[30,570,571],{"class":32,"line":495},[30,572,573],{},"        q.OnDropped = n => Console.WriteLine($\"dropped {n} quotes\");\n",[30,575,576],{"class":32,"line":500},[30,577,578],{},"    });\n",[30,580,581],{"class":32,"line":506},[30,582,332],{},[30,584,586],{"class":32,"line":585},10,[30,587,114],{"emptyLinePlaceholder":113},[30,589,591],{"class":32,"line":590},11,[30,592,593],{},"\u002F\u002F Minimal tick — just the last price\n",[30,595,597],{"class":32,"line":596},12,[30,598,599],{},"LOG.Quote(\"BTCUSDT\", \"binance_spot\", DateTime.Now.Ticks, 67890.12m);\n",[30,601,603],{"class":32,"line":602},13,[30,604,114],{"emptyLinePlaceholder":113},[30,606,608],{"class":32,"line":607},14,[30,609,610],{},"\u002F\u002F Bid + ask snapshot\n",[30,612,614],{"class":32,"line":613},15,[30,615,616],{},"LOG.Quote(\"ETHUSDT\", \"binance_spot\", DateTime.Now.Ticks,\n",[30,618,620],{"class":32,"line":619},16,[30,621,622],{},"          last: 3567.45m, bid: 3567.00m, ask: 3568.00m);\n",[30,624,626],{"class":32,"line":625},17,[30,627,114],{"emptyLinePlaceholder":113},[30,629,631],{"class":32,"line":630},18,[30,632,633],{},"\u002F\u002F Full ticker\n",[30,635,637],{"class":32,"line":636},19,[30,638,639],{},"LOG.QuoteTicker(\"BTCUSDT\", \"binance_spot\", DateTime.Now.Ticks,\n",[30,641,643],{"class":32,"line":642},20,[30,644,645],{},"                last: 67890.12m,\n",[30,647,649],{"class":32,"line":648},21,[30,650,651],{},"                bid: 67889.0m, bidQty: 1.2m,\n",[30,653,655],{"class":32,"line":654},22,[30,656,657],{},"                ask: 67891.0m, askQty: 0.8m,\n",[30,659,661],{"class":32,"line":660},23,[30,662,663],{},"                open: 67500m, high: 68000m, low: 67200m,\n",[30,665,667],{"class":32,"line":666},24,[30,668,669],{},"                volume: 12345.67m, quoteVolume: 838_000_000m);\n",[30,671,673],{"class":32,"line":672},25,[30,674,114],{"emptyLinePlaceholder":113},[30,676,678],{"class":32,"line":677},26,[30,679,680],{},"\u002F\u002F With custom fields (Extras)\n",[30,682,684],{"class":32,"line":683},27,[30,685,686],{},"var extras = new Dictionary\u003Cstring, object>\n",[30,688,690],{"class":32,"line":689},28,[30,691,265],{},[30,693,695],{"class":32,"line":694},29,[30,696,697],{},"    [\"funding\"] = 0.0001m,\n",[30,699,701],{"class":32,"line":700},30,[30,702,703],{},"    [\"openInterest\"] = 12_345_678m,\n",[30,705,707],{"class":32,"line":706},31,[30,708,709],{},"};\n",[30,711,713],{"class":32,"line":712},32,[30,714,715],{},"LOG.QuoteTicker(\"BTCUSDT\", \"binance_perp\", DateTime.Now.Ticks,\n",[30,717,719],{"class":32,"line":718},33,[30,720,721],{},"                last: 67890.12m, extras: extras,\n",[30,723,725],{"class":32,"line":724},34,[30,726,727],{},"                bid: 67889m, ask: 67891m);\n",[56,729,730,731,734],{},"Output files (one per ",[27,732,733],{},"{bucket}_{symbol}"," pair):",[20,736,739],{"className":737,"code":738,"language":137},[135],"logs\u002F20260514\u002FQuotes\u002Fbinance_spot_BTCUSDT_Quote.json\nlogs\u002F20260514\u002FQuotes\u002Fbinance_spot_ETHUSDT_Quote.json\nlogs\u002F20260514\u002FQuotes\u002Fbinance_perp_BTCUSDT_Quote.json\n",[27,740,738],{"__ignoreMap":25},[56,742,743],{},"Each line is one NDJSON record:",[20,745,747],{"className":389,"code":746,"language":391,"meta":25,"style":25},"{\"ts\":1715587425123,\"symbol\":\"BTCUSDT\",\"bucket\":\"binance_spot\",\"last\":67890.12,\"bid\":67889.0,\"ask\":67891.0,\"extras\":{\"funding\":0.0001}}\n",[27,748,749],{"__ignoreMap":25},[30,750,751,753,755,757,759,761,764,766,769,771,774,776,779,781,784,786,789,791,794,796,799,801,804,806,809,811,814,817,820,822,825],{"class":32,"line":33},[30,752,399],{"class":398},[30,754,402],{"class":50},[30,756,405],{"class":398},[30,758,408],{"class":50},[30,760,411],{"class":398},[30,762,763],{"class":50},"\"symbol\"",[30,765,405],{"class":398},[30,767,768],{"class":40},"\"BTCUSDT\"",[30,770,411],{"class":398},[30,772,773],{"class":50},"\"bucket\"",[30,775,405],{"class":398},[30,777,778],{"class":40},"\"binance_spot\"",[30,780,411],{"class":398},[30,782,783],{"class":50},"\"last\"",[30,785,405],{"class":398},[30,787,788],{"class":50},"67890.12",[30,790,411],{"class":398},[30,792,793],{"class":50},"\"bid\"",[30,795,405],{"class":398},[30,797,798],{"class":50},"67889.0",[30,800,411],{"class":398},[30,802,803],{"class":50},"\"ask\"",[30,805,405],{"class":398},[30,807,808],{"class":50},"67891.0",[30,810,411],{"class":398},[30,812,813],{"class":50},"\"extras\"",[30,815,816],{"class":398},":{",[30,818,819],{"class":50},"\"funding\"",[30,821,405],{"class":398},[30,823,824],{"class":50},"0.0001",[30,826,827],{"class":398},"}}\n",[293,829],{},[15,831,833],{"id":832},"next-steps","Next steps",[835,836,837,843,850],"ul",{},[838,839,840,842],"li",{},[342,841,345],{"href":344}," — full options table",[838,844,845,849],{},[342,846,848],{"href":847},".\u002Fapi","API Reference"," — every public method, struct, and enum",[838,851,852,856],{},[342,853,855],{"href":854},".\u002Fasync-pipeline","HFT Async Architecture"," — internal pipeline design",[56,858,859],{},"Top-level pages (use the site navigation):",[835,861,862,868,878],{},[838,863,864,867],{},[77,865,866],{},"Benchmarks"," — OzaLog vs ZLogger \u002F ZeroLog \u002F Serilog",[838,869,870,873,874,877],{},[77,871,872],{},"Migration from v2.x"," — for upgrading ",[27,875,876],{},"Ozakboy.NLOG"," users",[838,879,880,883],{},[77,881,882],{},"Changelog"," — version history",[885,886,887],"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 .s7eDp, html code.shiki .s7eDp{--shiki-default:#6F42C1}",{"title":25,"searchDepth":110,"depth":117,"links":889},[890,891,892,893,895,896,897,898,899,900,901],{"id":17,"depth":110,"text":18},{"id":94,"depth":110,"text":95},{"id":142,"depth":110,"text":143},{"id":184,"depth":110,"text":894},"3. Per-symbol files with CustomName_Log",{"id":214,"depth":110,"text":215},{"id":244,"depth":110,"text":245},{"id":297,"depth":110,"text":298},{"id":351,"depth":110,"text":352},{"id":459,"depth":110,"text":460},{"id":523,"depth":110,"text":524},{"id":832,"depth":110,"text":833},"Install OzaLog v3.1 and write your first log line in under a minute. Includes Quote pipeline.","md",{},"\u002Fen\u002Fgetting-started",{"title":6,"description":902},"en\u002Fgetting-started","xn3259JCkmIN6bCPJ-zxCFgwBU-J6YqBlmkeQ_3dhqw",{"matched":910,"target":905,"all":911},"path()",null,1778734456053]