diff --git a/Build.ps1 b/Build.ps1 index 0515652..1178d7c 100644 --- a/Build.ps1 +++ b/Build.ps1 @@ -1,29 +1,35 @@ +Write-Output "build: Build started" + Push-Location $PSScriptRoot -if(Test-Path .\artifacts) { Remove-Item .\artifacts -Force -Recurse } +if(Test-Path .\artifacts) { + Write-Output "build: Cleaning .\artifacts" + Remove-Item .\artifacts -Force -Recurse +} -& dotnet restore --no-cache +$branch = @{ $true = $env:APPVEYOR_REPO_BRANCH; $false = $(git symbolic-ref --short -q HEAD) }[$NULL -ne $env:APPVEYOR_REPO_BRANCH]; +$revision = @{ $true = "{0:00000}" -f [convert]::ToInt32("0" + $env:APPVEYOR_BUILD_NUMBER, 10); $false = "local" }[$NULL -ne $env:APPVEYOR_BUILD_NUMBER]; +$suffix = @{ $true = ""; $false = "$($branch.Substring(0, [math]::Min(10,$branch.Length)))-$revision"}[$branch -eq "main" -and $revision -ne "local"] +$commitHash = $(git rev-parse --short HEAD) +$buildSuffix = @{ $true = "$($suffix)-$($commitHash)"; $false = "$($branch)-$($commitHash)" }[$suffix -ne ""] -$branch = @{ $true = $env:APPVEYOR_REPO_BRANCH; $false = $(git symbolic-ref --short -q HEAD) }[$env:APPVEYOR_REPO_BRANCH -ne $NULL]; -$revision = @{ $true = "{0:00000}" -f [convert]::ToInt32("0" + $env:APPVEYOR_BUILD_NUMBER, 10); $false = "local" }[$env:APPVEYOR_BUILD_NUMBER -ne $NULL]; -$suffix = @{ $true = ""; $false = "$branch-$revision"}[$branch -eq "master" -and $revision -ne "local"] +Write-Output "build: Package version suffix is $suffix" +Write-Output "build: Build version suffix is $buildSuffix" -foreach ($src in ls src/Serilog.*) { - Push-Location $src +& dotnet build --configuration Release --version-suffix=$buildSuffix /p:ContinuousIntegrationBuild=true - & dotnet pack -c Release -o ..\..\.\artifacts --version-suffix=$suffix - if($LASTEXITCODE -ne 0) { exit 1 } +if($LASTEXITCODE -ne 0) { throw 'build failed' } - Pop-Location +if($suffix) { + & dotnet pack src\Serilog.Formatting.Compact --configuration Release --no-build --no-restore -o artifacts --version-suffix=$suffix +} else { + & dotnet pack src\Serilog.Formatting.Compact --configuration Release --no-build --no-restore -o artifacts } -foreach ($test in ls test/Serilog.*.Tests) { - Push-Location $test +if($LASTEXITCODE -ne 0) { throw 'pack failed' } - & dotnet test -c Release - if($LASTEXITCODE -ne 0) { exit 2 } +Write-Output "build: Testing" - Pop-Location -} +& dotnet test test\Serilog.Formatting.Compact.Tests --configuration Release --no-build --no-restore -Pop-Location +if($LASTEXITCODE -ne 0) { throw 'unit tests failed' } diff --git a/CHANGES.md b/CHANGES.md index e69de29..10983ba 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -0,0 +1,2 @@ +supported targets: netstandard2.0, net6.0 +updated packages in test proj \ No newline at end of file diff --git a/README.md b/README.md index d291a49..730bd41 100644 --- a/README.md +++ b/README.md @@ -140,14 +140,15 @@ See `test/Serilog.Formatting.Compact.Tests/FormattingBenchmarks.cs`. |:------------------------------ |----------: |---------: |------: | | `JsonFormatter` | 11.2775 µs | 0.0682 µs | 1.00 | | `CompactJsonFormatter` | 6.0315 µs | 0.0429 µs | 0.53 | -| `RenderedJsonFormatter` | 13.7585 µs | 0.1194 µs | 1.22 | +| `JsonFormatter(renderMessage: true)` | 13.7585 µs | 0.1194 µs | 1.22 | | `RenderedCompactJsonFormatter` | 7.0680 µs | 0.0605 µs | 0.63 | ### Tools Several tools are available for working with the CLEF format. + * **[_Analogy.LogViewer.Serilog_](https://github.com/Analogy-LogViewer/Analogy.LogViewer.Serilog)** - CLEF parser for [Analogy Log Viewer](https://github.com/Analogy-LogViewer/Analogy.LogViewer) * **[`clef-tool`](https://github.com/datalust/clef-tool)** - a CLI application for processing CLEF files - * **[Compact Log Format Viewer](https://github.com/warrenbuckley/Compact-Log-Format-Viewer)** - a cross-platform viewer for CLEF JSON files - * **[_Serilog.Formatting.Compact.Reader_](https://github.com/serilog/serilog-formatting-compact-reader)** - convert CLEF JSON documents back into Serilog `LogEvent`s - + * **[Compact Log Format Viewer](https://github.com/warrenbuckley/Compact-Log-Format-Viewer)** - a cross-platform viewer for CLEF files + * **[`seqcli`](https://github.com/datalust/seqcli)** - pretty-`print` CLEF files at the command-line, or `ingest` CLEF files into [Seq](https://datalust.co/seq) for search, and analysis + * **[_Serilog.Formatting.Compact.Reader_](https://github.com/serilog/serilog-formatting-compact-reader)** - convert CLEF documents back into Serilog `LogEvent`s diff --git a/appveyor.yml b/appveyor.yml index 699d563..b2e8553 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,18 +1,18 @@ version: '{build}' skip_tags: true -image: Visual Studio 2019 +image: Visual Studio 2022 configuration: Release install: - ps: ./Setup.ps1 build_script: - ps: ./Build.ps1 -test: off +test: false artifacts: - path: artifacts/Serilog.*.nupkg deploy: - provider: NuGet api_key: - secure: ptRAVPZZO/hlZUv5e/yLnHF7aAh8tQmBfvLt64Qrvhoe7I/mbbPNI6RYm92g5EzG + secure: 4nUKbHgmKmedr6dDtCT2uWVLeQl+tFqO+y9LvRi3nk7cvD/DnOYI1ZqajsgDqxnH skip_symbols: true on: branch: /^(master|dev)$/ diff --git a/assets/serilog-extension-nuget.png b/assets/serilog-extension-nuget.png new file mode 100644 index 0000000..1dfe430 Binary files /dev/null and b/assets/serilog-extension-nuget.png differ diff --git a/global.json b/global.json index 2223a05..8960f9e 100644 --- a/global.json +++ b/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "3.0.100" + "version": "7.0.304" } } \ No newline at end of file diff --git a/src/Serilog.Formatting.Compact/Formatting/Compact/CompactJsonFormatter.cs b/src/Serilog.Formatting.Compact/Formatting/Compact/CompactJsonFormatter.cs index e2ead70..992740c 100644 --- a/src/Serilog.Formatting.Compact/Formatting/Compact/CompactJsonFormatter.cs +++ b/src/Serilog.Formatting.Compact/Formatting/Compact/CompactJsonFormatter.cs @@ -13,11 +13,13 @@ // limitations under the License. using System; +using System.Globalization; using System.IO; using System.Linq; using Serilog.Events; using Serilog.Formatting.Json; using Serilog.Parsing; +// ReSharper disable MemberCanBePrivate.Global namespace Serilog.Formatting.Compact { @@ -76,12 +78,12 @@ public static void FormatEvent(LogEvent logEvent, TextWriter output, JsonValueFo { output.Write(",\"@r\":["); var delim = ""; - foreach (var r in tokensWithFormat) + foreach (PropertyToken r in tokensWithFormat) { output.Write(delim); delim = ","; var space = new StringWriter(); - r.Render(logEvent.Properties, space); + r.Render(logEvent.Properties, space, CultureInfo.InvariantCulture); JsonValueFormatter.WriteQuotedJsonString(space.ToString(), output); } output.Write(']'); @@ -100,6 +102,20 @@ public static void FormatEvent(LogEvent logEvent, TextWriter output, JsonValueFo JsonValueFormatter.WriteQuotedJsonString(logEvent.Exception.ToString(), output); } + if (logEvent.TraceId != null) + { + output.Write(",\"@tr\":\""); + output.Write(logEvent.TraceId.Value.ToHexString()); + output.Write('\"'); + } + + if (logEvent.SpanId != null) + { + output.Write(",\"@sp\":\""); + output.Write(logEvent.SpanId.Value.ToHexString()); + output.Write('\"'); + } + foreach (var property in logEvent.Properties) { var name = property.Key; diff --git a/src/Serilog.Formatting.Compact/Formatting/Compact/RenderedCompactJsonFormatter.cs b/src/Serilog.Formatting.Compact/Formatting/Compact/RenderedCompactJsonFormatter.cs index d76ecbf..fbe0dd2 100644 --- a/src/Serilog.Formatting.Compact/Formatting/Compact/RenderedCompactJsonFormatter.cs +++ b/src/Serilog.Formatting.Compact/Formatting/Compact/RenderedCompactJsonFormatter.cs @@ -13,9 +13,11 @@ // limitations under the License. using System; +using System.Globalization; using System.IO; using Serilog.Events; using Serilog.Formatting.Json; +// ReSharper disable MemberCanBePrivate.Global namespace Serilog.Formatting.Compact { @@ -63,11 +65,11 @@ public static void FormatEvent(LogEvent logEvent, TextWriter output, JsonValueFo output.Write("{\"@t\":\""); output.Write(logEvent.Timestamp.UtcDateTime.ToString("O")); output.Write("\",\"@m\":"); - var message = logEvent.MessageTemplate.Render(logEvent.Properties); + var message = logEvent.MessageTemplate.Render(logEvent.Properties, CultureInfo.InvariantCulture); JsonValueFormatter.WriteQuotedJsonString(message, output); output.Write(",\"@i\":\""); var id = EventIdHash.Compute(logEvent.MessageTemplate.Text); - output.Write(id.ToString("x8")); + output.Write(id.ToString("x8",CultureInfo.InvariantCulture)); output.Write('"'); if (logEvent.Level != LogEventLevel.Information) @@ -82,7 +84,21 @@ public static void FormatEvent(LogEvent logEvent, TextWriter output, JsonValueFo output.Write(",\"@x\":"); JsonValueFormatter.WriteQuotedJsonString(logEvent.Exception.ToString(), output); } + + if (logEvent.TraceId != null) + { + output.Write(",\"@tr\":\""); + output.Write(logEvent.TraceId.Value.ToHexString()); + output.Write('\"'); + } + if (logEvent.SpanId != null) + { + output.Write(",\"@sp\":\""); + output.Write(logEvent.SpanId.Value.ToHexString()); + output.Write('\"'); + } + foreach (var property in logEvent.Properties) { var name = property.Key; diff --git a/src/Serilog.Formatting.Compact/Serilog.Formatting.Compact.csproj b/src/Serilog.Formatting.Compact/Serilog.Formatting.Compact.csproj index 0d477cd..06def8b 100644 --- a/src/Serilog.Formatting.Compact/Serilog.Formatting.Compact.csproj +++ b/src/Serilog.Formatting.Compact/Serilog.Formatting.Compact.csproj @@ -1,30 +1,36 @@ - - A simple, compact JSON-based event format for Serilog. - 1.1.0 - Serilog Contributors - net452;netstandard1.1;netstandard2.0 - true - true - Serilog.Formatting.Compact - ../../assets/Serilog.snk - true - true - Serilog.Formatting.Compact - serilog;json - http://serilog.net/images/serilog-extension-nuget.png - https://github.com/serilog/serilog-formatting-compact - Apache-2.0 - + + A simple, compact JSON-based event format for Serilog. + 2.0.0 + Serilog Contributors + net462;net471 + $(TargetFrameworks);netstandard2.0;netstandard2.1;net6.0;net7.0 + true + true + ../../assets/Serilog.snk + true + true + serilog-extension-nuget.png + serilog;json + https://github.com/serilog/serilog-formatting-compact + Apache-2.0 + True + https://github.com/serilog/serilog-formatting-compact + git + 6.0-recommended + Serilog + README.md + - - - + + 5 + - - - - + + + + + diff --git a/test/Serilog.Formatting.Compact.Tests/CompactJsonFormatterTests.cs b/test/Serilog.Formatting.Compact.Tests/CompactJsonFormatterTests.cs index e5c06ba..bfc4371 100644 --- a/test/Serilog.Formatting.Compact.Tests/CompactJsonFormatterTests.cs +++ b/test/Serilog.Formatting.Compact.Tests/CompactJsonFormatterTests.cs @@ -1,7 +1,11 @@ using System; +using System.Diagnostics; +using System.Linq; using Newtonsoft.Json.Linq; +using Serilog.Events; using Xunit; using Serilog.Formatting.Compact.Tests.Support; +using Serilog.Parsing; namespace Serilog.Formatting.Compact.Tests @@ -77,5 +81,18 @@ public void TimestampIsUtc() Assert.True(jobject.TryGetValue("@t", out val)); Assert.EndsWith("Z", val.ToObject()); } + + [Fact] + public void TraceAndSpanIdsGenerateValidJson() + { + var traceId = ActivityTraceId.CreateRandom(); + var spanId = ActivitySpanId.CreateRandom(); + var evt = new LogEvent(DateTimeOffset.Now, LogEventLevel.Information, null, + new MessageTemplate(Enumerable.Empty()), Enumerable.Empty(), + traceId, spanId); + var json = AssertValidJson(log => log.Write(evt)); + Assert.Equal(traceId.ToHexString(), json["@tr"]); + Assert.Equal(spanId.ToHexString(), json["@sp"]); + } } } diff --git a/test/Serilog.Formatting.Compact.Tests/FormattingBenchmarks.cs b/test/Serilog.Formatting.Compact.Tests/FormattingBenchmarks.cs index fa2cc5c..b637c11 100644 --- a/test/Serilog.Formatting.Compact.Tests/FormattingBenchmarks.cs +++ b/test/Serilog.Formatting.Compact.Tests/FormattingBenchmarks.cs @@ -30,7 +30,7 @@ public FormattingBenchmarks() StringWriter _buffer; - [Setup] + [GlobalSetup] public void InitBuffer() { _buffer = new StringWriter(); diff --git a/test/Serilog.Formatting.Compact.Tests/FormattingBenchmarksConfig.cs b/test/Serilog.Formatting.Compact.Tests/FormattingBenchmarksConfig.cs index 33f0f7c..b0bcddd 100644 --- a/test/Serilog.Formatting.Compact.Tests/FormattingBenchmarksConfig.cs +++ b/test/Serilog.Formatting.Compact.Tests/FormattingBenchmarksConfig.cs @@ -7,7 +7,7 @@ public class FormattingBenchmarksConfig : ManualConfig { public FormattingBenchmarksConfig() { - this.Add(Job.Default.WithTargetCount(new Count(10))); + this.AddJob(Job.Default.WithIterationCount(10)); } } } \ No newline at end of file diff --git a/test/Serilog.Formatting.Compact.Tests/Serilog.Formatting.Compact.Tests.csproj b/test/Serilog.Formatting.Compact.Tests/Serilog.Formatting.Compact.Tests.csproj index 594962b..6a3a324 100644 --- a/test/Serilog.Formatting.Compact.Tests/Serilog.Formatting.Compact.Tests.csproj +++ b/test/Serilog.Formatting.Compact.Tests/Serilog.Formatting.Compact.Tests.csproj @@ -1,30 +1,29 @@ - + - - net452;netcoreapp2.1 - Serilog.Formatting.Compact.Tests - ../../assets/Serilog.snk - true - true - false - true - + + net462;net48 + $(TargetFrameworks);netcoreapp3.1;net6.0;net7.0; + Serilog.Formatting.Compact.Tests + ../../assets/Serilog.snk + true + true + false + true + - - - - - - - + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + - - - - - - - - + + +