XenoAtom.Logging is a high-performance logging library for .NET, designed to be simple, efficient, and flexible. It supports structured logging, multiple sinks (e.g., console, file, network), and is highly optimized for minimal overhead in production environments.
Paths/commands below are relative to this directory.
- Library:
src/XenoAtom.Logging/ - Tests:
src/XenoAtom.Logging.Tests/(MSTest) - Docs to keep in sync with behavior:
readme.mdand the docs undersite/docs/(e.g.,site/docs/**/*.md)
# from the project root (this folder)
cd src
dotnet build -c Release
dotnet test -c Release
cd ../site
lunet buildAll tests must pass and docs must be updated before submitting.
- Keep diffs focused; avoid drive-by refactors/formatting and unnecessary dependencies.
- Follow existing patterns and naming; prefer clarity over cleverness.
- New/changed behavior requires tests; bug fix = regression test first, then fix.
- All public APIs require XML docs (avoid CS1591) and should document thrown exceptions.
- Naming:
PascalCasepublic/types/namespaces,camelCaselocals/params,_camelCaseprivate fields,I*interfaces. - Style: file-scoped namespaces;
usingoutside namespace (Systemfirst);varwhen the type is obvious. - Nullability: enabled — respect annotations; use
ArgumentNullException.ThrowIfNull(); preferis null/is not null; don't suppress warnings without a justification comment. - Exceptions: validate inputs early; throw specific exceptions (e.g.,
ArgumentException/ArgumentNullException) with meaningful messages. - Async:
Asyncsuffix; noasync void(except event handlers); useConfigureAwait(false)in library code; considerValueTask<T>on hot paths.
- Minimize allocations (
Span<T>,stackalloc,ArrayPool<T>,StringBuilderin loops). - Keep code AOT/trimmer-friendly: avoid reflection; prefer source generators; use
[DynamicallyAccessedMembers]when reflection is unavoidable. - Use
sealedfor non-inheritable classes; preferReadOnlySpan<char>for parsing.
- Follow .NET guidelines; keep APIs small and hard to misuse.
- Prefer overloads over optional parameters (binary compatibility); consider
Try*methods alongside throwing versions. - Mark APIs
[Obsolete("message", error: false)]before removal.
- Commits: commit after each self-contained logical step; imperative subject, < 72 chars; one logical change per commit; reference issues when relevant; don't delete unrelated local files.
- Checklist: each self-contained step is committed; build+tests pass; docs updated if behavior changed; public APIs have XML docs; changes covered by unit tests.