From f430663e5873eea3a179b151480e1f5a6e8e97bc Mon Sep 17 00:00:00 2001 From: Nicholas Blumhardt Date: Mon, 15 Jan 2018 08:54:09 +1000 Subject: [PATCH 01/23] Dev version bump [Skip CI] --- src/Serilog.Sinks.Seq/Serilog.Sinks.Seq.csproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Serilog.Sinks.Seq/Serilog.Sinks.Seq.csproj b/src/Serilog.Sinks.Seq/Serilog.Sinks.Seq.csproj index 00867df..e3e3d8d 100644 --- a/src/Serilog.Sinks.Seq/Serilog.Sinks.Seq.csproj +++ b/src/Serilog.Sinks.Seq/Serilog.Sinks.Seq.csproj @@ -2,9 +2,9 @@ Serilog sink that writes to the Seq log server over HTTP/HTTPS. - 4.0.0 + 4.0.1 Serilog Contributors - Copyright © Serilog Contributors 2013-2017 + Copyright © Serilog Contributors 2013-2018 netstandard1.1;netstandard1.3;net45 true true From 4cfde9257515db215209fca7e5f042687fbd96fb Mon Sep 17 00:00:00 2001 From: Simon Cropp Date: Thu, 12 Apr 2018 14:58:21 +1000 Subject: [PATCH 02/23] fix link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8578941..dcb363b 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ Then query log event properties like `ContactId` from the browser: ![Query in Seq](https://nblumhardt.github.io/images/seq-sink-screenshot.png) -When the application shuts down, [ensure any buffered events are propertly flushed to Seq](http://blog.merbla.com/2016/07/06/serilog-log-closeandflush/) by disposing the logger or calling `Log.CloseAndFlush()`: +When the application shuts down, [ensure any buffered events are propertly flushed to Seq](https://merbla.com/2016/07/06/serilog-log-closeandflush/) by disposing the logger or calling `Log.CloseAndFlush()`: ```csharp Log.CloseAndFlush(); From 9fe533663448c5ca799c4bb3d3e57c9ca6ed302b Mon Sep 17 00:00:00 2001 From: Matthew Erbs Date: Wed, 9 May 2018 15:48:58 +1000 Subject: [PATCH 03/23] New NuGet API Key --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index 7e5f9b5..71f05e3 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -12,7 +12,7 @@ artifacts: deploy: - provider: NuGet api_key: - secure: nvZ/z+pMS91b3kG4DgfES5AcmwwGoBYQxr9kp4XiJHj25SAlgdIxFx++1N0lFH2x + secure: bd9z4P73oltOXudAjPehwp9iDKsPtC+HbgshOrSgoyQKr5xVK+bxJQngrDJkHdY8 skip_symbols: true on: branch: /^(master|dev)$/ From 666b1a6e1018d6016cb972b38a577dcb0a532cf8 Mon Sep 17 00:00:00 2001 From: Mason McGlothlin Date: Sat, 21 Jul 2018 13:53:57 -0500 Subject: [PATCH 04/23] Added appsettings.json example for Seq dynamic log level switch --- README.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/README.md b/README.md index dcb363b..95de55a 100644 --- a/README.md +++ b/README.md @@ -130,6 +130,28 @@ The equivalent configuration in XML (Serilog 2.6+) is: ``` +The equivalent configuration in JSON is: + +```json +{ + "Serilog": + { + "LevelSwitches": { "$controlSwitch": "Information" }, + "MinimumLevel": { "ControlledBy": "$controlSwitch" }, + "WriteTo": + [{ + "Name": "Seq", + "Args": + { + "serverUrl": "http://localhost:5341", + "apiKey": "yeEZyL3SMcxEKUijBjN", + "controlLevelSwitch": "$controlSwitch" + } + }] + } +} +``` + For further information see the [Seq documentation](http://docs.getseq.net/docs/using-serilog#dynamic-level-control). ### Compact event format From e11048bbce7502d3d0b88ed17cca0aefaaa69ceb Mon Sep 17 00:00:00 2001 From: Maxime Rouiller Date: Fri, 21 Sep 2018 11:16:15 -0400 Subject: [PATCH 05/23] fixing repository url --- src/Serilog.Sinks.Seq/Serilog.Sinks.Seq.csproj | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Serilog.Sinks.Seq/Serilog.Sinks.Seq.csproj b/src/Serilog.Sinks.Seq/Serilog.Sinks.Seq.csproj index e3e3d8d..85b1faf 100644 --- a/src/Serilog.Sinks.Seq/Serilog.Sinks.Seq.csproj +++ b/src/Serilog.Sinks.Seq/Serilog.Sinks.Seq.csproj @@ -18,6 +18,8 @@ https://serilog.net/images/serilog-sink-seq-nuget.png https://github.com/serilog/serilog-sinks-seq http://www.apache.org/licenses/LICENSE-2.0 + https://github.com/serilog/serilog-sinks-seq + git true From a3ded0fdd818b1b8aa82e741e250aa277b9891af Mon Sep 17 00:00:00 2001 From: Nicholas Blumhardt Date: Sat, 1 Jun 2019 07:31:21 +1000 Subject: [PATCH 06/23] Fixed URLs, updated package image link --- README.md | 10 +++++----- assets/search-by-property.png | Bin 0 -> 145329 bytes 2 files changed, 5 insertions(+), 5 deletions(-) create mode 100644 assets/search-by-property.png diff --git a/README.md b/README.md index 95de55a..3b6fedb 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ # Serilog.Sinks.Seq [![Build status](https://ci.appveyor.com/api/projects/status/t7qdv68pej6inukl/branch/master?svg=true)](https://ci.appveyor.com/project/serilog/serilog-sinks-seq/branch/master) [![NuGet](https://img.shields.io/nuget/v/Serilog.Sinks.Seq.svg)](https://nuget.org/packages/serilog.sinks.seq) [![Join the chat at https://gitter.im/serilog/serilog](https://img.shields.io/gitter/room/serilog/serilog.svg)](https://gitter.im/serilog/serilog) -A Serilog sink that writes events to the [Seq](https://getseq.net) structured log server. Supports .NET 4.5+, .NET Core, and platforms compatible with the [.NET Platform Standard](https://github.com/dotnet/corefx/blob/master/Documentation/architecture/net-platform-standard.md) 1.1 including Windows 8 & UWP, Windows Phone and Xamarin. +A Serilog sink that writes events to the [Seq](https://datalust.co/seq) structured log server. Supports .NET 4.5+, .NET Core, and platforms compatible with the [.NET Platform Standard](https://github.com/dotnet/corefx/blob/master/Documentation/architecture/net-platform-standard.md) 1.1 including Windows 8 & UWP, Windows Phone and Xamarin. -[![Package Logo](http://serilog.net/images/serilog-sink-seq-nuget.png)](http://nuget.org/packages/serilog.sinks.seq) +[Package Logo](https://nuget.org/packages/serilog.sinks.seq) ### Getting started @@ -36,7 +36,7 @@ When the application shuts down, [ensure any buffered events are propertly flush Log.CloseAndFlush(); ``` -The sink can take advantage of Seq's [API keys](http://docs.getseq.net/docs/api-keys) to authenticate clients and dynamically attach properties to events at the server-side. To use an API key, specify it in the `apiKey` parameter of `WriteTo.Seq()`. +The sink can take advantage of Seq's [API keys](https://docs.datalust.co/docs/api-keys) to authenticate clients and dynamically attach properties to events at the server-side. To use an API key, specify it in the `apiKey` parameter of `WriteTo.Seq()`. ### XML `` configuration @@ -152,7 +152,7 @@ The equivalent configuration in JSON is: } ``` -For further information see the [Seq documentation](http://docs.getseq.net/docs/using-serilog#dynamic-level-control). +For further information see the [Seq documentation](https://docs.datalust.co/docs/using-serilog#dynamic-level-control). ### Compact event format @@ -198,5 +198,5 @@ Serilog.Debugging.SelfLog.Enable(message => { * Turn on the Serilog `SelfLog` as described above to check for connectivity problems and other issues on the client side. * Make sure your application calls `Log.CloseAndFlush()`, or disposes the root `Logger`, before it exits - otherwise, buffered events may be lost. * If your app is a Windows console application, it is also important to close the console window by exiting the app; Windows console apps are terminated "hard" if the close button in the title bar is used, so events buffered for sending to Seq may be lost if you use it. - * [Raise an issue](https://github.com/serilog/serilog-sinks-seq/issues), ask for help on the [Seq support forum](http://docs.getseq.net/discuss) or email **support@getseq.net**. + * [Raise an issue](https://github.com/serilog/serilog-sinks-seq/issues), ask for help on the [Seq support forum](http://docs.datalust.co/discuss) or email **support@datalust.co**. diff --git a/assets/search-by-property.png b/assets/search-by-property.png new file mode 100644 index 0000000000000000000000000000000000000000..e609e4a54dcb172923abb3a488f2efdbc996cd26 GIT binary patch literal 145329 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αiSG< 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 Date: Sat, 1 Jun 2019 07:32:53 +1000 Subject: [PATCH 07/23] New screenshot link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3b6fedb..8794f25 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ Log.Error("Failed to log on user {ContactId}", contactId); Then query log event properties like `ContactId` from the browser: -![Query in Seq](https://nblumhardt.github.io/images/seq-sink-screenshot.png) +![Query in Seq](https://raw.githubusercontent.com/serilog/serilog-sinks-seq/dev/assets/search-by-property.png) When the application shuts down, [ensure any buffered events are propertly flushed to Seq](https://merbla.com/2016/07/06/serilog-log-closeandflush/) by disposing the logger or calling `Log.CloseAndFlush()`: From 599214af2b4598ad6c7eae42a40b1aa197f8389e Mon Sep 17 00:00:00 2001 From: Nicholas Blumhardt Date: Sat, 1 Jun 2019 07:35:29 +1000 Subject: [PATCH 08/23] Support link is HTTPS --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8794f25..9c73c30 100644 --- a/README.md +++ b/README.md @@ -198,5 +198,5 @@ Serilog.Debugging.SelfLog.Enable(message => { * Turn on the Serilog `SelfLog` as described above to check for connectivity problems and other issues on the client side. * Make sure your application calls `Log.CloseAndFlush()`, or disposes the root `Logger`, before it exits - otherwise, buffered events may be lost. * If your app is a Windows console application, it is also important to close the console window by exiting the app; Windows console apps are terminated "hard" if the close button in the title bar is used, so events buffered for sending to Seq may be lost if you use it. - * [Raise an issue](https://github.com/serilog/serilog-sinks-seq/issues), ask for help on the [Seq support forum](http://docs.datalust.co/discuss) or email **support@datalust.co**. + * [Raise an issue](https://github.com/serilog/serilog-sinks-seq/issues), ask for help on the [Seq support forum](https://docs.datalust.co/discuss) or email **support@datalust.co**. From 25f0f1e47b006449bce613600bb09dab7760cf78 Mon Sep 17 00:00:00 2001 From: Nicholas Blumhardt Date: Thu, 17 Oct 2019 14:48:20 +1000 Subject: [PATCH 09/23] Add a netstandard2.0 target to clean up deps --- appveyor.yml | 2 +- serilog-sinks-seq.sln.DotSettings | 3 +++ src/Serilog.Sinks.Seq/Serilog.Sinks.Seq.csproj | 18 +++++++++++++----- .../Serilog.Sinks.Seq.Tests.csproj | 2 +- 4 files changed, 18 insertions(+), 7 deletions(-) create mode 100644 serilog-sinks-seq.sln.DotSettings diff --git a/appveyor.yml b/appveyor.yml index 71f05e3..6ed2adc 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,6 +1,6 @@ version: '{build}' skip_tags: true -image: Visual Studio 2017 +image: Visual Studio 2019 configuration: Release install: - ps: mkdir -Force ".\build\" | Out-Null diff --git a/serilog-sinks-seq.sln.DotSettings b/serilog-sinks-seq.sln.DotSettings new file mode 100644 index 0000000..5a900e9 --- /dev/null +++ b/serilog-sinks-seq.sln.DotSettings @@ -0,0 +1,3 @@ + + True + True \ No newline at end of file diff --git a/src/Serilog.Sinks.Seq/Serilog.Sinks.Seq.csproj b/src/Serilog.Sinks.Seq/Serilog.Sinks.Seq.csproj index 85b1faf..6eb8888 100644 --- a/src/Serilog.Sinks.Seq/Serilog.Sinks.Seq.csproj +++ b/src/Serilog.Sinks.Seq/Serilog.Sinks.Seq.csproj @@ -4,8 +4,8 @@ Serilog sink that writes to the Seq log server over HTTP/HTTPS. 4.0.1 Serilog Contributors - Copyright © Serilog Contributors 2013-2018 - netstandard1.1;netstandard1.3;net45 + Copyright © Serilog Contributors 2013-2019 + netstandard1.1;netstandard1.3;net45;netstandard2.0 true true Serilog.Sinks.Seq @@ -26,6 +26,10 @@ $(DefineConstants);DURABLE;THREADING_TIMER + + + $(DefineConstants);DURABLE;THREADING_TIMER + $(DefineConstants);DURABLE;THREADING_TIMER;HRESULTS @@ -36,12 +40,16 @@ - - + + - + + + + + diff --git a/test/Serilog.Sinks.Seq.Tests/Serilog.Sinks.Seq.Tests.csproj b/test/Serilog.Sinks.Seq.Tests/Serilog.Sinks.Seq.Tests.csproj index 7ea48eb..29d55e9 100644 --- a/test/Serilog.Sinks.Seq.Tests/Serilog.Sinks.Seq.Tests.csproj +++ b/test/Serilog.Sinks.Seq.Tests/Serilog.Sinks.Seq.Tests.csproj @@ -1,6 +1,6 @@  - netcoreapp1.0;net452;net46 + netcoreapp1.0;net452;net46;netcoreapp2.2 Serilog.Sinks.Seq.Tests ../../assets/Serilog.snk true From 81b089bf1a6b1fa7dd01ffa8a9e448f221a9ec94 Mon Sep 17 00:00:00 2001 From: Nicholas Blumhardt Date: Thu, 17 Oct 2019 14:48:48 +1000 Subject: [PATCH 10/23] Bump minor version to reflect added target --- src/Serilog.Sinks.Seq/Serilog.Sinks.Seq.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Serilog.Sinks.Seq/Serilog.Sinks.Seq.csproj b/src/Serilog.Sinks.Seq/Serilog.Sinks.Seq.csproj index 6eb8888..233aceb 100644 --- a/src/Serilog.Sinks.Seq/Serilog.Sinks.Seq.csproj +++ b/src/Serilog.Sinks.Seq/Serilog.Sinks.Seq.csproj @@ -2,7 +2,7 @@ Serilog sink that writes to the Seq log server over HTTP/HTTPS. - 4.0.1 + 4.1.0 Serilog Contributors Copyright © Serilog Contributors 2013-2019 netstandard1.1;netstandard1.3;net45;netstandard2.0 From 5282ccd8abafaba6f60c8188677843a24bf70216 Mon Sep 17 00:00:00 2001 From: Nicholas Blumhardt Date: Thu, 17 Oct 2019 15:30:20 +1000 Subject: [PATCH 11/23] NuGet.org API key --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index 6ed2adc..9d8d93c 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -12,7 +12,7 @@ artifacts: deploy: - provider: NuGet api_key: - secure: bd9z4P73oltOXudAjPehwp9iDKsPtC+HbgshOrSgoyQKr5xVK+bxJQngrDJkHdY8 + secure: RvDIxqzjq8qHsdFmR0SEZ/74b/1NsOaRUxDioL9MqtjrETHCATtygFexwefkn8rS skip_symbols: true on: branch: /^(master|dev)$/ From 0c8422ec720835897e58062868c98bf04c52374b Mon Sep 17 00:00:00 2001 From: Nicholas Blumhardt Date: Sun, 16 Feb 2020 20:31:07 +1000 Subject: [PATCH 12/23] Update to use the newer PeriodicBatchingSink API; general code refresh --- .../.idea/contentModel.xml | 149 ++++++++++++++++++ .../.idea/indexLayout.xml | 8 + .../.idea.serilog-sinks-seq/.idea/modules.xml | 8 + .../.idea/projectSettingsUpdater.xml | 6 + .../.idea/workspace.xml | 120 ++++++++++++++ .idea/.idea.serilog-sinks-seq/riderModule.iml | 14 ++ appveyor.yml | 1 - sample/Sample/Program.cs | 2 +- sample/Sample/Properties/AssemblyInfo.cs | 23 --- sample/Sample/Sample.csproj | 8 +- serilog-sinks-seq.sln | 1 - serilog-sinks-seq.sln.DotSettings | 7 + .../SeqLoggerConfigurationExtensions.cs | 28 ++-- .../Serilog.Sinks.Seq.csproj | 18 ++- .../Sinks/Seq/Durable/DurableSeqSink.cs | 4 +- .../Sinks/Seq/Durable/HttpLogShipper.cs | 4 +- src/Serilog.Sinks.Seq/Sinks/Seq/SeqApi.cs | 5 +- .../Sinks/Seq/SeqPayloadFormatter.cs | 113 +++++++++++++ src/Serilog.Sinks.Seq/Sinks/Seq/SeqSink.cs | 121 ++------------ ...nkTests.cs => SeqPayloadFormatterTests.cs} | 10 +- .../Serilog.Sinks.Seq.Tests.csproj | 4 +- 21 files changed, 481 insertions(+), 173 deletions(-) create mode 100644 .idea/.idea.serilog-sinks-seq/.idea/contentModel.xml create mode 100644 .idea/.idea.serilog-sinks-seq/.idea/indexLayout.xml create mode 100644 .idea/.idea.serilog-sinks-seq/.idea/modules.xml create mode 100644 .idea/.idea.serilog-sinks-seq/.idea/projectSettingsUpdater.xml create mode 100644 .idea/.idea.serilog-sinks-seq/.idea/workspace.xml create mode 100644 .idea/.idea.serilog-sinks-seq/riderModule.iml delete mode 100644 sample/Sample/Properties/AssemblyInfo.cs create mode 100644 src/Serilog.Sinks.Seq/Sinks/Seq/SeqPayloadFormatter.cs rename test/Serilog.Sinks.Seq.Tests/{SeqSinkTests.cs => SeqPayloadFormatterTests.cs} (72%) diff --git a/.idea/.idea.serilog-sinks-seq/.idea/contentModel.xml b/.idea/.idea.serilog-sinks-seq/.idea/contentModel.xml new file mode 100644 index 0000000..0cd74bc --- /dev/null +++ b/.idea/.idea.serilog-sinks-seq/.idea/contentModel.xml @@ -0,0 +1,149 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/.idea.serilog-sinks-seq/.idea/indexLayout.xml b/.idea/.idea.serilog-sinks-seq/.idea/indexLayout.xml new file mode 100644 index 0000000..27ba142 --- /dev/null +++ b/.idea/.idea.serilog-sinks-seq/.idea/indexLayout.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/.idea.serilog-sinks-seq/.idea/modules.xml b/.idea/.idea.serilog-sinks-seq/.idea/modules.xml new file mode 100644 index 0000000..ee1649d --- /dev/null +++ b/.idea/.idea.serilog-sinks-seq/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/.idea.serilog-sinks-seq/.idea/projectSettingsUpdater.xml b/.idea/.idea.serilog-sinks-seq/.idea/projectSettingsUpdater.xml new file mode 100644 index 0000000..7515e76 --- /dev/null +++ b/.idea/.idea.serilog-sinks-seq/.idea/projectSettingsUpdater.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/.idea.serilog-sinks-seq/.idea/workspace.xml b/.idea/.idea.serilog-sinks-seq/.idea/workspace.xml new file mode 100644 index 0000000..7c78d20 --- /dev/null +++ b/.idea/.idea.serilog-sinks-seq/.idea/workspace.xml @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/.idea.serilog-sinks-seq/riderModule.iml b/.idea/.idea.serilog-sinks-seq/riderModule.iml deleted file mode 100644 index 52eead3..0000000 --- a/.idea/.idea.serilog-sinks-seq/riderModule.iml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file From 93da3305fee235944ee4a393012324caefc75708 Mon Sep 17 00:00:00 2001 From: Nicholas Blumhardt Date: Mon, 17 Feb 2020 08:08:15 +1000 Subject: [PATCH 14/23] Since these changes rely on WriteTo.Conditional() from Serilog 2.9, we need a major version bump --- src/Serilog.Sinks.Seq/Serilog.Sinks.Seq.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Serilog.Sinks.Seq/Serilog.Sinks.Seq.csproj b/src/Serilog.Sinks.Seq/Serilog.Sinks.Seq.csproj index ec18024..91c86ea 100644 --- a/src/Serilog.Sinks.Seq/Serilog.Sinks.Seq.csproj +++ b/src/Serilog.Sinks.Seq/Serilog.Sinks.Seq.csproj @@ -2,7 +2,7 @@ Serilog sink that writes to the Seq log server over HTTP/HTTPS. - 4.1.0 + 5.0.0 Serilog Contributors Copyright © Serilog Contributors 2013-2020 netstandard1.1;netstandard1.3;net45;netstandard2.0;netcoreapp3.1 From d41766123738ebcd874283aae064a6c10b3091f8 Mon Sep 17 00:00:00 2001 From: Nicholas Blumhardt Date: Mon, 17 Feb 2020 09:37:48 +1000 Subject: [PATCH 15/23] Retire support for the raw payload format --- serilog-sinks-seq.sln.DotSettings | 5 +- .../SeqLoggerConfigurationExtensions.cs | 15 +- .../Serilog.Sinks.Seq.csproj | 1 + .../Sinks/Seq/Audit/SeqAuditSink.cs | 42 +---- .../Sinks/Seq/Durable/DurableSeqSink.cs | 8 +- .../Sinks/Seq/Durable/FileSet.cs | 21 ++- .../Sinks/Seq/Durable/HttpLogShipper.cs | 153 +++++++++--------- .../Sinks/Seq/Durable/PayloadReader.cs | 57 ++++++- .../Sinks/Seq/RawJsonFormatter.cs | 120 -------------- src/Serilog.Sinks.Seq/Sinks/Seq/SeqApi.cs | 1 + .../Sinks/Seq/SeqPayloadFormatter.cs | 35 +--- src/Serilog.Sinks.Seq/Sinks/Seq/SeqSink.cs | 18 +-- .../Durable/PayloadReaderTests.cs | 31 +++- .../RawJsonFormatterTests.cs | 69 -------- .../Resources/ThreeBufferedEvents.clef.txt | 3 + .../SeqPayloadFormatterTests.cs | 16 -- .../Serilog.Sinks.Seq.Tests.csproj | 6 +- 17 files changed, 205 insertions(+), 396 deletions(-) delete mode 100644 src/Serilog.Sinks.Seq/Sinks/Seq/RawJsonFormatter.cs delete mode 100644 test/Serilog.Sinks.Seq.Tests/RawJsonFormatterTests.cs create mode 100644 test/Serilog.Sinks.Seq.Tests/Resources/ThreeBufferedEvents.clef.txt diff --git a/serilog-sinks-seq.sln.DotSettings b/serilog-sinks-seq.sln.DotSettings index e094088..6a9f366 100644 --- a/serilog-sinks-seq.sln.DotSettings +++ b/serilog-sinks-seq.sln.DotSettings @@ -4,7 +4,10 @@ True True True + True + True True True True - True \ No newline at end of file + True + True \ No newline at end of file diff --git a/src/Serilog.Sinks.Seq/SeqLoggerConfigurationExtensions.cs b/src/Serilog.Sinks.Seq/SeqLoggerConfigurationExtensions.cs index 527a75b..42826d0 100644 --- a/src/Serilog.Sinks.Seq/SeqLoggerConfigurationExtensions.cs +++ b/src/Serilog.Sinks.Seq/SeqLoggerConfigurationExtensions.cs @@ -58,9 +58,6 @@ public static class SeqLoggerConfigurationExtensions /// A soft limit for the number of bytes to use for storing failed requests. /// The limit is soft in that it can be exceeded by any single error payload, but in that case only that single error /// payload will be retained. - /// Use the compact log event format defined by - /// Serilog.Formatting.Compact. Has no effect on - /// durable log shipping. Requires Seq 3.3+. /// The maximum number of events that will be held in-memory while waiting to ship them to /// Seq. Beyond this limit, events will be dropped. The default is 100,000. Has no effect on /// durable log shipping. @@ -79,7 +76,6 @@ public static LoggerConfiguration Seq( LoggingLevelSwitch controlLevelSwitch = null, HttpMessageHandler messageHandler = null, long? retainedInvalidPayloadsLimitBytes = null, - bool compact = false, int queueSizeLimit = SeqSink.DefaultQueueSizeLimit) { if (loggerSinkConfiguration == null) throw new ArgumentNullException(nameof(loggerSinkConfiguration)); @@ -101,8 +97,7 @@ public static LoggerConfiguration Seq( apiKey, eventBodyLimitBytes, controlledSwitch, - messageHandler, - compact); + messageHandler); var options = new PeriodicBatchingSinkOptions { @@ -148,9 +143,6 @@ public static LoggerConfiguration Seq( /// in order to write an event to the sink. /// A Seq API key that authenticates the client to the Seq server. /// Used to construct the HttpClient that will send the log messages to Seq. - /// Use the compact log event format defined by - /// Serilog.Formatting.Compact. Has no effect on - /// durable log shipping. Requires Seq 3.3+. /// Logger configuration, allowing configuration to continue. /// A required parameter is null. public static LoggerConfiguration Seq( @@ -158,14 +150,13 @@ public static LoggerConfiguration Seq( string serverUrl, LogEventLevel restrictedToMinimumLevel = LevelAlias.Minimum, string apiKey = null, - HttpMessageHandler messageHandler = null, - bool compact = false) + HttpMessageHandler messageHandler = null) { if (loggerAuditSinkConfiguration == null) throw new ArgumentNullException(nameof(loggerAuditSinkConfiguration)); if (serverUrl == null) throw new ArgumentNullException(nameof(serverUrl)); return loggerAuditSinkConfiguration.Sink( - new SeqAuditSink(serverUrl, apiKey, messageHandler, compact), + new SeqAuditSink(serverUrl, apiKey, messageHandler), restrictedToMinimumLevel); } } diff --git a/src/Serilog.Sinks.Seq/Serilog.Sinks.Seq.csproj b/src/Serilog.Sinks.Seq/Serilog.Sinks.Seq.csproj index 91c86ea..69cbf35 100644 --- a/src/Serilog.Sinks.Seq/Serilog.Sinks.Seq.csproj +++ b/src/Serilog.Sinks.Seq/Serilog.Sinks.Seq.csproj @@ -19,6 +19,7 @@ https://github.com/serilog/serilog-sinks-seq git true + 8 diff --git a/src/Serilog.Sinks.Seq/Sinks/Seq/Audit/SeqAuditSink.cs b/src/Serilog.Sinks.Seq/Sinks/Seq/Audit/SeqAuditSink.cs index a88cc65..d61219e 100644 --- a/src/Serilog.Sinks.Seq/Sinks/Seq/Audit/SeqAuditSink.cs +++ b/src/Serilog.Sinks.Seq/Sinks/Seq/Audit/SeqAuditSink.cs @@ -29,21 +29,18 @@ sealed class SeqAuditSink : ILogEventSink, IDisposable { readonly string _apiKey; readonly HttpClient _httpClient; - readonly bool _useCompactFormat; - static readonly JsonValueFormatter JsonValueFormatter = new JsonValueFormatter(); + static readonly JsonValueFormatter JsonValueFormatter = new JsonValueFormatter("$type"); public SeqAuditSink( string serverUrl, string apiKey, - HttpMessageHandler messageHandler, - bool useCompactFormat) + HttpMessageHandler messageHandler) { if (serverUrl == null) throw new ArgumentNullException(nameof(serverUrl)); - _apiKey = apiKey; - _useCompactFormat = useCompactFormat; _httpClient = messageHandler != null ? new HttpClient(messageHandler) : new HttpClient(); _httpClient.BaseAddress = new Uri(SeqApi.NormalizeServerBaseAddress(serverUrl)); + _apiKey = apiKey; } public void Dispose() @@ -60,19 +57,11 @@ async Task EmitAsync(LogEvent logEvent) { if (logEvent == null) throw new ArgumentNullException(nameof(logEvent)); - string payload, payloadContentType; - if (_useCompactFormat) - { - payloadContentType = SeqApi.CompactLogEventFormatMimeType; - payload = FormatCompactPayload(logEvent); - } - else - { - payloadContentType = SeqApi.RawEventFormatMimeType; - payload = FormatRawPayload(logEvent); - } + var payload = new StringWriter(); + CompactJsonFormatter.FormatEvent(logEvent, payload, JsonValueFormatter); + payload.WriteLine(); - var content = new StringContent(payload, Encoding.UTF8, payloadContentType); + var content = new StringContent(payload.ToString(), Encoding.UTF8, SeqApi.CompactLogEventFormatMimeType); if (!string.IsNullOrWhiteSpace(_apiKey)) content.Headers.Add(SeqApi.ApiKeyHeaderName, _apiKey); @@ -80,22 +69,5 @@ async Task EmitAsync(LogEvent logEvent) if (!result.IsSuccessStatusCode) throw new LoggingFailedException($"Received failed result {result.StatusCode} when posting events to Seq"); } - - internal static string FormatCompactPayload(LogEvent logEvent) - { - var payload = new StringWriter(); - CompactJsonFormatter.FormatEvent(logEvent, payload, JsonValueFormatter); - payload.WriteLine(); - return payload.ToString(); - } - - internal static string FormatRawPayload(LogEvent logEvent) - { - var payload = new StringWriter(); - payload.Write("{\"Events\":["); - RawJsonFormatter.FormatContent(logEvent, payload); - payload.Write("]}"); - return payload.ToString(); - } } } diff --git a/src/Serilog.Sinks.Seq/Sinks/Seq/Durable/DurableSeqSink.cs b/src/Serilog.Sinks.Seq/Sinks/Seq/Durable/DurableSeqSink.cs index 36dfee1..8dee47f 100644 --- a/src/Serilog.Sinks.Seq/Sinks/Seq/Durable/DurableSeqSink.cs +++ b/src/Serilog.Sinks.Seq/Sinks/Seq/Durable/DurableSeqSink.cs @@ -19,6 +19,7 @@ using Serilog.Events; using System.Net.Http; using System.Text; +using Serilog.Formatting.Compact; namespace Serilog.Sinks.Seq.Durable { @@ -42,10 +43,11 @@ public DurableSeqSink( if (serverUrl == null) throw new ArgumentNullException(nameof(serverUrl)); if (bufferBaseFilename == null) throw new ArgumentNullException(nameof(bufferBaseFilename)); + var fileSet = new FileSet(bufferBaseFilename); _shipper = new HttpLogShipper( + fileSet, serverUrl, - bufferBaseFilename, apiKey, batchPostingLimit, period, @@ -58,8 +60,8 @@ public DurableSeqSink( const long individualFileSizeLimitBytes = 100L * 1024 * 1024; _sink = new LoggerConfiguration() .MinimumLevel.Verbose() - .WriteTo.File(new RawJsonFormatter(), - bufferBaseFilename + "-.json", + .WriteTo.File(new CompactJsonFormatter(), + fileSet.RollingFilePathFormat, rollingInterval: RollingInterval.Day, fileSizeLimitBytes: individualFileSizeLimitBytes, rollOnFileSizeLimit: true, diff --git a/src/Serilog.Sinks.Seq/Sinks/Seq/Durable/FileSet.cs b/src/Serilog.Sinks.Seq/Sinks/Seq/Durable/FileSet.cs index 6ae74af..4322c20 100644 --- a/src/Serilog.Sinks.Seq/Sinks/Seq/Durable/FileSet.cs +++ b/src/Serilog.Sinks.Seq/Sinks/Seq/Durable/FileSet.cs @@ -26,6 +26,8 @@ namespace Serilog.Sinks.Seq.Durable { class FileSet { + public const string RawFormatFileExtension = ".json"; + readonly string _bookmarkFilename; readonly string _candidateSearchPath; readonly string _logFolder; @@ -33,14 +35,21 @@ class FileSet const string InvalidPayloadFilePrefix = "invalid-"; + public string RollingFilePathFormat { get; } + public FileSet(string bufferBaseFilename) { if (bufferBaseFilename == null) throw new ArgumentNullException(nameof(bufferBaseFilename)); + RollingFilePathFormat = bufferBaseFilename + "-.clef"; + _bookmarkFilename = Path.GetFullPath(bufferBaseFilename + ".bookmark"); _logFolder = Path.GetDirectoryName(_bookmarkFilename); - _candidateSearchPath = Path.GetFileName(bufferBaseFilename) + "-*.json"; - _filenameMatcher = new Regex("^" + Regex.Escape(Path.GetFileName(bufferBaseFilename)) + "-(?\\d{8})(?_[0-9]{3,}){0,1}\\.json$"); + + // The extension cannot be matched here because it may be either "json" (raw format) or "clef" (compact). + _candidateSearchPath = Path.GetFileName(bufferBaseFilename) + "-*.*"; + + _filenameMatcher = new Regex("^" + Regex.Escape(Path.GetFileName(bufferBaseFilename)) + "-(?\\d{8})(?_[0-9]{3,}){0,1}\\.(json|clef)$"); } public BookmarkFile OpenBookmarkFile() @@ -59,7 +68,7 @@ public string[] GetBufferFiles() .ToArray(); } - public void CleanUpBufferFiles(long bufferSizeLimitBytes, int alwaysRetainCount) + public void CleanUpBufferFiles(long bufferSizeLimitBytes) { try { @@ -84,9 +93,9 @@ public void CleanUpInvalidPayloadFiles(long maxNumberOfBytesToRetain) try { var candidateFiles = from file in Directory.EnumerateFiles(_logFolder, $"{InvalidPayloadFilePrefix}*.json") - let candiateFileInfo = new FileInfo(file) - orderby candiateFileInfo.LastWriteTimeUtc descending - select candiateFileInfo; + let candidateFileInfo = new FileInfo(file) + orderby candidateFileInfo.LastWriteTimeUtc descending + select candidateFileInfo; DeleteExceedingCumulativeSize(candidateFiles, maxNumberOfBytesToRetain, 0); } diff --git a/src/Serilog.Sinks.Seq/Sinks/Seq/Durable/HttpLogShipper.cs b/src/Serilog.Sinks.Seq/Sinks/Seq/Durable/HttpLogShipper.cs index 2127bbd..e46571f 100644 --- a/src/Serilog.Sinks.Seq/Sinks/Seq/Durable/HttpLogShipper.cs +++ b/src/Serilog.Sinks.Seq/Sinks/Seq/Durable/HttpLogShipper.cs @@ -20,7 +20,6 @@ using System.Net; using System.Net.Http; using System.Text; -using Serilog.Core; using Serilog.Debugging; using Serilog.Events; using IOFile = System.IO.File; @@ -60,8 +59,8 @@ class HttpLogShipper : IDisposable volatile bool _unloading; public HttpLogShipper( + FileSet fileSet, string serverUrl, - string bufferBaseFilename, string apiKey, int batchPostingLimit, TimeSpan period, @@ -71,6 +70,7 @@ public HttpLogShipper( long? retainedInvalidPayloadsLimitBytes, long? bufferSizeLimitBytes) { + _fileSet = fileSet ?? throw new ArgumentNullException(nameof(fileSet)); _apiKey = apiKey; _batchPostingLimit = batchPostingLimit; _eventBodyLimitBytes = eventBodyLimitBytes; @@ -80,7 +80,6 @@ public HttpLogShipper( _bufferSizeLimitBytes = bufferSizeLimitBytes; _httpClient = messageHandler != null ? new HttpClient(messageHandler) : new HttpClient(); _httpClient.BaseAddress = new Uri(SeqApi.NormalizeServerBaseAddress(serverUrl)); - _fileSet = new FileSet(bufferBaseFilename); _timer = new PortableTimer(c => OnTick()); SetTimer(); @@ -127,90 +126,88 @@ async Task OnTick() { count = 0; - using (var bookmarkFile = _fileSet.OpenBookmarkFile()) + using var bookmarkFile = _fileSet.OpenBookmarkFile(); + var position = bookmarkFile.TryReadBookmark(); + var files = _fileSet.GetBufferFiles(); + + if (position.File == null || !IOFile.Exists(position.File)) { - var position = bookmarkFile.TryReadBookmark(); - var files = _fileSet.GetBufferFiles(); + position = new FileSetPosition(0, files.FirstOrDefault()); + } - if (position.File == null || !IOFile.Exists(position.File)) - { - position = new FileSetPosition(0, files.FirstOrDefault()); - } + string payload, mimeType; + if (position.File == null) + { + payload = PayloadReader.MakeEmptyPayload(out mimeType); + count = 0; + } + else + { + payload = PayloadReader.ReadPayload(_batchPostingLimit, _eventBodyLimitBytes, ref position, ref count, out mimeType); + } - string payload; - if (position.File == null) + if (count > 0 || _controlledSwitch.IsActive && _nextRequiredLevelCheckUtc < DateTime.UtcNow) + { + _nextRequiredLevelCheckUtc = DateTime.UtcNow.Add(RequiredLevelCheckInterval); + + var content = new StringContent(payload, Encoding.UTF8, mimeType); + if (!string.IsNullOrWhiteSpace(_apiKey)) + content.Headers.Add(SeqApi.ApiKeyHeaderName, _apiKey); + + var result = await _httpClient.PostAsync(SeqApi.BulkUploadResource, content).ConfigureAwait(false); + if (result.IsSuccessStatusCode) { - payload = PayloadReader.NoPayload; - count = 0; + _connectionSchedule.MarkSuccess(); + bookmarkFile.WriteBookmark(position); + var returned = await result.Content.ReadAsStringAsync().ConfigureAwait(false); + var minimumAcceptedLevel = SeqApi.ReadEventInputResult(returned); + _controlledSwitch.Update(minimumAcceptedLevel); } - else + else if (result.StatusCode == HttpStatusCode.BadRequest || + result.StatusCode == HttpStatusCode.RequestEntityTooLarge) { - payload = PayloadReader.ReadPayload(_batchPostingLimit, _eventBodyLimitBytes, ref position, ref count); - } + // The connection attempt was successful - the payload we sent was the problem. + _connectionSchedule.MarkSuccess(); - if (count > 0 || _controlledSwitch.IsActive && _nextRequiredLevelCheckUtc < DateTime.UtcNow) - { - _nextRequiredLevelCheckUtc = DateTime.UtcNow.Add(RequiredLevelCheckInterval); - - var content = new StringContent(payload, Encoding.UTF8, "application/json"); - if (!string.IsNullOrWhiteSpace(_apiKey)) - content.Headers.Add(SeqApi.ApiKeyHeaderName, _apiKey); - - var result = await _httpClient.PostAsync(SeqApi.BulkUploadResource, content).ConfigureAwait(false); - if (result.IsSuccessStatusCode) - { - _connectionSchedule.MarkSuccess(); - bookmarkFile.WriteBookmark(position); - var returned = await result.Content.ReadAsStringAsync().ConfigureAwait(false); - var minimumAcceptedLevel = SeqApi.ReadEventInputResult(returned); - _controlledSwitch.Update(minimumAcceptedLevel); - } - else if (result.StatusCode == HttpStatusCode.BadRequest || - result.StatusCode == HttpStatusCode.RequestEntityTooLarge) - { - // The connection attempt was successful - the payload we sent was the problem. - _connectionSchedule.MarkSuccess(); - - await DumpInvalidPayload(result, payload).ConfigureAwait(false); - - bookmarkFile.WriteBookmark(position); - } - else - { - _connectionSchedule.MarkFailure(); - SelfLog.WriteLine("Received failed HTTP shipping result {0}: {1}", result.StatusCode, - await result.Content.ReadAsStringAsync().ConfigureAwait(false)); - - if (_bufferSizeLimitBytes.HasValue) - _fileSet.CleanUpBufferFiles(_bufferSizeLimitBytes.Value, 2); - - break; - } + await DumpInvalidPayload(result, payload).ConfigureAwait(false); + + bookmarkFile.WriteBookmark(position); } - else if (position.File == null) + else { + _connectionSchedule.MarkFailure(); + SelfLog.WriteLine("Received failed HTTP shipping result {0}: {1}", result.StatusCode, + await result.Content.ReadAsStringAsync().ConfigureAwait(false)); + + if (_bufferSizeLimitBytes.HasValue) + _fileSet.CleanUpBufferFiles(_bufferSizeLimitBytes.Value); + break; } - else + } + else if (position.File == null) + { + break; + } + else + { + // For whatever reason, there's nothing waiting to send. This means we should try connecting again at the + // regular interval, so mark the attempt as successful. + _connectionSchedule.MarkSuccess(); + + // Only advance the bookmark if no other process has the + // current file locked, and its length is as we found it. + if (files.Length == 2 && files.First() == position.File && + FileIsUnlockedAndUnextended(position)) { - // For whatever reason, there's nothing waiting to send. This means we should try connecting again at the - // regular interval, so mark the attempt as successful. - _connectionSchedule.MarkSuccess(); + bookmarkFile.WriteBookmark(new FileSetPosition(0, files[1])); + } - // Only advance the bookmark if no other process has the - // current file locked, and its length is as we found it. - if (files.Length == 2 && files.First() == position.File && - FileIsUnlockedAndUnextended(position)) - { - bookmarkFile.WriteBookmark(new FileSetPosition(0, files[1])); - } - - if (files.Length > 2) - { - // By this point, we expect writers to have relinquished locks - // on the oldest file. - IOFile.Delete(files[0]); - } + if (files.Length > 2) + { + // By this point, we expect writers to have relinquished locks + // on the oldest file. + IOFile.Delete(files[0]); } } } while (count == _batchPostingLimit); @@ -221,7 +218,7 @@ async Task OnTick() SelfLog.WriteLine("Exception while emitting periodic batch from {0}: {1}", this, ex); if (_bufferSizeLimitBytes.HasValue) - _fileSet.CleanUpBufferFiles(_bufferSizeLimitBytes.Value, 2); + _fileSet.CleanUpBufferFiles(_bufferSizeLimitBytes.Value); } finally { @@ -251,10 +248,8 @@ static bool FileIsUnlockedAndUnextended(FileSetPosition position) { try { - using (var fileStream = IOFile.Open(position.File, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.Read)) - { - return fileStream.Length <= position.NextLineStart; - } + using var fileStream = IOFile.Open(position.File, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.Read); + return fileStream.Length <= position.NextLineStart; } #if HRESULTS catch (IOException ex) diff --git a/src/Serilog.Sinks.Seq/Sinks/Seq/Durable/PayloadReader.cs b/src/Serilog.Sinks.Seq/Sinks/Seq/Durable/PayloadReader.cs index e41e1db..49224bc 100644 --- a/src/Serilog.Sinks.Seq/Sinks/Seq/Durable/PayloadReader.cs +++ b/src/Serilog.Sinks.Seq/Sinks/Seq/Durable/PayloadReader.cs @@ -23,9 +23,56 @@ namespace Serilog.Sinks.Seq.Durable { static class PayloadReader { - public const string NoPayload = "{\"Events\":[]}"; + public static string ReadPayload( + int batchPostingLimit, + long? eventBodyLimitBytes, + ref FileSetPosition position, + ref int count, + out string mimeType) + { + if (position.File.EndsWith(".json")) + { + mimeType = SeqApi.RawEventFormatMimeType; + return ReadRawPayload(batchPostingLimit, eventBodyLimitBytes, ref position, ref count); + } + + mimeType = SeqApi.CompactLogEventFormatMimeType; + return ReadCompactPayload(batchPostingLimit, eventBodyLimitBytes, ref position, ref count); + } - public static string ReadPayload(int batchPostingLimit, long? eventBodyLimitBytes, ref FileSetPosition position, ref int count) + static string ReadCompactPayload(int batchPostingLimit, long? eventBodyLimitBytes, ref FileSetPosition position, ref int count) + { + var payload = new StringWriter(); + + using (var current = System.IO.File.Open(position.File, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) + { + var nextLineStart = position.NextLineStart; + while (count < batchPostingLimit && TryReadLine(current, ref nextLineStart, out var nextLine)) + { + position = new FileSetPosition(nextLineStart, position.File); + + // Count is the indicator that work was done, so advances even in the (rare) case an + // oversized event is dropped. + ++count; + + if (eventBodyLimitBytes.HasValue && Encoding.UTF8.GetByteCount(nextLine) > eventBodyLimitBytes.Value) + { + SelfLog.WriteLine( + "Event JSON representation exceeds the byte size limit of {0} and will be dropped; data: {1}", + eventBodyLimitBytes, nextLine); + } + else + { + payload.WriteLine(nextLine); + } + } + } + + return payload.ToString(); + } + + + static string ReadRawPayload(int batchPostingLimit, long? eventBodyLimitBytes, ref FileSetPosition position, ref int count) { var payload = new StringWriter(); payload.Write("{\"Events\":["); @@ -87,6 +134,12 @@ static bool TryReadLine(Stream current, ref long nextStart, out string nextLine) return true; } + + public static string MakeEmptyPayload(out string mimeType) + { + mimeType = SeqApi.CompactLogEventFormatMimeType; + return SeqApi.NoPayload; + } } } diff --git a/src/Serilog.Sinks.Seq/Sinks/Seq/RawJsonFormatter.cs b/src/Serilog.Sinks.Seq/Sinks/Seq/RawJsonFormatter.cs deleted file mode 100644 index 1c63f86..0000000 --- a/src/Serilog.Sinks.Seq/Sinks/Seq/RawJsonFormatter.cs +++ /dev/null @@ -1,120 +0,0 @@ -// Serilog.Sinks.Seq Copyright 2016 Serilog Contributors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using Serilog.Events; -using Serilog.Formatting; -using Serilog.Formatting.Json; -using Serilog.Parsing; - -namespace Serilog.Sinks.Seq -{ - // Formatter for the JSON schema accepted by Seq's /raw endpoint. - class RawJsonFormatter : ITextFormatter - { - static readonly JsonValueFormatter ValueFormatter = new JsonValueFormatter(); - - public void Format(LogEvent logEvent, TextWriter output) - { - FormatContent(logEvent, output); - output.WriteLine(); - } - - public static void FormatContent(LogEvent logEvent, TextWriter output) - { - if (logEvent == null) throw new ArgumentNullException(nameof(logEvent)); - if (output == null) throw new ArgumentNullException(nameof(output)); - - output.Write("{\"Timestamp\":\""); - output.Write(logEvent.Timestamp.ToString("o")); - output.Write("\",\"Level\":\""); - output.Write(logEvent.Level); - output.Write("\",\"MessageTemplate\":"); - JsonValueFormatter.WriteQuotedJsonString(logEvent.MessageTemplate.Text, output); - if (logEvent.Exception != null) - { - output.Write(",\"Exception\":"); - JsonValueFormatter.WriteQuotedJsonString(logEvent.Exception.ToString(), output); - } - - if (logEvent.Properties.Count != 0) - WriteProperties(logEvent.Properties, output); - - var tokensWithFormat = logEvent.MessageTemplate.Tokens - .OfType() - .Where(pt => pt.Format != null); - - if (tokensWithFormat.Any()) - WriteRenderings(tokensWithFormat.GroupBy(pt => pt.PropertyName), logEvent.Properties, output); - - output.Write('}'); - } - - static void WriteProperties(IReadOnlyDictionary properties, TextWriter output) - { - output.Write(",\"Properties\":{"); - - var precedingDelimiter = ""; - foreach (var property in properties) - { - output.Write(precedingDelimiter); - precedingDelimiter = ","; - - JsonValueFormatter.WriteQuotedJsonString(property.Key, output); - output.Write(':'); - ValueFormatter.Format(property.Value, output); - } - - output.Write('}'); - } - - static void WriteRenderings(IEnumerable> tokensWithFormat, IReadOnlyDictionary properties, TextWriter output) - { - output.Write(",\"Renderings\":{"); - - var rdelim = ""; - foreach (var ptoken in tokensWithFormat) - { - output.Write(rdelim); - rdelim = ","; - - JsonValueFormatter.WriteQuotedJsonString(ptoken.Key, output); - output.Write(":["); - - var fdelim = ""; - foreach (var format in ptoken) - { - output.Write(fdelim); - fdelim = ","; - - output.Write("{\"Format\":"); - JsonValueFormatter.WriteQuotedJsonString(format.Format, output); - - output.Write(",\"Rendering\":"); - var sw = new StringWriter(); - format.Render(properties, sw); - JsonValueFormatter.WriteQuotedJsonString(sw.ToString(), output); - output.Write('}'); - } - - output.Write(']'); - } - - output.Write('}'); - } - } -} diff --git a/src/Serilog.Sinks.Seq/Sinks/Seq/SeqApi.cs b/src/Serilog.Sinks.Seq/Sinks/Seq/SeqApi.cs index 50470be..a368b97 100644 --- a/src/Serilog.Sinks.Seq/Sinks/Seq/SeqApi.cs +++ b/src/Serilog.Sinks.Seq/Sinks/Seq/SeqApi.cs @@ -23,6 +23,7 @@ static class SeqApi public const string ApiKeyHeaderName = "X-Seq-ApiKey"; public const string RawEventFormatMimeType = "application/json"; public const string CompactLogEventFormatMimeType = "application/vnd.serilog.clef"; + public const string NoPayload = ""; // Why not use a JSON parser here? For a very small case, it's not // worth taking on the extra payload/dependency management issues that diff --git a/src/Serilog.Sinks.Seq/Sinks/Seq/SeqPayloadFormatter.cs b/src/Serilog.Sinks.Seq/Sinks/Seq/SeqPayloadFormatter.cs index 4f00e8f..15248fe 100644 --- a/src/Serilog.Sinks.Seq/Sinks/Seq/SeqPayloadFormatter.cs +++ b/src/Serilog.Sinks.Seq/Sinks/Seq/SeqPayloadFormatter.cs @@ -25,7 +25,7 @@ namespace Serilog.Sinks.Seq { static class SeqPayloadFormatter { - static readonly JsonValueFormatter JsonValueFormatter = new JsonValueFormatter(); + static readonly JsonValueFormatter JsonValueFormatter = new JsonValueFormatter("$type"); public static string FormatCompactPayload(IEnumerable events, long? eventBodyLimitBytes) { @@ -55,39 +55,6 @@ public static string FormatCompactPayload(IEnumerable events, long? ev return payload.ToString(); } - public static string FormatRawPayload(IEnumerable events, long? eventBodyLimitBytes) - { - var payload = new StringWriter(); - payload.Write("{\"Events\":["); - - var delimStart = ""; - foreach (var logEvent in events) - { - var buffer = new StringWriter(); - - try - { - RawJsonFormatter.FormatContent(logEvent, buffer); - } - catch (Exception ex) - { - LogNonFormattableEvent(logEvent, ex); - continue; - } - - var json = buffer.ToString(); - if (CheckEventBodySize(json, eventBodyLimitBytes)) - { - payload.Write(delimStart); - payload.Write(json); - delimStart = ","; - } - } - - payload.Write("]}"); - return payload.ToString(); - } - static void LogNonFormattableEvent(LogEvent logEvent, Exception ex) { SelfLog.WriteLine( diff --git a/src/Serilog.Sinks.Seq/Sinks/Seq/SeqSink.cs b/src/Serilog.Sinks.Seq/Sinks/Seq/SeqSink.cs index d83ff1d..9ea9540 100644 --- a/src/Serilog.Sinks.Seq/Sinks/Seq/SeqSink.cs +++ b/src/Serilog.Sinks.Seq/Sinks/Seq/SeqSink.cs @@ -35,7 +35,6 @@ class SeqSink : IBatchedLogEventSink, IDisposable readonly string _apiKey; readonly long? _eventBodyLimitBytes; readonly HttpClient _httpClient; - readonly bool _useCompactFormat; DateTime _nextRequiredLevelCheckUtc = DateTime.UtcNow.Add(RequiredLevelCheckInterval); readonly ControlledLevelSwitch _controlledSwitch; @@ -45,14 +44,12 @@ public SeqSink( string apiKey, long? eventBodyLimitBytes, ControlledLevelSwitch controlledSwitch, - HttpMessageHandler messageHandler, - bool useCompactFormat) + HttpMessageHandler messageHandler) { if (serverUrl == null) throw new ArgumentNullException(nameof(serverUrl)); _controlledSwitch = controlledSwitch ?? throw new ArgumentNullException(nameof(controlledSwitch)); _apiKey = apiKey; _eventBodyLimitBytes = eventBodyLimitBytes; - _useCompactFormat = useCompactFormat; _httpClient = messageHandler != null ? new HttpClient(messageHandler) : new HttpClient(); _httpClient.BaseAddress = new Uri(SeqApi.NormalizeServerBaseAddress(serverUrl)); } @@ -77,17 +74,8 @@ public async Task EmitBatchAsync(IEnumerable events) { _nextRequiredLevelCheckUtc = DateTime.UtcNow.Add(RequiredLevelCheckInterval); - string payload, payloadContentType; - if (_useCompactFormat) - { - payloadContentType = SeqApi.CompactLogEventFormatMimeType; - payload = SeqPayloadFormatter.FormatCompactPayload(events, _eventBodyLimitBytes); - } - else - { - payloadContentType = SeqApi.RawEventFormatMimeType; - payload = SeqPayloadFormatter.FormatRawPayload(events, _eventBodyLimitBytes); - } + var payloadContentType = SeqApi.CompactLogEventFormatMimeType; + var payload = SeqPayloadFormatter.FormatCompactPayload(events, _eventBodyLimitBytes); var content = new StringContent(payload, Encoding.UTF8, payloadContentType); if (!string.IsNullOrWhiteSpace(_apiKey)) diff --git a/test/Serilog.Sinks.Seq.Tests/Durable/PayloadReaderTests.cs b/test/Serilog.Sinks.Seq.Tests/Durable/PayloadReaderTests.cs index 4e7c5ba..91c4667 100644 --- a/test/Serilog.Sinks.Seq.Tests/Durable/PayloadReaderTests.cs +++ b/test/Serilog.Sinks.Seq.Tests/Durable/PayloadReaderTests.cs @@ -13,6 +13,33 @@ public class PayloadReaderTests { [Fact] public void ReadsEventsFromBufferFiles() + { + using (var tmp = new TempFolder()) + { + var fn = tmp.AllocateFilename("clef"); + var lines = IOFile.ReadAllText(Path.Combine("Resources", "ThreeBufferedEvents.clef.txt"), Encoding.UTF8).Split(new [] {'\r', '\n'}, StringSplitOptions.RemoveEmptyEntries); + using (var f = IOFile.Create(fn)) + using (var fw = new StreamWriter(f, Encoding.UTF8)) + { + foreach (var line in lines) + { + fw.WriteLine(line); + } + } + var position = new FileSetPosition(0, fn); + var count = 0; + PayloadReader.ReadPayload(1000, null, ref position, ref count, out var mimeType); + + Assert.Equal(SeqApi.CompactLogEventFormatMimeType, mimeType); + + Assert.Equal(3, count); + Assert.Equal(465 + 3 * (Environment.NewLine.Length - 1), position.NextLineStart); + Assert.Equal(fn, position.File); + } + } + + [Fact] + public void ReadsEventsFromRawBufferFiles() { using (var tmp = new TempFolder()) { @@ -28,7 +55,9 @@ public void ReadsEventsFromBufferFiles() } var position = new FileSetPosition(0, fn); var count = 0; - var payload = PayloadReader.ReadPayload(1000, null, ref position, ref count); + var payload = PayloadReader.ReadPayload(1000, null, ref position, ref count, out var mimeType); + + Assert.Equal(SeqApi.RawEventFormatMimeType, mimeType); Assert.Equal(3, count); Assert.Equal(576 + 3 * (Environment.NewLine.Length - 1), position.NextLineStart); diff --git a/test/Serilog.Sinks.Seq.Tests/RawJsonFormatterTests.cs b/test/Serilog.Sinks.Seq.Tests/RawJsonFormatterTests.cs deleted file mode 100644 index 33cba59..0000000 --- a/test/Serilog.Sinks.Seq.Tests/RawJsonFormatterTests.cs +++ /dev/null @@ -1,69 +0,0 @@ -using System; -using System.IO; -using Newtonsoft.Json.Linq; -using Xunit; -using Serilog.Sinks.Seq.Tests.Support; - -namespace Serilog.Sinks.Seq.Tests -{ - public class RawJsonFormatterTests - { - void AssertValidJson(Action act) - { - var output = new StringWriter(); - var formatter = new RawJsonFormatter(); - var log = new LoggerConfiguration() - .WriteTo.Sink(new TextWriterSink(output, formatter)) - .CreateLogger(); - - act(log); - - var json = output.ToString(); - - // Unfortunately this will not detect all JSON formatting issues; better than nothing however. - JObject.Parse(json); - } - - [Fact] - public void AnEmptyEventIsValidJson() - { - AssertValidJson(log => log.Information("No properties")); - } - - [Fact] - public void AMinimalEventIsValidJson() - { - AssertValidJson(log => log.Information("One {Property}", 42)); - } - - [Fact] - public void MultiplePropertiesAreDelimited() - { - AssertValidJson(log => log.Information("Property {First} and {Second}", "One", "Two")); - } - - [Fact] - public void ExceptionsAreFormattedToValidJson() - { - AssertValidJson(log => log.Information(new DivideByZeroException(), "With exception")); - } - - [Fact] - public void ExceptionAndPropertiesAreValidJson() - { - AssertValidJson(log => log.Information(new DivideByZeroException(), "With exception and {Property}", 42)); - } - - [Fact] - public void RenderingsAreValidJson() - { - AssertValidJson(log => log.Information("One {Rendering:x8}", 42)); - } - - [Fact] - public void MultipleRenderingsAreDelimited() - { - AssertValidJson(log => log.Information("Rendering {First:x8} and {Second:x8}", 1, 2)); - } - } -} diff --git a/test/Serilog.Sinks.Seq.Tests/Resources/ThreeBufferedEvents.clef.txt b/test/Serilog.Sinks.Seq.Tests/Resources/ThreeBufferedEvents.clef.txt new file mode 100644 index 0000000..d728951 --- /dev/null +++ b/test/Serilog.Sinks.Seq.Tests/Resources/ThreeBufferedEvents.clef.txt @@ -0,0 +1,3 @@ +{"@t":"2017-10-19T12:04:39.9775056+10:00","@l":"Information","@mt":"Running loop {Counter}, switch is at {Level}","Counter":700019,"Level":"Information"} +{"@t":"2017-10-19T12:04:39.9792156+10:00","@l":"Information","@mt":"Running loop {Counter}, switch is at {Level}","Counter":700020,"Level":"Information"} +{"@t":"2017-10-19T12:04:39.9792575+10:00","@l":"Information","@mt":"Running loop {Counter}, switch is at {Level}","Counter":700021,"Level":"Information"} diff --git a/test/Serilog.Sinks.Seq.Tests/SeqPayloadFormatterTests.cs b/test/Serilog.Sinks.Seq.Tests/SeqPayloadFormatterTests.cs index 9490bc7..69fde7d 100644 --- a/test/Serilog.Sinks.Seq.Tests/SeqPayloadFormatterTests.cs +++ b/test/Serilog.Sinks.Seq.Tests/SeqPayloadFormatterTests.cs @@ -5,22 +5,6 @@ namespace Serilog.Sinks.Seq.Tests { public class SeqPayloadFormatterTests { - [Fact] - public void EventsAreFormattedIntoJsonPayloads() - { - var evt = Some.LogEvent("Hello, {Name}!", "Alice"); - var json = SeqPayloadFormatter.FormatRawPayload(new[] {evt}, null); - Assert.Contains("Name\":\"Alice", json); - } - - [Fact] - public void EventsAreDroppedWhenJsonRenderingFails() - { - var evt = Some.LogEvent(new NastyException(), "Hello, {Name}!", "Alice"); - var json = SeqPayloadFormatter.FormatRawPayload(new[] { evt }, null); - Assert.Contains("[]", json); - } - [Fact] public void EventsAreFormattedIntoCompactJsonPayloads() { diff --git a/test/Serilog.Sinks.Seq.Tests/Serilog.Sinks.Seq.Tests.csproj b/test/Serilog.Sinks.Seq.Tests/Serilog.Sinks.Seq.Tests.csproj index a4883d0..b5ba986 100644 --- a/test/Serilog.Sinks.Seq.Tests/Serilog.Sinks.Seq.Tests.csproj +++ b/test/Serilog.Sinks.Seq.Tests/Serilog.Sinks.Seq.Tests.csproj @@ -8,9 +8,9 @@ true - - - + + PreserveNewest + PreserveNewest From 2dd21609a90c4e8d4a3e17403b14d9db48104fb3 Mon Sep 17 00:00:00 2001 From: Nicholas Blumhardt Date: Mon, 17 Feb 2020 09:41:27 +1000 Subject: [PATCH 16/23] Update test project dependencies --- .../Serilog.Sinks.Seq.Tests.csproj | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/Serilog.Sinks.Seq.Tests/Serilog.Sinks.Seq.Tests.csproj b/test/Serilog.Sinks.Seq.Tests/Serilog.Sinks.Seq.Tests.csproj index a4883d0..e805f00 100644 --- a/test/Serilog.Sinks.Seq.Tests/Serilog.Sinks.Seq.Tests.csproj +++ b/test/Serilog.Sinks.Seq.Tests/Serilog.Sinks.Seq.Tests.csproj @@ -21,10 +21,10 @@ - - - - + + + + From 5e2a08f5e0a5591dc9006262ebecf27152d5407d Mon Sep 17 00:00:00 2001 From: Nicholas Blumhardt Date: Mon, 17 Feb 2020 09:47:24 +1000 Subject: [PATCH 17/23] TargetFrameworks typo --- test/Serilog.Sinks.Seq.Tests/Serilog.Sinks.Seq.Tests.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/Serilog.Sinks.Seq.Tests/Serilog.Sinks.Seq.Tests.csproj b/test/Serilog.Sinks.Seq.Tests/Serilog.Sinks.Seq.Tests.csproj index e805f00..c6579dd 100644 --- a/test/Serilog.Sinks.Seq.Tests/Serilog.Sinks.Seq.Tests.csproj +++ b/test/Serilog.Sinks.Seq.Tests/Serilog.Sinks.Seq.Tests.csproj @@ -1,6 +1,6 @@  - netcoreapp1.0;net452;net47;netcoreapp2.2,netcoreapp3.1 + netcoreapp1.0;net452;net47;netcoreapp2.2;netcoreapp3.1 Serilog.Sinks.Seq.Tests ../../assets/Serilog.snk true From fc71c95b3aefbeae3d85464fd951de0a583e7866 Mon Sep 17 00:00:00 2001 From: Nicholas Blumhardt Date: Mon, 17 Feb 2020 09:51:09 +1000 Subject: [PATCH 18/23] Test host support for netcoreapp1.0 no longer available, dropping tests (though we'll still build for that target) --- test/Serilog.Sinks.Seq.Tests/Serilog.Sinks.Seq.Tests.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/Serilog.Sinks.Seq.Tests/Serilog.Sinks.Seq.Tests.csproj b/test/Serilog.Sinks.Seq.Tests/Serilog.Sinks.Seq.Tests.csproj index c6579dd..e9aacac 100644 --- a/test/Serilog.Sinks.Seq.Tests/Serilog.Sinks.Seq.Tests.csproj +++ b/test/Serilog.Sinks.Seq.Tests/Serilog.Sinks.Seq.Tests.csproj @@ -1,6 +1,6 @@  - netcoreapp1.0;net452;net47;netcoreapp2.2;netcoreapp3.1 + net452;net47;netcoreapp2.2;netcoreapp3.1 Serilog.Sinks.Seq.Tests ../../assets/Serilog.snk true From cee96dc6877d510e2706acd3d1f895e24dc1013d Mon Sep 17 00:00:00 2001 From: Nicholas Blumhardt Date: Tue, 18 Feb 2020 09:09:56 +1000 Subject: [PATCH 19/23] Remove discussion of `compact: true` from README now that it's the default and only option. --- README.md | 9 --------- src/Serilog.Sinks.Seq/Serilog.Sinks.Seq.csproj | 2 +- 2 files changed, 1 insertion(+), 10 deletions(-) diff --git a/README.md b/README.md index 9c73c30..7dee56b 100644 --- a/README.md +++ b/README.md @@ -154,14 +154,6 @@ The equivalent configuration in JSON is: For further information see the [Seq documentation](https://docs.datalust.co/docs/using-serilog#dynamic-level-control). -### Compact event format - -Seq 3.3 accepts Serilog's more efficient [compact JSON format](https://github.com/serilog/serilog-formatting-compact/). To use this, configure the sink with `compact: true`: - -```csharp - .WriteTo.Seq("http://localhost:5341", compact: true) -``` - ### Troubleshooting > Nothing showed up, what can I do? @@ -199,4 +191,3 @@ Serilog.Debugging.SelfLog.Enable(message => { * Make sure your application calls `Log.CloseAndFlush()`, or disposes the root `Logger`, before it exits - otherwise, buffered events may be lost. * If your app is a Windows console application, it is also important to close the console window by exiting the app; Windows console apps are terminated "hard" if the close button in the title bar is used, so events buffered for sending to Seq may be lost if you use it. * [Raise an issue](https://github.com/serilog/serilog-sinks-seq/issues), ask for help on the [Seq support forum](https://docs.datalust.co/discuss) or email **support@datalust.co**. - diff --git a/src/Serilog.Sinks.Seq/Serilog.Sinks.Seq.csproj b/src/Serilog.Sinks.Seq/Serilog.Sinks.Seq.csproj index 69cbf35..ded10ca 100644 --- a/src/Serilog.Sinks.Seq/Serilog.Sinks.Seq.csproj +++ b/src/Serilog.Sinks.Seq/Serilog.Sinks.Seq.csproj @@ -44,7 +44,7 @@ - + From 2a1543c27fbba2806be8456411795b60a4675cc2 Mon Sep 17 00:00:00 2001 From: Nicholas Blumhardt Date: Thu, 11 Feb 2021 14:20:28 +1000 Subject: [PATCH 20/23] Update appveyor.yml --- appveyor.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index fe58a01..7bbcfd1 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -14,11 +14,11 @@ deploy: secure: RvDIxqzjq8qHsdFmR0SEZ/74b/1NsOaRUxDioL9MqtjrETHCATtygFexwefkn8rS skip_symbols: true on: - branch: /^(master|dev)$/ + branch: /^(main|dev)$/ - provider: GitHub auth_token: secure: p4LpVhBKxGS5WqucHxFQ5c7C8cP74kbNB0Z8k9Oxx/PMaDQ1+ibmoexNqVU5ZlmX artifact: /Serilog.*\.nupkg/ tag: v$(appveyor_build_version) on: - branch: master + branch: main From 5bf8197c7575a1dbd9887f2f6acb47392c0ed5b5 Mon Sep 17 00:00:00 2001 From: Nicholas Blumhardt Date: Thu, 11 Feb 2021 14:21:03 +1000 Subject: [PATCH 21/23] Update Build.ps1 --- Build.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Build.ps1 b/Build.ps1 index 35005d6..765d2dc 100644 --- a/Build.ps1 +++ b/Build.ps1 @@ -6,7 +6,7 @@ if(Test-Path .\artifacts) { Remove-Item .\artifacts -Force -Recurse } $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"] +$suffix = @{ $true = ""; $false = "$branch-$revision"}[$branch -eq "main" -and $revision -ne "local"] foreach ($src in ls src/Serilog.*) { Push-Location $src From a42627df5492772340757c081795afb9d23827ef Mon Sep 17 00:00:00 2001 From: Nicholas Blumhardt Date: Thu, 11 Feb 2021 14:40:47 +1000 Subject: [PATCH 22/23] Update to the .NET 5 SDK, add net5.0 target --- assets/icon.png | Bin 0 -> 6683 bytes global.json | 5 +++++ .../Serilog.Sinks.Seq.csproj | 18 +++++++++++++----- .../Serilog.Sinks.Seq.Tests.csproj | 8 ++------ 4 files changed, 20 insertions(+), 11 deletions(-) create mode 100644 assets/icon.png create mode 100644 global.json diff --git a/assets/icon.png b/assets/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ed37092a0647fa008fb640b51ac049a0e18f7472 GIT binary patch literal 6683 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

4EyzzsQ7ysoP= z8_lFxRNWc)AS9OH&X^m0ebJ-jIjIv-(g!M|WVeDVIG;XOwgfR?(Ggol@-mqZW+-8t zbiwj#G9bBFSDJ9Gb=_%XCWcj}VY%GEtchr5Ffk?9hiA0_)Ox{dMkh1?#z#r+W3DeIXKr#cs z__Zt^^bFHyLrqcBGdKf15UrF@!biY|uX{BHjYct_shB${-1fRBaN`e2QcF3@B+Q*~ zFz#m0q3%>ZE_>+j6G4T@YXHVW1FR8;hq>DRfc#}8%pK56bWfnb+1&zP7{UcI9KVAD?e*t6ti5;6#i zJCRQ22A#~OZvfLM07Bx%jh8N`jb3E@g_LMTlt?9Erg#N-D5AAGzn2m8=$M)(d(n_I z^lOw{kl)4o*05n8vI2HjQotW#cV^RiV#`P71G|d}CCuPdx78Z{wm?=vb-Rp_Z^e!f zTZ%D_5@07q9&J#DzgH3TyZ~>E-svwZ9i^@V~_JYx)z6$AD=kB0p=>EyA=59UT5>He4h ks__4Q0GT!4u_|%qCMi5^s9g^Hkb~%Go;_7`(k|?O0Xp`D!TSerilog sink that writes to the Seq log server over HTTP/HTTPS. 5.0.0 Serilog Contributors - Copyright © Serilog Contributors 2013-2020 - netstandard1.1;netstandard1.3;net45;netstandard2.0;netcoreapp3.1 + Copyright © Serilog Contributors + netstandard1.1;netstandard1.3;net45;netstandard2.0;netcoreapp3.1;net5.0 true true Serilog @@ -13,7 +13,7 @@ true true serilog;seq - https://serilog.net/images/serilog-sink-seq-nuget.png + icon.png https://github.com/serilog/serilog-sinks-seq Apache-2.0 https://github.com/serilog/serilog-sinks-seq @@ -34,6 +34,10 @@ $(DefineConstants);DURABLE;THREADING_TIMER + + $(DefineConstants);DURABLE;THREADING_TIMER + + $(DefineConstants);DURABLE;THREADING_TIMER;HRESULTS @@ -43,8 +47,8 @@ - - + + @@ -60,4 +64,8 @@ + + + + diff --git a/test/Serilog.Sinks.Seq.Tests/Serilog.Sinks.Seq.Tests.csproj b/test/Serilog.Sinks.Seq.Tests/Serilog.Sinks.Seq.Tests.csproj index 896f590..987fc8a 100644 --- a/test/Serilog.Sinks.Seq.Tests/Serilog.Sinks.Seq.Tests.csproj +++ b/test/Serilog.Sinks.Seq.Tests/Serilog.Sinks.Seq.Tests.csproj @@ -1,6 +1,6 @@  - net452;net47;netcoreapp2.2;netcoreapp3.1 + net48;netcoreapp3.1;net5.0 Serilog.Sinks.Seq.Tests ../../assets/Serilog.snk true @@ -27,11 +27,7 @@ - - - - - + From 4bb5963be9087336df462b3db4a4b8a62a710a9b Mon Sep 17 00:00:00 2001 From: Nicholas Blumhardt Date: Thu, 11 Feb 2021 14:46:37 +1000 Subject: [PATCH 23/23] Update appveyor.yml --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index 7bbcfd1..0500585 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -11,7 +11,7 @@ artifacts: deploy: - provider: NuGet api_key: - secure: RvDIxqzjq8qHsdFmR0SEZ/74b/1NsOaRUxDioL9MqtjrETHCATtygFexwefkn8rS + secure: K6TcIFIyxBcDuZ5DL7bJC+fGwDo458q0SDh+ybLujGTddA/voxg2FMUtJQ7rTEbt skip_symbols: true on: branch: /^(main|dev)$/