Releases: ozakboy/OzaLog
v3.1.0
v3.1.0 — Custom time/thread display, multi-format output, Quote pipeline
Three new capabilities: customizable time/thread display, configurable output format (txt/log/json), and a dedicated Quote pipeline for high-frequency tick/quote data with Binance-aligned schema. All additions are backward compatible — defaults preserve v3.0 behavior.
Added
Customizable Time & Thread Display
LogOptions.TimeFormat(default"HH:mm:ss.fff") — free-form .NET DateTime format string for the message prefix. Falls back to default on parse failure.LogOptions.ShowThreadId(defaulttrue) andLogOptions.ShowThreadName(defaultfalse) — independently toggle thread ID / name in the prefix. WhenShowThreadName=truebut the calling thread has no name (Thread.Name == null), the entire thread segment is omitted.LogOptions.HighPrecisionTimestamp(defaultfalse) — opt-inStopwatch-hybrid mode that reconstructs µs-level precision from the 1ms cache; raises caller-side ticks read cost from ~5ns to ~30ns.
Multiple Output Formats
LogOptions.OutputFormat(defaultLogOutputFormat.Txt) — global format selector:Txt/Log(same content, different extension) /Json(NDJSON with fixed schema{ts, lv, nm, tid?, tn?, msg, data?}).- JSON timestamps emit as epoch_ms integers. Field names use short forms (
lv,nm,tid,tn) for compactness.
Quote (Tick/Ticker) Pipeline
LOG.Quote(...)andLOG.QuoteTicker(...)— public API for high-frequency quote/ticker data with field names aligned to Binance REST 24hr Ticker schema (Last,LastQty,Bid,BidQty,Ask,AskQty,Open,PrevClose,High,Low,Volume,QuoteVolume).QuoteRecord(publicreadonly struct) — A2 core API for zero-allocation enqueue. Convenience A1 overloads for the common cases (tick only / bid+ask / full ticker / ticker+extras).QuoteOptions(opt-in viaopt.ConfigureQuote(q => q.Enable = true), default off) — independent async pipeline with its own dispatcher, queue, andFileStreamPool. ConfigurableOutputFormat(Txt/Log/Json),MaxOpenStreams(default 500),MaxQueueSize(default 50000),MaxBatchSize,FlushIntervalMs,OnDropped(long)callback.QuoteRecord.Extras(IReadOnlyDictionary<string, object>) for flexible attributes andQuoteRecord.ExtrasJson(raw pre-serialized JSON string for the zero-overhead path) — mutually exclusive; setting both throwsArgumentExceptionat the call site.- File naming:
{baseDir}/{LogPath}/{yyyyMMdd}/{QuotePath}/{Bucket}_{Symbol}_Quote.{ext}— no nested subdirectories. - Symbol/bucket sanitization: file-system-invalid characters (
/ \ : * ? " < > |) are automatically replaced with-in filenames; the original symbol/bucket text is preserved in the file content.
Tests
- Four new xUnit test files covering custom time formats, NDJSON formatting, Quote schema/error scenarios, and filename sanitization (48 tests total, all passing).
OzaLog.Test/Program.csrewritten to a comprehensive v3.1 smoke-test covering every API surface and error path in a single linear run, with optional CLI args for format selection (txt/log/json).
Improved
LogItemcarriesThreadNameso the dispatcher thread can render the calling thread's name (previously unavailable post-enqueue).- All Quote API overloads funnel through
LOG.Quote(in QuoteRecord)for centralized validation. Errors (null/empty Symbol or Bucket,Extras/ExtrasJsonboth set,Extraskey colliding with a reserved field) throwArgumentExceptionsynchronously on the calling thread — not deferred to the dispatcher. LogFormatterretains a fast path for the defaultHH:mm:ss.fffformat (hand-written, zero-allocation); other formats route throughDateTime.ToStringwithFormatExceptionfallback to default.FileStreamPoolsupports per-output extension (.txt/.log/.json) with corresponding part-detection logic for size-based file splitting.
Technical
System.Text.Json: bumped from8.0.5→9.0.16fornetstandard2.0/netstandard2.1targets (net8.0/net9.0/net10.0still use the BCL built-in — zero NuGet dependencies).Microsoft.SourceLink.GitHub: bumped from8.0.0→10.0.300(build-only,PrivateAssets=all, no consumer impact).- New internal types:
JsonLogFormatter,QuoteFormatter,QuoteFileStreamPool,QuoteLogHandler. Quote pipeline runs entirely in parallel with the mainAsyncLogHandler— they share no locks or stream pools. - Build verified across all 5 TargetFrameworks (
netstandard2.0/netstandard2.1/net8.0/net9.0/net10.0) with 0 errors.
📦 NuGet: https://www.nuget.org/packages/OzaLog/3.1.0
📖 Full changelog: https://github.com/ozakboy/OzaLog/blob/main/docs/en/changelog.md
🌐 Website: https://ozakboy.github.io/OzaLog/
v3.0.1
v3.0.1 — Metadata + repository improvements release
No library code changes — the OzaLog assembly is byte-identical to v3.0.0 (Deterministic build). Safe to upgrade with no compatibility risk.
🚀 Improved
- NuGet package metadata refreshed:
- Cleaner
DescriptionhighlightingLOG.Info_Log("...")API + HFT pipeline + zero dependencies + crypto tick stream use case - Updated
PackageTags: addedozalog,hft,high-performance,zero-dependency; removed misleadingnlogtag - Polished
Title
- Cleaner
PackageReleaseNotesnow uses absolute GitHub URLs for cross-references (NuGet doesn't render relative paths).
🛠️ Technical
- New project website: Nuxt 4 + @nuxt/content + Tailwind CSS, deployed to GitHub Pages → https://ozakboy.github.io/OzaLog/
- Repository documentation restructured: all user-facing docs moved to
docs/{en,zh-TW}/bilingual tree (changelog.md,migration.md, plus templates forgetting-started.md,configuration.md,api.md,async-pipeline.md,benchmarks.md). - GitHub Actions auto-deploys site on push to
main. - Sponsor page added (USDT BEP20 wallet + Binance Pay QR).
uplogrelease flow extended: now also creates GitHub Release and pushes to NuGet.org automatically.
📦 Install
dotnet add package OzaLog --version 3.0.1🌐 Documentation
- Full changelog: docs/en/changelog.md · docs/zh-TW/changelog.md
- Migration from v2.x: docs/en/migration.md · docs/zh-TW/migration.md
- Website: https://ozakboy.github.io/OzaLog/
Disclaimer: OzaLog is not related to NLog (jkowalski's package). The previous version Ozakboy.NLOG was deprecated and renamed to OzaLog in v3.0 to avoid confusion.
v3.0.0
v3.0.0 — Major release: package rename + HFT-grade rewrite
Ozakboy.NLOGv2.x is now deprecated. Future development happens on OzaLog.
See migration guide (繁中: 升級指南).
⚠️ Breaking Changes
- Package renamed:
Ozakboy.NLOG→OzaLog. The previous package on NuGet is deprecated and points here. - Namespace renamed:
ozakboy.LOG→OzaLog. Allusingstatements in consumer code must be updated. - Removed TargetFrameworks: dropped
.NET Framework 4.6.2,net6.0,net7.0(all EOL). Now supportsnetstandard2.0,netstandard2.1,net8.0,net9.0,net10.0. - Enum typo fixed:
LogLevel.CostomName→LogLevel.CustomName. The public methodLOG.CustomName_Log(...)was already correctly named — only the underlying enum value was renamed.
✨ Added
- HFT-grade async pipeline:
ConcurrentQueue<struct LogItem>+ persistent FileStream pool + 1ms cached timestamp + drop-oldest backpressure. - New
LogOptions:EnableGlobalExceptionCapture(defaultfalse) — opt-in subscription toAppDomain.UnhandledExceptionandTaskScheduler.UnobservedTaskException, auto-logs at Fatal level.MaxOpenFileStreams(default100) — LRU upper bound.DiskFlushIntervalMs(default100) — periodic flush interval for persistent FileStreams.OnDropped(defaultnull) — callback invoked when the async queue drops the oldest item under backpressure.
- xUnit test project (
OzaLog.Tests/) covering concurrency, LRU, day rollover, backpressure, GlobalExceptionCapture toggle, and format correctness. - BenchmarkDotNet project (
OzaLog.Benchmarks/) comparing OzaLog with ZLogger, ZeroLog, and Serilog.
🚀 Improved
- Zero NuGet dependencies on
net8.0/net9.0/net10.0(System.Text.Json built into BCL). - Formatting work moved off the calling thread — callers only enqueue raw tuples, no
string.Formaton the hot path. - Persistent FileStreams eliminate per-batch open/close, reducing syscall cost to near-zero.
- Day rollover handled inline in the dispatcher.
- Expired-log cleanup moved to a background timer (was on the hot path in v2.x).
🐛 Fixed
- Double-format bug in
LOG.cswhereConsole.WriteLine(formattedMessage, args)could throwFormatExceptionif the formatted message coincidentally contained{0}-style tokens. - Auto-flush level selection —
ErrorandFatalnow correctly trigger immediate flush regardless of the caller'simmediateFlushargument.
🛠️ Technical
LogItemchanged from class toreadonly struct— zero GC on the hot path.- Build verified across all 5 TargetFrameworks with 0 warnings / 0 errors.
📦 Install
dotnet add package OzaLog --version 3.0.0🌐 Documentation
- Full changelog: docs/en/changelog.md · docs/zh-TW/changelog.md
- Migration from v2.x: docs/en/migration.md · docs/zh-TW/migration.md
- Website: https://ozakboy.github.io/OzaLog/
Disclaimer: OzaLog is not related to NLog (jkowalski's package). The naming similarity in the previous version (Ozakboy.NLOG) caused confusion — v3.0 renames to OzaLog to make this unambiguous.
Version 2.1.0
1.新增 中英文備註
2.新增 英文介紹
Full Changelog: v2.0.0...v2.1.0
Version 2.0.0
重大更新
-
新增異步日誌系統
- 新增異步日誌處理器 (AsyncLogHandler)
- 提供智能批次處理機制
- 可配置的隊列管理系統
- 優化記憶體使用效率
-
新增配置系統
- 新增 LogConfiguration 完整配置系統
- 提供唯讀配置介面(ILogOptions)
- 支援動態配置調整
- 新增異步配置選項(AsyncLogOptions)
-
日誌檔案管理優化
- 改進檔案分割機制
- 支援自定義目錄結構
- 智能檔案命名系統
- 改進日誌清理機制
-
主要新增功能
- 建立配置系統
- 控制台輸出選擇
- 同步/非同步寫入模式
- 完整的執行緒安全設計
重要說明
- 建議在應用程式啟動時進行配置
- 異步模式為預設模式,可提供更好的效能
- 升級時請注意配置系統的變更
- 建議查看完整文檔以了解所有新功能
- 方法名稱異動 CostomName_Log =>CustomName_Log
未來展望
- 計劃加入更多日誌格式支援
- 新增更多自定義選項
變更日誌
Version v1.2.1
-
調整框架支援版本
- 刪除 .NET Core 3.1 支援
- 新增 .NET 8.0 支援
- 降低框架需求至 .NET Framework 4.6.2
-
優化 System.Text.Json 版本需求
- .NET Framework 4.6.2:使用 System.Text.Json 8.0.5
- .NET Standard 2.0/2.1:使用 System.Text.Json 6.0.10
- .NET 6.0/7.0/8.0:使用 System.Text.Json 8.0.5
-
改善例外處理機制
- 強化例外資訊序列化功能
- 完整記錄內部例外(InnerException)資訊
- 新增例外額外屬性的序列化支援
- 優化例外堆疊追蹤的格式化輸出
- 自動處理例外物件的循環參考問題
-
修正多執行緒環境下的日誌寫入問題
-
優化大型物件序列化效能
Version 1.1.6
- 新增 .NET Standard 的支援
- 向下支援 .net Framework 的應用
Version 1.1.2
- 針對 .net 7 支援
Version 1.1.1
- 新增 超過最大檔案大小自動分割檔案
- 新增 可以不寫 txt 純寫 Console
Version 1.0.1
1.修正超過7天 檔案沒有被刪除的問題