From 7a11e4883636686aa4873cb455908c0106aa7ce2 Mon Sep 17 00:00:00 2001 From: Caio Proiete Date: Sun, 10 Nov 2019 15:17:28 -0400 Subject: [PATCH] Initial version of `ExcelDna.Diagnostics.Serilog` --- .editorconfig | 23 + CHANGES.md | 1 + CODEOWNERS | 1 + LICENSE | 201 +++++++ README.md | 149 +++++ assets/default-logdisplay-logs.png | Bin 0 -> 14620 bytes assets/exceldna-diagnostics-serilog-nuget.png | Bin 0 -> 24216 bytes assets/serilog-logs-exceldna-logdisplay.png | Bin 0 -> 17430 bytes assets/serilog-logs-file-notepad.png | Bin 0 -> 23507 bytes assets/serilog-logs-seq.png | Bin 0 -> 104211 bytes exceldna-diagnostics-serilog.sln | 59 ++ exceldna-diagnostics-serilog.sln.DotSettings | 10 + sample/SampleAddIn/AddIn.cs | 42 ++ sample/SampleAddIn/App.config | 33 ++ sample/SampleAddIn/ExcelDna.DnaLibrary.xsd | 281 ++++++++++ sample/SampleAddIn/Properties/AssemblyInfo.cs | 36 ++ .../Properties/ExcelDna.Build.props | 70 +++ sample/SampleAddIn/SampleAddIn.csproj | 81 +++ sample/SampleAddIn/SampleAddIn.dna | 9 + sample/SampleAddIn/packages.config | 9 + .../Serilog/ExcelDnaTraceSource.cs | 56 ++ .../Diagnostics/Serilog/InMemoryBufferSink.cs | 58 ++ .../Serilog/LogEventLevelConvert.cs | 40 ++ .../Serilog/SerilogTraceListener.Constants.cs | 26 + .../Serilog/SerilogTraceListener.cs | 336 ++++++++++++ .../ExcelDna.Diagnostics.Serilog.csproj | 51 ++ .../Integration/TraceSourceExtensions.cs | 33 ++ .../Properties/AssemblyInfo.cs | 3 + .../ExcelDna.Diagnostics.Serilog.Tests.csproj | 35 ++ .../LogEventLevelConvertTests.cs | 49 ++ .../SerilogTraceListenerTests.cs | 514 ++++++++++++++++++ .../Support/DelegatingSink.cs | 21 + .../Support/Extensions.cs | 12 + .../Support/LogEventAssert.cs | 68 +++ .../Support/Some.cs | 25 + 35 files changed, 2332 insertions(+) create mode 100644 .editorconfig create mode 100644 CHANGES.md create mode 100644 CODEOWNERS create mode 100644 LICENSE create mode 100644 README.md create mode 100644 assets/default-logdisplay-logs.png create mode 100644 assets/exceldna-diagnostics-serilog-nuget.png create mode 100644 assets/serilog-logs-exceldna-logdisplay.png create mode 100644 assets/serilog-logs-file-notepad.png create mode 100644 assets/serilog-logs-seq.png create mode 100644 exceldna-diagnostics-serilog.sln create mode 100644 exceldna-diagnostics-serilog.sln.DotSettings create mode 100644 sample/SampleAddIn/AddIn.cs create mode 100644 sample/SampleAddIn/App.config create mode 100644 sample/SampleAddIn/ExcelDna.DnaLibrary.xsd create mode 100644 sample/SampleAddIn/Properties/AssemblyInfo.cs create mode 100644 sample/SampleAddIn/Properties/ExcelDna.Build.props create mode 100644 sample/SampleAddIn/SampleAddIn.csproj create mode 100644 sample/SampleAddIn/SampleAddIn.dna create mode 100644 sample/SampleAddIn/packages.config create mode 100644 src/ExcelDna.Diagnostics.Serilog/Diagnostics/Serilog/ExcelDnaTraceSource.cs create mode 100644 src/ExcelDna.Diagnostics.Serilog/Diagnostics/Serilog/InMemoryBufferSink.cs create mode 100644 src/ExcelDna.Diagnostics.Serilog/Diagnostics/Serilog/LogEventLevelConvert.cs create mode 100644 src/ExcelDna.Diagnostics.Serilog/Diagnostics/Serilog/SerilogTraceListener.Constants.cs create mode 100644 src/ExcelDna.Diagnostics.Serilog/Diagnostics/Serilog/SerilogTraceListener.cs create mode 100644 src/ExcelDna.Diagnostics.Serilog/ExcelDna.Diagnostics.Serilog.csproj create mode 100644 src/ExcelDna.Diagnostics.Serilog/Integration/TraceSourceExtensions.cs create mode 100644 src/ExcelDna.Diagnostics.Serilog/Properties/AssemblyInfo.cs create mode 100644 test/ExcelDna.Diagnostics.Serilog.Tests/ExcelDna.Diagnostics.Serilog.Tests.csproj create mode 100644 test/ExcelDna.Diagnostics.Serilog.Tests/LogEventLevelConvertTests.cs create mode 100644 test/ExcelDna.Diagnostics.Serilog.Tests/SerilogTraceListenerTests.cs create mode 100644 test/ExcelDna.Diagnostics.Serilog.Tests/Support/DelegatingSink.cs create mode 100644 test/ExcelDna.Diagnostics.Serilog.Tests/Support/Extensions.cs create mode 100644 test/ExcelDna.Diagnostics.Serilog.Tests/Support/LogEventAssert.cs create mode 100644 test/ExcelDna.Diagnostics.Serilog.Tests/Support/Some.cs diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..d285347 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,23 @@ +# EditorConfig is awesome: http://EditorConfig.org + +# top-most EditorConfig file +root = true + +[*] +end_of_line = crlf +trim_trailing_whitespace = true +insert_final_newline = true +indent_style = space +indent_size = 4 + +[*.{proj,props,sln,targets,sql}] +indent_style = tab + +[*.{xml,dna,config,nuspec,csproj,vcxproj,vcproj,targets,ps1,resx}] +indent_size = 2 + +[*.{cpp,h,def}] +indent_style = tab + +[*.{dotsettings}] +end_of_line = lf diff --git a/CHANGES.md b/CHANGES.md new file mode 100644 index 0000000..ef31b55 --- /dev/null +++ b/CHANGES.md @@ -0,0 +1 @@ +See: https://github.com/caioproiete/exceldna-diagnostics-serilog/releases diff --git a/CODEOWNERS b/CODEOWNERS new file mode 100644 index 0000000..34128c8 --- /dev/null +++ b/CODEOWNERS @@ -0,0 +1 @@ +* @caioproiete diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..8dada3e --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + 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. diff --git a/README.md b/README.md new file mode 100644 index 0000000..7efac67 --- /dev/null +++ b/README.md @@ -0,0 +1,149 @@ +# ExcelDna.Diagnostics.Serilog [![NuGet Version](http://img.shields.io/nuget/v/ExcelDna.Diagnostics.Serilog.svg?style=flat)](https://www.nuget.org/packages/ExcelDna.Diagnostics.Serilog/) [![Stack Overflow](https://img.shields.io/badge/stack%20overflow-excel--dna-orange.svg)](http://stackoverflow.com/questions/tagged/excel-dna) + +Integrate [Excel-DNA Diagnostic Logging](https://github.com/Excel-DNA/ExcelDna/wiki/Diagnostic-Logging) with your [Serilog](https://serilog.net) logging pipeling within your Excel-DNA add-in. + +![Excel-DNA Diagnostics Serilog with Seq screenshot](assets/serilog-logs-seq.png) + +--- + +## Background + +Excel-DNA writes [diagnostic log messages](https://github.com/Excel-DNA/ExcelDna/wiki/Diagnostic-Logging) which can be very useful for troubleshooting issues with an add-in that is not working or behaving as expected. By default, messages are written to the [`LogDisplay`](https://github.com/caioproiete/serilog-sinks-exceldnalogdisplay) window, which can only be seen by the end-user of the add-in. + +![Excel-DNA Diagnostics LogDisplay screenshot](assets/default-logdisplay-logs.png) + +However, it's possible to configure Excel-DNA to write to _other_ `Trace` listeners which can then forward these diagnostic messages to any logging pipeline such as [Serilog](https://serilog.net), for example, in order to consume / analyse these logs outside of the user's machine. + +[`ExcelDna.Diagnostics.Serilog`](https://github.com/caioproiete/exceldna-diagnostics-serilog) implements a `TraceListener` that converts `Trace` log events to Serilog log events and integrates with a Serilog logging pipeline, effectivelly forwarding any diagnostic messages written by Excel-DNA to a Serilog logger. + + +## Getting started + +Install the [ExcelDna.Diagnostics.Serilog](https://www.nuget.org/packages/ExcelDna.Diagnostics.Serilog/) package from NuGet: + +```powershell +Install-Package ExcelDna.Diagnostics.Serilog +``` + +If you don't have Serilog in your project yet, you'll need to [install one or more Serilog Sinks](https://github.com/serilog/serilog/wiki/Provided-Sinks) to have Excel-DNA diagnostic messages written to the destination you want. For example, if you'd like to write the messages to a file, you could use the [`Serilog.Sinks.File`](https://github.com/serilog/serilog-sinks-file) sink. + +```powershell +Install-Package Serilog.Sinks.File +``` + +Sinks can be found in the list of [Provided Sinks](https://github.com/serilog/serilog/wiki/Provided-Sinks) in the Serilog documentation, and also by searching within the [`serilog` tag on NuGet.org](https://www.nuget.org/packages?q=Tags%3A%22serilog%22). + +Configure Excel-DNA diagnostic logging and the Serilog Trace Listener in your `App.config` file: + +```xml + + + + + + + + + + + + + + + + + + + + + + + + + + + +``` + +[Configure your Serilog logging pipeline](https://github.com/serilog/serilog/wiki/Configuration-Basics), create your root logger, and call `ExcelDnaTraceSource.WriteToSerilog()` to start forwarding any diagnostic messages written by Excel-DNA to your Serilog logger. + +```csharp +public class AddIn : IExcelAddIn +{ + public void AutoOpen() + { + Log.Logger = new LoggerConfiguration() + .MinimumLevel.Verbose() + .WriteTo.File($"{ExcelDnaUtil.XllPath}.log") + .WriteTo.Seq("https://central-logging-system.company.net") + .CreateLogger(); + + // Forward any messages written by Excel-DNA to Serilog + ExcelDnaTraceSource.WriteToSerilog(); + } + + // ... +} +``` + + +## Example of an Excel-DNA add-in using `ExcelDna.Diagnostics.Serilog` + +In the [sample](sample/) folder, you can find an example of an Excel-DNA add-in that captures any diagnostic messages written by Excel-DNA and forwards them to a Serilog logging pipeline configured to write log events to a file on disk and also to Excel-DNA's built-in [`LogDisplay`](https://github.com/caioproiete/serilog-sinks-exceldnalogdisplay). + +![Excel-DNA Serilog logs in file Notepad screenshot](assets/serilog-logs-file-notepad.png) + +![Excel-DNA Serilog logs in LogDisplay window screenshot](assets/serilog-logs-exceldna-logdisplay.png) + + +## Mapping of Trace events to Serilog + +`Trace` events are mapped to Serilog log events in the following way: + +| Trace TraceEventType | Serilog LogEventLevel | +| ---------------------------- | --------------------------- | +| `TraceEventType.Critical` | `LogEventLevel.Fatal` | +| `TraceEventType.Error` | `LogEventLevel.Error` | +| `TraceEventType.Warning` | `LogEventLevel.Warning` | +| `TraceEventType.Information` | `LogEventLevel.Information` | +| `TraceEventType.Start` | `LogEventLevel.Debug` | +| `TraceEventType.Stop` | `LogEventLevel.Debug` | +| `TraceEventType.Suspend` | `LogEventLevel.Debug` | +| `TraceEventType.Resume` | `LogEventLevel.Debug` | +| `TraceEventType.Transfer` | `LogEventLevel.Debug` | +| `TraceEventType.Verbose` | `LogEventLevel.Verbose` | + +### Log Event Properties + +Diagnostic log messages forwarded to Serilog have the [`SourceContext`](https://github.com/serilog/serilog/wiki/Writing-Log-Events#source-contexts) property set to `ExcelDna.Integration`, allowing developers to use [filters](https://github.com/serilog/serilog/wiki/Configuration-Basics#filters), [sub-loggers](https://github.com/serilog/serilog/wiki/Configuration-Basics#sub-loggers), and [minimum level overrides](https://github.com/serilog/serilog/wiki/AppSettings#adding-minimum-level-overrides). + +`Trace` event fields (when available) are added as [custom properties](https://github.com/serilog/serilog/wiki/Enrichment) to Serilog log events with the following names: + * `ActivityId` - A structure that identifies the related activity + * `Category` - A category name used to organize the output + * `TraceEventId` - A numeric identifier for the event + * `FailDetails` - A detailed error message to emit + * `RelatedActivityId` - A structure that identifies the related activity + * `TraceSource` - A name used to identify the output, typically the name of the application that generated the trace event + * `TraceData` - The trace data to emit + * `TraceEventType` - One of the `System.Diagnostics.TraceEventType` values specifying the type of event that has caused the trace + + +## Excel-DNA configuration for packing with `ExcelDnaPack` + +In order for the Excel-DNA Diagnostics Serilog to work from an add-in that is packaged using the `ExcelDnaPack` utility, you need to include references to `Serilog.dll` and `ExcelDna.Diagnostics.Serilog.dll` in the `.dna` file of the add-in along with references to the assemblies of any other sinks you may have added: + +```xml + + + + + + + +``` + +--- + +_Copyright © 2019 Caio Proiete & Contributors - Provided under the [Apache License, Version 2.0](http://apache.org/licenses/LICENSE-2.0.html)._ diff --git a/assets/default-logdisplay-logs.png b/assets/default-logdisplay-logs.png new file mode 100644 index 0000000000000000000000000000000000000000..bd32e92fcfdc8a7505fe19045c6bab938756fd19 GIT binary patch literal 14620 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%0ArVyh+7qTTAii-DYgw8Qo3?!+H;+ED}R85Ag} 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 literal 0 HcmV?d00001 diff --git a/assets/exceldna-diagnostics-serilog-nuget.png b/assets/exceldna-diagnostics-serilog-nuget.png new file mode 100644 index 0000000000000000000000000000000000000000..9ec3425a8aabad328a84facdcfc3bbf4295bb55a GIT binary patch literal 24216 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 + /// Utility class to bind a to an + /// + public static class ExcelDnaTraceSource + { + /// + /// Forwards messages written to the to default Serilog Logger i.e. Log.Logger + /// Because Excel-DNA starts writing to the TraceListener before WriteToSerilog is called, all messages are buffered until WriteToSerilog is called + /// + public static void WriteToSerilog() + { + WriteToSerilog(Log.Logger); + } + + /// + /// Forwards messages written to the to the specified + /// Because Excel-DNA starts writing to the TraceListener before WriteToSerilog is called, all messages are buffered until WriteToSerilog is called + /// + /// The that trace messages should be written to + public static void WriteToSerilog(ILogger logger) + { + if (logger == null) + { + throw new ArgumentNullException(nameof(logger)); + } + + var traceSource = new TraceSource(SerilogTraceListener.Constants.ExcelDnaTraceSourceName, SourceLevels.Warning); + + WriteToSerilog(logger, traceSource); + } + + internal static void WriteToSerilog(ILogger logger, TraceSource traceSource) + { + var listenersBound = 0; + + foreach (var traceListener in traceSource.Listeners.OfType()) + { + traceListener.WriteToSerilog(logger); + ++listenersBound; + } + + if (listenersBound == 0) + { + logger.Warning("Unable to find any listener of type {ListenerTypeName}", + typeof(SerilogTraceListener).FullName); + } + } + } +} diff --git a/src/ExcelDna.Diagnostics.Serilog/Diagnostics/Serilog/InMemoryBufferSink.cs b/src/ExcelDna.Diagnostics.Serilog/Diagnostics/Serilog/InMemoryBufferSink.cs new file mode 100644 index 0000000..80a9a13 --- /dev/null +++ b/src/ExcelDna.Diagnostics.Serilog/Diagnostics/Serilog/InMemoryBufferSink.cs @@ -0,0 +1,58 @@ +using System; +using System.Collections.Generic; +using Serilog; +using Serilog.Core; +using Serilog.Events; + +namespace ExcelDna.Diagnostics.Serilog +{ + internal class InMemoryBufferSink : ILogEventSink, IDisposable + { + private readonly object _syncRoot = new object(); + private bool _disposed; + + private List _logEvents = new List(); + + public void Emit(LogEvent logEvent) + { + EnsureNotDisposed(); + + lock (_syncRoot) + { + _logEvents.Add(logEvent); + } + } + + public void WriteTo(ILogger logger) + { + lock (_syncRoot) + { + foreach (var logEvent in _logEvents) + { + logger.Write(logEvent); + } + } + } + + public void Dispose() + { + if (_disposed) + { + return; + } + + _logEvents.Clear(); + _logEvents = null; + + _disposed = true; + } + + private void EnsureNotDisposed() + { + if (_disposed) + { + throw new ObjectDisposedException(nameof(InMemoryBufferSink)); + } + } + } +} diff --git a/src/ExcelDna.Diagnostics.Serilog/Diagnostics/Serilog/LogEventLevelConvert.cs b/src/ExcelDna.Diagnostics.Serilog/Diagnostics/Serilog/LogEventLevelConvert.cs new file mode 100644 index 0000000..43b1dd8 --- /dev/null +++ b/src/ExcelDna.Diagnostics.Serilog/Diagnostics/Serilog/LogEventLevelConvert.cs @@ -0,0 +1,40 @@ +using System; +using System.Diagnostics; +using Serilog.Events; + +namespace ExcelDna.Diagnostics.Serilog +{ + internal static class LogEventLevelConvert + { + public static LogEventLevel ToLogEventLevel(TraceEventType eventType) + { + switch (eventType) + { + case TraceEventType.Critical: + return LogEventLevel.Fatal; + + case TraceEventType.Error: + return LogEventLevel.Error; + + case TraceEventType.Warning: + return LogEventLevel.Warning; + + case TraceEventType.Information: + return LogEventLevel.Information; + + case TraceEventType.Start: + case TraceEventType.Stop: + case TraceEventType.Suspend: + case TraceEventType.Resume: + case TraceEventType.Transfer: + return LogEventLevel.Debug; + + case TraceEventType.Verbose: + return LogEventLevel.Verbose; + + default: + throw new ArgumentOutOfRangeException(nameof(eventType), eventType, $"Unknown {nameof(TraceEventType)}: `{eventType}`"); + } + } + } +} diff --git a/src/ExcelDna.Diagnostics.Serilog/Diagnostics/Serilog/SerilogTraceListener.Constants.cs b/src/ExcelDna.Diagnostics.Serilog/Diagnostics/Serilog/SerilogTraceListener.Constants.cs new file mode 100644 index 0000000..5a2c7c9 --- /dev/null +++ b/src/ExcelDna.Diagnostics.Serilog/Diagnostics/Serilog/SerilogTraceListener.Constants.cs @@ -0,0 +1,26 @@ +namespace ExcelDna.Diagnostics.Serilog +{ + public partial class SerilogTraceListener + { + /// + /// Constants used in the logging pipeline and associated types + /// + public class Constants + { + /// + /// The name of the property included in the emitted log events + /// + public const string SourceContextPropertyName = global::Serilog.Core.Constants.SourceContextPropertyName; + + /// + /// The value of the property SourceContext included in the emitted log events + /// + public const string ExcelDnaSourceContext = "ExcelDna.Integration"; + + /// + /// The name of the TraceSource used by Excel-DNA + /// + public const string ExcelDnaTraceSourceName = "ExcelDna.Integration"; + } + } +} diff --git a/src/ExcelDna.Diagnostics.Serilog/Diagnostics/Serilog/SerilogTraceListener.cs b/src/ExcelDna.Diagnostics.Serilog/Diagnostics/Serilog/SerilogTraceListener.cs new file mode 100644 index 0000000..93e5f12 --- /dev/null +++ b/src/ExcelDna.Diagnostics.Serilog/Diagnostics/Serilog/SerilogTraceListener.cs @@ -0,0 +1,336 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Globalization; +using Serilog; +using Serilog.Events; + +namespace ExcelDna.Diagnostics.Serilog +{ + // Adapted from SerilogTraceListener by SerilogTraceListener Contributors + // https://github.com/serilog-trace-listener/SerilogTraceListener + + /// + /// TraceListener implementation that directs all output to Serilog. + /// + public partial class SerilogTraceListener : TraceListener + { + private ILogger _logger; + private readonly InMemoryBufferSink _inMemoryBufferSink; + + private const string ActivityIdProperty = "ActivityId"; + private const string CategoryProperty = "Category"; + private const string EventIdProperty = "TraceEventId"; + private const string FailDetailMessageProperty = "FailDetails"; + private const string RelatedActivityIdProperty = "RelatedActivityId"; + private const string SourceProperty = "TraceSource"; + private const string TraceDataProperty = "TraceData"; + private const string TraceEventTypeProperty = "TraceEventType"; + private const LogEventLevel DefaultLogLevel = LogEventLevel.Debug; + private const LogEventLevel FailLevel = LogEventLevel.Fatal; + private const string NoMessageTraceEventMessageTemplate = "{TraceSource:l} {TraceEventType}: {TraceEventId}"; + private const string TraceDataMessageTemplate = "{TraceData}"; + + /// + /// Initializes a new instance of the class + /// + public SerilogTraceListener() + : this(name: string.Empty) + { + } + + /// + /// Initializes a new instance of the class using the specified name as the listener + /// + /// The name of the + public SerilogTraceListener(string name) + : base(name) + { + _inMemoryBufferSink = new InMemoryBufferSink(); + + _logger = new LoggerConfiguration() + .MinimumLevel.Verbose() + .WriteTo.Sink(_inMemoryBufferSink) + .CreateLogger(); + } + + /// + /// Forwards messages written to the to the specified + /// Because Excel-DNA starts writing to the TraceListener before WriteToSerilog is called, all messages are buffered until WriteToSerilog is called + /// + /// The that trace messages should be written to + public void WriteToSerilog(ILogger logger) + { + if (logger is null) + { + throw new ArgumentNullException(nameof(logger)); + } + + // ForContext shouldn't be needed here as the LogEvent could include the SourceContext + // but this is needed for MinimumLevel overrides to work due to how Serilog was designed: + // https://github.com/serilog/serilog/issues/1382 + var contextLogger = logger + .ForContext(Constants.SourceContextPropertyName, Constants.ExcelDnaSourceContext); + + if (!(_inMemoryBufferSink is null)) + { + using (_inMemoryBufferSink) + { + _inMemoryBufferSink.WriteTo(contextLogger); + } + } + + _logger = contextLogger; + } + + /// + public override bool IsThreadSafe => true; + + /// + public override void Fail(string message) + { + var properties = CreateFailProperties(); + Write(FailLevel, null, message, properties); + } + + /// + public override void Fail(string message, string detailMessage) + { + var properties = CreateFailProperties(); + SafeAddProperty(properties, FailDetailMessageProperty, detailMessage); + Write(FailLevel, null, message, properties); + } + + /// + public override void TraceData(TraceEventCache eventCache, string source, TraceEventType eventType, int id, + object data) + { + if (!ShouldTrace(eventCache, source, eventType, id, "", null, data, null)) + { + return; + } + + var properties = CreateTraceProperties(source, eventType, id); + WriteData(eventType, properties, data); + } + + /// + public override void TraceData(TraceEventCache eventCache, string source, TraceEventType eventType, int id, + params object[] data) + { + if (!ShouldTrace(eventCache, source, eventType, id, "", null, null, data)) + { + return; + } + + var properties = CreateTraceProperties(source, eventType, id); + WriteData(eventType, properties, data); + } + + /// + public override void TraceEvent(TraceEventCache eventCache, string source, TraceEventType eventType, int id) + { + if (!ShouldTrace(eventCache, source, eventType, id, "", null, null, null)) + { + return; + } + + var properties = CreateTraceProperties(source, eventType, id); + Write(eventType, null, NoMessageTraceEventMessageTemplate, properties); + } + + /// + public override void TraceEvent(TraceEventCache eventCache, string source, TraceEventType eventType, int id, + string message) + { + if (!ShouldTrace(eventCache, source, eventType, id, message, null, null, null)) + { + return; + } + + var properties = CreateTraceProperties(source, eventType, id); + Write(eventType, null, message, properties); + } + + /// + public override void TraceEvent(TraceEventCache eventCache, string source, TraceEventType eventType, int id, + string format, params object[] args) + { + if (!ShouldTrace(eventCache, source, eventType, id, format, args, null, null)) + { + return; + } + + var properties = CreateTraceProperties(source, eventType, id); + AddFormatArgs(properties, args, out var exception); + Write(eventType, exception, format, properties); + } + + /// + public override void TraceTransfer(TraceEventCache eventCache, string source, int id, string message, + Guid relatedActivityId) + { + const TraceEventType eventType = TraceEventType.Transfer; + var properties = CreateTraceProperties(source, eventType, id); + SafeAddProperty(properties, RelatedActivityIdProperty, relatedActivityId); + Write(eventType, null, message, properties); + } + + /// + public override void Write(object data) + { + var properties = CreateProperties(); + SafeAddProperty(properties, TraceDataProperty, data); + Write(DefaultLogLevel, null, TraceDataMessageTemplate, properties); + } + + /// + public override void Write(string message) + { + var properties = CreateProperties(); + Write(DefaultLogLevel, null, message, properties); + } + + /// + public override void Write(object data, string category) + { + var properties = CreateProperties(); + SafeAddProperty(properties, TraceDataProperty, data); + SafeAddProperty(properties, CategoryProperty, category); + Write(DefaultLogLevel, null, TraceDataMessageTemplate, properties); + } + + /// + public override void Write(string message, string category) + { + var properties = CreateProperties(); + SafeAddProperty(properties, CategoryProperty, category); + Write(DefaultLogLevel, null, message, properties); + } + + /// + public override void WriteLine(string message) + { + Write(message); + } + + /// + public override void WriteLine(object data) + { + Write(data); + } + + /// + public override void WriteLine(string message, string category) + { + Write(message, category); + } + + /// + public override void WriteLine(object data, string category) + { + Write(data, category); + } + + /// + protected override void Dispose(bool disposing) + { + if (disposing) + { + _inMemoryBufferSink?.Dispose(); + } + + base.Dispose(disposing); + } + + private void AddFormatArgs(IList properties, IReadOnlyList args, out Exception exception) + { + exception = null; + + if (args is null) + { + return; + } + + for (var argIndex = 0; argIndex < args.Count; argIndex++) + { + SafeAddProperty(properties, argIndex.ToString(CultureInfo.InvariantCulture), args[argIndex]); + + // If there is any argument of type Exception (last wins), then use it + if (args[argIndex] is Exception) + { + exception = (Exception)args[argIndex]; + } + } + } + + private IList CreateFailProperties() + { + var properties = CreateProperties(); + SafeAddProperty(properties, TraceEventTypeProperty, "Fail"); + return properties; + } + + private IList CreateProperties() + { + var properties = new List(); + SafeAddProperty(properties, ActivityIdProperty, Trace.CorrelationManager.ActivityId); + return properties; + } + + private IList CreateTraceProperties(string source, TraceEventType eventType, int id) + { + var properties = CreateProperties(); + SafeAddProperty(properties, SourceProperty, source); + SafeAddProperty(properties, TraceEventTypeProperty, eventType); + SafeAddProperty(properties, EventIdProperty, id); + return properties; + } + + private void SafeAddProperty(ICollection properties, string name, object value) + { + var localLogger = _logger; + if (localLogger.BindProperty(name, value, false, out var property)) + { + properties.Add(property); + } + } + + private void Write(TraceEventType eventType, Exception exception, string messageTemplate, IEnumerable properties) + { + var level = LogEventLevelConvert.ToLogEventLevel(eventType); + Write(level, exception, messageTemplate, properties); + } + + private void Write(LogEventLevel level, Exception exception, string messageTemplate, IEnumerable properties) + { + // If user has passed null, then still log (as an empty message) + if (messageTemplate == null) + { + messageTemplate = string.Empty; + } + + var localLogger = _logger; + + // boundProperties will be empty and can be ignored + if (localLogger.BindMessageTemplate(messageTemplate, null, out var parsedTemplate, out _)) + { + var logEvent = new LogEvent(DateTimeOffset.Now, level, exception, parsedTemplate, properties); + localLogger.Write(logEvent); + } + } + + private bool ShouldTrace(TraceEventCache cache, string source, TraceEventType eventType, int id, string formatOrMessage, + object[] args, object data1, object[] data) + { + return Filter?.ShouldTrace(cache, source, eventType, id, formatOrMessage, args, data1, data) ?? true; + } + + private void WriteData(TraceEventType eventType, IList properties, object data) + { + var level = LogEventLevelConvert.ToLogEventLevel(eventType); + SafeAddProperty(properties, TraceDataProperty, data); + Write(level, null, TraceDataMessageTemplate, properties); + } + } +} diff --git a/src/ExcelDna.Diagnostics.Serilog/ExcelDna.Diagnostics.Serilog.csproj b/src/ExcelDna.Diagnostics.Serilog/ExcelDna.Diagnostics.Serilog.csproj new file mode 100644 index 0000000..6241fd1 --- /dev/null +++ b/src/ExcelDna.Diagnostics.Serilog/ExcelDna.Diagnostics.Serilog.csproj @@ -0,0 +1,51 @@ + + + + Integrate Excel-DNA Diagnostics Logging with Serilog. + 1.0.0.0 + + net45;net461;net472 + + true + true + true + + Caio Proiete and Contributors + ExcelDna.Diagnostics.Serilog + ExcelDna + + ExcelDna.Diagnostics.Serilog + exceldna;diagnostic;serilog;logging;excel-dna + https://raw.githubusercontent.com/caioproiete/exceldna-diagnostics-serilog/master/assets/exceldna-diagnostics-serilog-nuget.png + https://github.com/caioproiete/exceldna-diagnostics-serilog + Apache-2.0 + https://github.com/caioproiete/exceldna-diagnostics-serilog + git + true + snupkg + true + true + true + $(NoWarn);NU5048 + True + + + + + + SerilogTraceListener.cs + + + + + + + + + + + + + + + diff --git a/src/ExcelDna.Diagnostics.Serilog/Integration/TraceSourceExtensions.cs b/src/ExcelDna.Diagnostics.Serilog/Integration/TraceSourceExtensions.cs new file mode 100644 index 0000000..1df1f0c --- /dev/null +++ b/src/ExcelDna.Diagnostics.Serilog/Integration/TraceSourceExtensions.cs @@ -0,0 +1,33 @@ +using System.Diagnostics; +using Serilog; +using ExcelDna.Diagnostics.Serilog; + +namespace ExcelDna.Integration +{ + /// + /// Adds the WriteToSerilog() extension method to + /// + public static class TraceSourceExtensions + { + /// + /// Forwards messages written to the to default Serilog Logger i.e. Log.Logger + /// Because Excel-DNA starts writing to the TraceListener before WriteToSerilog is called, all messages are buffered until WriteToSerilog is called + /// + /// The that has a + public static void WriteToSerilog(this TraceSource traceSource) + { + ExcelDnaTraceSource.WriteToSerilog(Log.Logger, traceSource); + } + + /// + /// Forwards messages written to the to the specified + /// Because Excel-DNA starts writing to the TraceListener before WriteToSerilog is called, all messages are buffered until WriteToSerilog is called + /// + /// The that has a + /// The that messages should be written to + public static void WriteToSerilog(this TraceSource traceSource, ILogger logger) + { + ExcelDnaTraceSource.WriteToSerilog(logger, traceSource); + } + } +} diff --git a/src/ExcelDna.Diagnostics.Serilog/Properties/AssemblyInfo.cs b/src/ExcelDna.Diagnostics.Serilog/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..cfd6a55 --- /dev/null +++ b/src/ExcelDna.Diagnostics.Serilog/Properties/AssemblyInfo.cs @@ -0,0 +1,3 @@ +using System.Runtime.CompilerServices; + +[assembly: InternalsVisibleTo("ExcelDna.Diagnostics.Serilog.Tests")] diff --git a/test/ExcelDna.Diagnostics.Serilog.Tests/ExcelDna.Diagnostics.Serilog.Tests.csproj b/test/ExcelDna.Diagnostics.Serilog.Tests/ExcelDna.Diagnostics.Serilog.Tests.csproj new file mode 100644 index 0000000..ed31384 --- /dev/null +++ b/test/ExcelDna.Diagnostics.Serilog.Tests/ExcelDna.Diagnostics.Serilog.Tests.csproj @@ -0,0 +1,35 @@ + + + + net472 + + true + + true + 1.0.0 + false + false + false + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers + + + + + + + + + + + diff --git a/test/ExcelDna.Diagnostics.Serilog.Tests/LogEventLevelConvertTests.cs b/test/ExcelDna.Diagnostics.Serilog.Tests/LogEventLevelConvertTests.cs new file mode 100644 index 0000000..8d26769 --- /dev/null +++ b/test/ExcelDna.Diagnostics.Serilog.Tests/LogEventLevelConvertTests.cs @@ -0,0 +1,49 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using Serilog.Events; +using Xunit; + +namespace ExcelDna.Diagnostics.Serilog.Tests +{ + public class LogEventLevelConvertTests + { + [Theory] + [InlineData(TraceEventType.Critical, LogEventLevel.Fatal)] + [InlineData(TraceEventType.Error, LogEventLevel.Error)] + [InlineData(TraceEventType.Warning, LogEventLevel.Warning)] + [InlineData(TraceEventType.Information, LogEventLevel.Information)] + [InlineData(TraceEventType.Start, LogEventLevel.Debug)] + [InlineData(TraceEventType.Stop, LogEventLevel.Debug)] + [InlineData(TraceEventType.Suspend, LogEventLevel.Debug)] + [InlineData(TraceEventType.Resume, LogEventLevel.Debug)] + [InlineData(TraceEventType.Transfer, LogEventLevel.Debug)] + [InlineData(TraceEventType.Verbose, LogEventLevel.Verbose)] + public void TraceEventType_is_converted_to_the_right_LogEventLevel(TraceEventType traceEventType, LogEventLevel expectedLogEventLevel) + { + var result = LogEventLevelConvert.ToLogEventLevel(traceEventType); + Assert.Equal(expectedLogEventLevel, result); + } + + [Fact] + public void Throws_ArgumentOutOfRangeException_for_invalid_TraceEventType() + { + Assert.Throws(() => LogEventLevelConvert.ToLogEventLevel(0)); + } + + public static readonly IEnumerable AllTraceEventTypes = Enum.GetValues(typeof(TraceEventType)) + .Cast().Select(v => new[] { v }); + + public static readonly IEnumerable AllLogEventLevels = Enum.GetValues(typeof(LogEventLevel)) + .Cast(); + + [Theory] + [MemberData(nameof(AllTraceEventTypes))] + public void Can_convert_any_TraceEventType_to_a_LogEventLevel(TraceEventType traceEventType) + { + var result = LogEventLevelConvert.ToLogEventLevel(traceEventType); + Assert.Contains(result, AllLogEventLevels); + } + } +} diff --git a/test/ExcelDna.Diagnostics.Serilog.Tests/SerilogTraceListenerTests.cs b/test/ExcelDna.Diagnostics.Serilog.Tests/SerilogTraceListenerTests.cs new file mode 100644 index 0000000..27a3011 --- /dev/null +++ b/test/ExcelDna.Diagnostics.Serilog.Tests/SerilogTraceListenerTests.cs @@ -0,0 +1,514 @@ +using System; +using System.Diagnostics; +using System.Linq; +using ExcelDna.Diagnostics.Serilog.Tests.Support; +using ExcelDna.Integration; +using Serilog; +using Serilog.Events; +using Xunit; + +namespace ExcelDna.Diagnostics.Serilog.Tests +{ + public class SerilogTraceListenerTests : IDisposable + { + private const TraceEventType WarningEventType = TraceEventType.Warning; + private readonly string _category = Some.String("category"); + private readonly int _id = Some.Int(); + private readonly string _message = Some.String("message"); + private readonly string _source = Some.String("source"); + private readonly TraceEventCache _traceEventCache = new TraceEventCache(); + + private readonly SerilogTraceListener _traceListener; + private LogEvent _loggedEvent; + + public SerilogTraceListenerTests() + { + var delegatingSink = new DelegatingSink(evt => + { + _loggedEvent = evt; + }); + + var logger = new LoggerConfiguration() + .MinimumLevel.Verbose() + .WriteTo.Sink(delegatingSink) + .CreateLogger(); + + var traceSource = new TraceSource(SerilogTraceListener.Constants.ExcelDnaTraceSourceName, + SourceLevels.All); + + traceSource.Listeners.Clear(); + + var traceListener = new SerilogTraceListener(nameof(SerilogTraceListenerTests)); + traceSource.Listeners.Add(traceListener); + + _traceListener = traceListener; + _loggedEvent = null; + + traceSource.WriteToSerilog(logger); + } + + public void Dispose() + { + _traceListener.Dispose(); + } + + [Fact] + public void Captures_Write() + { + _traceListener.Write(_message); + + LogEventAssert.HasMessage(_message, _loggedEvent); + LogEventAssert.HasLevel(LogEventLevel.Debug, _loggedEvent); + + LogEventAssert.HasPropertyValue(SerilogTraceListener.Constants.ExcelDnaSourceContext, + SerilogTraceListener.Constants.SourceContextPropertyName, _loggedEvent); + } + + [Fact] + public void Captures_Write_with_category() + { + _traceListener.Write(_message, _category); + + LogEventAssert.HasMessage(_message, _loggedEvent); + LogEventAssert.HasLevel(LogEventLevel.Debug, _loggedEvent); + LogEventAssert.HasPropertyValue(_category, "Category", _loggedEvent); + } + + [Fact] + public void Captures_Write_of_object() + { + var writtenObject = Tuple.Create(Some.String()); + _traceListener.Write(writtenObject); + + LogEventAssert.HasMessage($@"""{writtenObject}""", _loggedEvent); + LogEventAssert.HasLevel(LogEventLevel.Debug, _loggedEvent); + } + + [Fact] + public void Write_of_object_has_TraceData_property() + { + var writtenObject = new[] + { + Some.Int(), + Some.Int(), + }; + + _traceListener.Write(writtenObject); + + LogEventAssert.HasMessage($"[{writtenObject[0]}, {writtenObject[1]}]", _loggedEvent); + LogEventAssert.HasLevel(LogEventLevel.Debug, _loggedEvent); + + var sequence = ((SequenceValue)_loggedEvent.Properties["TraceData"]).Elements.Select(pv => pv.LiteralValue()); + Assert.Equal(writtenObject.Cast(), sequence); + } + + [Fact] + public void Captures_Write_of_object_with_category() + { + var writtenObject = Tuple.Create(Some.String()); + _traceListener.Write(writtenObject, _category); + + LogEventAssert.HasMessage($@"""{writtenObject}""", _loggedEvent); + LogEventAssert.HasLevel(LogEventLevel.Debug, _loggedEvent); + LogEventAssert.HasPropertyValue(_category, "Category", _loggedEvent); + } + + [Fact] + public void Captures_WriteLine() + { + _traceListener.WriteLine(_message); + + LogEventAssert.HasMessage(_message, _loggedEvent); + LogEventAssert.HasLevel(LogEventLevel.Debug, _loggedEvent); + } + + [Fact] + public void Captures_WriteLine_with_category() + { + _traceListener.WriteLine(_message, _category); + + LogEventAssert.HasMessage(_message, _loggedEvent); + LogEventAssert.HasLevel(LogEventLevel.Debug, _loggedEvent); + LogEventAssert.HasPropertyValue(_category, "Category", _loggedEvent); + } + + [Fact] + public void Captures_WriteLine_of_object() + { + var writtenObject = Tuple.Create(Some.String()); + _traceListener.WriteLine(writtenObject); + + LogEventAssert.HasMessage($@"""{writtenObject}""", _loggedEvent); + LogEventAssert.HasLevel(LogEventLevel.Debug, _loggedEvent); + } + + [Fact] + public void Captures_WriteLine_of_object_with_category() + { + var writtenObject = Tuple.Create(Some.String()); + _traceListener.WriteLine(writtenObject, _category); + + LogEventAssert.HasMessage($@"""{writtenObject}""", _loggedEvent); + LogEventAssert.HasLevel(LogEventLevel.Debug, _loggedEvent); + LogEventAssert.HasPropertyValue(_category, "Category", _loggedEvent); + } + + [Fact] + public void Captures_Fail() + { + _traceListener.Fail(_message); + + LogEventAssert.HasMessage(_message, _loggedEvent); + LogEventAssert.HasLevel(LogEventLevel.Fatal, _loggedEvent); + } + + [Fact] + public void Captures_Fail_with_detailed_description() + { + var detailMessage = Some.String(); + + _traceListener.Fail(_message, detailMessage); + + LogEventAssert.HasMessage(_message, _loggedEvent); + LogEventAssert.HasLevel(LogEventLevel.Fatal, _loggedEvent); + LogEventAssert.HasPropertyValue(detailMessage, "FailDetails", _loggedEvent); + } + + [Fact] + public void Captures_TraceEvent() + { + _traceListener.TraceEvent(_traceEventCache, _source, WarningEventType, _id); + + LogEventAssert.HasMessage($"{_source} {WarningEventType}: {_id}", _loggedEvent); + LogEventAssert.HasLevel(LogEventLevel.Warning, _loggedEvent); + + LogEventAssert.HasPropertyValue(_id, "TraceEventId", _loggedEvent); + LogEventAssert.HasPropertyValue(_source, "TraceSource", _loggedEvent); + LogEventAssert.HasPropertyValue(WarningEventType, "TraceEventType", _loggedEvent); + } + + [Fact] + public void Captures_TraceEvent_with_message() + { + _traceListener.TraceEvent(_traceEventCache, _source, WarningEventType, _id, _message); + + LogEventAssert.HasMessage(_message, _loggedEvent); + LogEventAssert.HasLevel(LogEventLevel.Warning, _loggedEvent); + LogEventAssert.HasPropertyValue(_id, "TraceEventId", _loggedEvent); + LogEventAssert.HasPropertyValue(_source, "TraceSource", _loggedEvent); + LogEventAssert.HasPropertyValue(WarningEventType, "TraceEventType", _loggedEvent); + } + + [Fact] + public void Captures_TraceEvent_with_format_message() + { + const string format = "{0}-{1}-{2}"; + var args = new object[] + { + Some.Int(), + Some.Int(), + Some.Int(), + }; + + _traceListener.TraceEvent(_traceEventCache, _source, WarningEventType, _id, format, args); + + LogEventAssert.HasMessage(string.Format(format, args[0], args[1], args[2]), _loggedEvent); + LogEventAssert.HasLevel(LogEventLevel.Warning, _loggedEvent); + + LogEventAssert.HasPropertyValue(_id, "TraceEventId", _loggedEvent); + LogEventAssert.HasPropertyValue(_source, "TraceSource", _loggedEvent); + LogEventAssert.HasPropertyValue(WarningEventType, "TraceEventType", _loggedEvent); + LogEventAssert.HasPropertyValue(args[0], "0", _loggedEvent); + LogEventAssert.HasPropertyValue(args[1], "1", _loggedEvent); + LogEventAssert.HasPropertyValue(args[2], "2", _loggedEvent); + } + + [Fact] + public void Captures_TraceTransfer() + { + var relatedActivityId = Some.Guid(); + + _traceListener.TraceTransfer(_traceEventCache, _source, _id, _message, relatedActivityId); + + LogEventAssert.HasMessage(_message, _loggedEvent); + LogEventAssert.HasLevel(LogEventLevel.Debug, _loggedEvent); + + LogEventAssert.HasPropertyValue(_id, "TraceEventId", _loggedEvent); + LogEventAssert.HasPropertyValue(_source, "TraceSource", _loggedEvent); + LogEventAssert.HasPropertyValue(relatedActivityId, "RelatedActivityId", _loggedEvent); + LogEventAssert.HasPropertyValue(TraceEventType.Transfer, "TraceEventType", _loggedEvent); + } + + [Fact] + public void Captures_TraceData() + { + var data = new + { + Info = Some.String(), + }; + + _traceListener.TraceData(_traceEventCache, _source, WarningEventType, _id, data); + + LogEventAssert.HasMessage($@"""{data}""", _loggedEvent); + LogEventAssert.HasLevel(LogEventLevel.Warning, _loggedEvent); + + LogEventAssert.HasPropertyValue(_id, "TraceEventId", _loggedEvent); + LogEventAssert.HasPropertyValue(_source, "TraceSource", _loggedEvent); + LogEventAssert.HasPropertyValue(data.ToString(), "TraceData", _loggedEvent); + LogEventAssert.HasPropertyValue(WarningEventType, "TraceEventType", _loggedEvent); + } + + [Fact] + public void Captures_TraceData_with_array_of_int() + { + var data = new[] + { + Some.Int(), + Some.Int(), + }; + + _traceListener.TraceData(_traceEventCache, _source, WarningEventType, _id, data); + + LogEventAssert.HasMessage($"[{data[0]}, {data[1]}]", _loggedEvent); + + LogEventAssert.HasLevel(LogEventLevel.Warning, _loggedEvent); + + LogEventAssert.HasPropertyValue(_id, "TraceEventId", _loggedEvent); + LogEventAssert.HasPropertyValue(_source, "TraceSource", _loggedEvent); + + var sequence = ((SequenceValue)_loggedEvent.Properties["TraceData"]).Elements.Select(pv => pv.LiteralValue()); + + Assert.Equal(data.Cast(), sequence); + } + + [Fact] + public void Captures_TraceData_with_multiple_data_args() + { + var data1 = new + { + Info = Some.String(), + }; + + var data2 = new + { + Info = Some.String(), + }; + + var data3 = new + { + Info = Some.Int(), + }; + + _traceListener.TraceData(_traceEventCache, _source, WarningEventType, _id, data1, data2, data3); + + // The square-brackets ('[' ,']') are because of Serilog behavior and are not how the stock TraceListener would behave + LogEventAssert.HasMessage( + $@"[""{string.Join(@""", """, data1, data2, data3)}""]", _loggedEvent); + + LogEventAssert.HasLevel(LogEventLevel.Warning, _loggedEvent); + + LogEventAssert.HasPropertyValue(_id, "TraceEventId", _loggedEvent); + LogEventAssert.HasPropertyValue(_source, "TraceSource", _loggedEvent); + LogEventAssert.HasPropertyValueSequenceValue(new object[] + { + data1, + data2, + data3, + }, "TraceData", _loggedEvent); + + LogEventAssert.HasPropertyValue(WarningEventType, "TraceEventType", _loggedEvent); + } + + [Fact] + public void Can_log_from_TraceSource_Information() + { + const string traceSourceName = nameof(Can_log_from_TraceSource_Information); + const string logMessage = "A simple message"; + + var traceSource = new TraceSource(traceSourceName, SourceLevels.All); + traceSource.Listeners.Clear(); + traceSource.Listeners.Add(_traceListener); + + traceSource.TraceInformation(logMessage); + + LogEventAssert.HasLevel(LogEventLevel.Information, _loggedEvent); + LogEventAssert.HasMessage(logMessage, _loggedEvent); + LogEventAssert.HasPropertyValue(traceSourceName, "TraceSource", _loggedEvent); + } + + [Fact] + public void Correctly_orders_format_args() + { + const string format = "{1}-{0}-{1}"; + var args = new object[] + { + Some.Int(), + Some.Int(), + Some.Int(), + }; + + _traceListener.TraceEvent(_traceEventCache, _source, WarningEventType, _id, format, args); + + LogEventAssert.HasMessage($"{args[1]}-{args[0]}-{args[1]}", _loggedEvent); + LogEventAssert.HasPropertyValue(args[2], "2", _loggedEvent); + } + + [Fact] + public void Continues_logging_after_Close_is_called() + { + _traceListener.Close(); + + _traceListener.Write(_message); + + LogEventAssert.HasMessage(_message, _loggedEvent); + } + + [Fact] + public void Handles_empty_format_string() + { + var args = new object[] + { + Some.Int(), + Some.Int(), + Some.Int(), + }; + + _traceListener.TraceEvent(_traceEventCache, _source, WarningEventType, _id, format: string.Empty, args); + + LogEventAssert.HasMessage(string.Empty, _loggedEvent); + LogEventAssert.HasPropertyValue(args[0], "0", _loggedEvent); + LogEventAssert.HasPropertyValue(args[1], "1", _loggedEvent); + LogEventAssert.HasPropertyValue(args[2], "2", _loggedEvent); + } + + [Fact] + public void Handles_null_format_string() + { + var args = new object[] + { + Some.Int(), + Some.Int(), + Some.Int(), + }; + + // ReSharper disable once AssignNullToNotNullAttribute + _traceListener.TraceEvent(_traceEventCache, _source, WarningEventType, _id, format: null, args); + + LogEventAssert.HasMessage(string.Empty, _loggedEvent); + LogEventAssert.HasPropertyValue(args[0], "0", _loggedEvent); + LogEventAssert.HasPropertyValue(args[1], "1", _loggedEvent); + LogEventAssert.HasPropertyValue(args[2], "2", _loggedEvent); + } + + [Fact] + public void Honors_MinimumLevel() + { + LogEvent logEvent = null; + + var delegatingSink = new DelegatingSink(evt => + { + logEvent = evt; + }); + + var logger = new LoggerConfiguration() + .MinimumLevel.Debug() + .WriteTo.Sink(delegatingSink) + .CreateLogger(); + + var traceSource = new TraceSource(nameof(Honors_MinimumLevel), SourceLevels.All); + traceSource.Listeners.Clear(); + traceSource.Listeners.Add(new SerilogTraceListener(nameof(SerilogTraceListenerTests))); + + traceSource.WriteToSerilog(logger); + + const string verboseMessage = "This is a Verbose message"; + const string warningMessage = "This is an Warning message"; + + traceSource.TraceEvent(TraceEventType.Verbose, id: 1, verboseMessage); + Assert.Null(logEvent); + + traceSource.TraceEvent(TraceEventType.Warning, id: 2, warningMessage); + LogEventAssert.HasMessage(warningMessage, logEvent); + } + + [Fact] + public void Honors_MinimumLevel_Override() + { + LogEvent logEvent = null; + + var delegatingSink = new DelegatingSink(evt => + { + logEvent = evt; + }); + + var logger = new LoggerConfiguration() + .MinimumLevel.Verbose() + .MinimumLevel.Override(SerilogTraceListener.Constants.ExcelDnaSourceContext, + LogEventLevel.Warning) + .WriteTo.Sink(delegatingSink) + .CreateLogger(); + + var traceSource = new TraceSource(nameof(Honors_MinimumLevel), SourceLevels.All); + traceSource.Listeners.Clear(); + traceSource.Listeners.Add(new SerilogTraceListener(nameof(SerilogTraceListenerTests))); + + traceSource.WriteToSerilog(logger); + + const string verboseMessage = "This is a Verbose message"; + const string warningMessage = "This is an Warning message"; + + traceSource.TraceEvent(TraceEventType.Verbose, id: 1, verboseMessage); + Assert.Null(logEvent); + + traceSource.TraceEvent(TraceEventType.Warning, id: 2, warningMessage); + LogEventAssert.HasMessage(warningMessage, logEvent); + } + + [Fact] + public void Honors_Trace_Filter() + { + _traceListener.Filter = new DummyFilter(id => id % 2 == 0); + + _traceListener.TraceData(new TraceEventCache(), _source, TraceEventType.Information, 3, _message); + Assert.Null(_loggedEvent); + + _traceListener.TraceData(new TraceEventCache(), _source, TraceEventType.Information, 4, _message); + Assert.NotNull(_loggedEvent); + } + + [Fact] + public void Constructor_sets_TraceListener_name_to_empty_string() + { + using (var traceListener = new SerilogTraceListener()) + { + Assert.Equal(string.Empty, traceListener.Name); + } + } + + [Fact] + public void Constructor_with_name_sets_name_of_TraceListener_to_name_specified() + { + const string name = "ExcelDnaToSerilog"; + + using (var traceListener = new SerilogTraceListener(name)) + { + Assert.Equal(name, traceListener.Name); + } + } + + private class DummyFilter : TraceFilter + { + readonly Predicate _predicate; + + public DummyFilter(Predicate predicate) + { + _predicate = predicate ?? throw new ArgumentNullException(nameof(predicate)); + } + + public override bool ShouldTrace(TraceEventCache cache, string source, TraceEventType eventType, int id, string formatOrMessage, object[] args, object data1, object[] data) + { + return _predicate(id); + } + } + } +} diff --git a/test/ExcelDna.Diagnostics.Serilog.Tests/Support/DelegatingSink.cs b/test/ExcelDna.Diagnostics.Serilog.Tests/Support/DelegatingSink.cs new file mode 100644 index 0000000..1c3c0a9 --- /dev/null +++ b/test/ExcelDna.Diagnostics.Serilog.Tests/Support/DelegatingSink.cs @@ -0,0 +1,21 @@ +using System; +using Serilog.Core; +using Serilog.Events; + +namespace ExcelDna.Diagnostics.Serilog.Tests.Support +{ + public class DelegatingSink : ILogEventSink + { + private readonly Action _write; + + public DelegatingSink(Action write) + { + _write = write ?? throw new ArgumentNullException(nameof(write)); + } + + public void Emit(LogEvent logEvent) + { + _write(logEvent); + } + } +} diff --git a/test/ExcelDna.Diagnostics.Serilog.Tests/Support/Extensions.cs b/test/ExcelDna.Diagnostics.Serilog.Tests/Support/Extensions.cs new file mode 100644 index 0000000..9c41d59 --- /dev/null +++ b/test/ExcelDna.Diagnostics.Serilog.Tests/Support/Extensions.cs @@ -0,0 +1,12 @@ +using Serilog.Events; + +namespace ExcelDna.Diagnostics.Serilog.Tests.Support +{ + public static class Extensions + { + public static object LiteralValue(this LogEventPropertyValue logEventPropertyValue) + { + return ((ScalarValue)logEventPropertyValue).Value; + } + } +} diff --git a/test/ExcelDna.Diagnostics.Serilog.Tests/Support/LogEventAssert.cs b/test/ExcelDna.Diagnostics.Serilog.Tests/Support/LogEventAssert.cs new file mode 100644 index 0000000..1201b0c --- /dev/null +++ b/test/ExcelDna.Diagnostics.Serilog.Tests/Support/LogEventAssert.cs @@ -0,0 +1,68 @@ +using System; +using System.Linq; +using Serilog.Events; +using Xunit; + +namespace ExcelDna.Diagnostics.Serilog.Tests.Support +{ + public static class LogEventAssert + { + public static void HasLevel(LogEventLevel logLevel, LogEvent logEvent) + { + if (logEvent == null) + { + throw new ArgumentNullException(nameof(logEvent)); + } + + Assert.Equal(logLevel, logEvent.Level); + } + + public static void HasMessage(string message, LogEvent logEvent) + { + if (logEvent == null) + { + throw new ArgumentNullException(nameof(logEvent)); + } + + Assert.Equal(message, logEvent.RenderMessage()); + } + + public static void HasProperty(string propertyName, LogEvent logEvent) + { + if (logEvent == null) + { + throw new ArgumentNullException(nameof(logEvent)); + } + + Assert.Contains(propertyName, logEvent.Properties); + } + + public static void HasPropertyValue(object propertyValue, string propertyName, LogEvent logEvent) + { + if (logEvent == null) + { + throw new ArgumentNullException(nameof(logEvent)); + } + + HasProperty(propertyName, logEvent); + + var value = logEvent.Properties[propertyName]; + Assert.Equal(propertyValue, value.LiteralValue()); + } + + public static void HasPropertyValueSequenceValue(object[] propertyValue, string propertyName, LogEvent logEvent) + { + if (logEvent == null) + { + throw new ArgumentNullException(nameof(logEvent)); + } + + HasProperty(propertyName, logEvent); + + var value = logEvent.Properties[propertyName]; + var sequence = ((SequenceValue) value).Elements.Select(pv => pv.LiteralValue()); + + Assert.Equal(propertyValue.Select(_ => _.ToString()), sequence); + } + } +} diff --git a/test/ExcelDna.Diagnostics.Serilog.Tests/Support/Some.cs b/test/ExcelDna.Diagnostics.Serilog.Tests/Support/Some.cs new file mode 100644 index 0000000..5856232 --- /dev/null +++ b/test/ExcelDna.Diagnostics.Serilog.Tests/Support/Some.cs @@ -0,0 +1,25 @@ +using System; +using System.Threading; + +namespace ExcelDna.Diagnostics.Serilog.Tests.Support +{ + public static class Some + { + private static int _counter; + + public static int Int() + { + return Interlocked.Increment(ref _counter); + } + + public static string String(string tag = null) + { + return (tag ?? "") + "__" + Int(); + } + + public static Guid Guid() + { + return System.Guid.NewGuid(); + } + } +}

mZvKwztF(8(uNz#TZok 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 literal 0 HcmV?d00001 diff --git a/assets/serilog-logs-seq.png b/assets/serilog-logs-seq.png new file mode 100644 index 0000000000000000000000000000000000000000..f7ced85467c01ed40afedb9f4887d3f1ee10c011 GIT binary patch literal 104211 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%0D}4^fdi47- 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 LD^el!-S7VZ@DFh- literal 0 HcmV?d00001 diff --git a/exceldna-diagnostics-serilog.sln b/exceldna-diagnostics-serilog.sln new file mode 100644 index 0000000..7b23b16 --- /dev/null +++ b/exceldna-diagnostics-serilog.sln @@ -0,0 +1,59 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.29424.173 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{73A1FB8F-ACCE-4A55-BAB8-EA4633DBC7B7}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{A4CE3700-05C7-4F68-B9D0-1BD79939142A}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "sample", "sample", "{F522FE35-1D3E-4E42-9BDA-EC5491864E3C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SampleAddIn", "sample\SampleAddIn\SampleAddIn.csproj", "{E5DDE716-6890-4AF1-9CF6-F88F5B293B0C}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ExcelDna.Diagnostics.Serilog", "src\ExcelDna.Diagnostics.Serilog\ExcelDna.Diagnostics.Serilog.csproj", "{BC12B80D-E4D4-4217-9774-BDAAF10E6637}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ExcelDna.Diagnostics.Serilog.Tests", "test\ExcelDna.Diagnostics.Serilog.Tests\ExcelDna.Diagnostics.Serilog.Tests.csproj", "{21069F11-131A-4625-9167-60F8DB81DC01}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "assets", "assets", "{34BE712A-1A08-4C06-A3E0-BA8693BEE066}" + ProjectSection(SolutionItems) = preProject + .editorconfig = .editorconfig + .gitattributes = .gitattributes + .gitignore = .gitignore + CHANGES.md = CHANGES.md + CODEOWNERS = CODEOWNERS + LICENSE = LICENSE + README.md = README.md + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {E5DDE716-6890-4AF1-9CF6-F88F5B293B0C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E5DDE716-6890-4AF1-9CF6-F88F5B293B0C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E5DDE716-6890-4AF1-9CF6-F88F5B293B0C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E5DDE716-6890-4AF1-9CF6-F88F5B293B0C}.Release|Any CPU.Build.0 = Release|Any CPU + {BC12B80D-E4D4-4217-9774-BDAAF10E6637}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BC12B80D-E4D4-4217-9774-BDAAF10E6637}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BC12B80D-E4D4-4217-9774-BDAAF10E6637}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BC12B80D-E4D4-4217-9774-BDAAF10E6637}.Release|Any CPU.Build.0 = Release|Any CPU + {21069F11-131A-4625-9167-60F8DB81DC01}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {21069F11-131A-4625-9167-60F8DB81DC01}.Debug|Any CPU.Build.0 = Debug|Any CPU + {21069F11-131A-4625-9167-60F8DB81DC01}.Release|Any CPU.ActiveCfg = Release|Any CPU + {21069F11-131A-4625-9167-60F8DB81DC01}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {E5DDE716-6890-4AF1-9CF6-F88F5B293B0C} = {F522FE35-1D3E-4E42-9BDA-EC5491864E3C} + {BC12B80D-E4D4-4217-9774-BDAAF10E6637} = {73A1FB8F-ACCE-4A55-BAB8-EA4633DBC7B7} + {21069F11-131A-4625-9167-60F8DB81DC01} = {A4CE3700-05C7-4F68-B9D0-1BD79939142A} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {3C6E8649-8A9F-4354-86BC-56789E862605} + EndGlobalSection +EndGlobal diff --git a/exceldna-diagnostics-serilog.sln.DotSettings b/exceldna-diagnostics-serilog.sln.DotSettings new file mode 100644 index 0000000..8a2fa0f --- /dev/null +++ b/exceldna-diagnostics-serilog.sln.DotSettings @@ -0,0 +1,10 @@ + + DO_NOT_SHOW + DO_NOT_SHOW + DO_NOT_SHOW + DO_NOT_SHOW + DO_NOT_SHOW + DO_NOT_SHOW + DO_NOT_SHOW + True + <Policy Inspect="True" Prefix="_" Suffix="" Style="aaBb" /> \ No newline at end of file diff --git a/sample/SampleAddIn/AddIn.cs b/sample/SampleAddIn/AddIn.cs new file mode 100644 index 0000000..5c3f3bb --- /dev/null +++ b/sample/SampleAddIn/AddIn.cs @@ -0,0 +1,42 @@ +using System; +using ExcelDna.Integration; +using ExcelDna.Logging; +using ExcelDna.Diagnostics.Serilog; +using ExcelDna.Integration.Extensibility; +using Serilog; + +namespace SampleAddIn +{ + public class AddIn : ExcelComAddIn, IExcelAddIn + { + public void AutoOpen() + { + Log.Logger = new LoggerConfiguration() + .MinimumLevel.Verbose() + .WriteTo.File($"{ExcelDnaUtil.XllPath}.log") + .WriteTo.ExcelDnaLogDisplay() + .CreateLogger(); + + // Forward any messages written by Excel-DNA to Serilog + ExcelDnaTraceSource.WriteToSerilog(); + + Log.Information("Hello from {AddInName}! :)", DnaLibrary.CurrentLibrary.Name); + LogDisplay.Show(); + + ExcelComAddInHelper.LoadComAddIn(this); + } + + public void AutoClose() + { + // Do nothing + } + + public override void OnDisconnection(ext_DisconnectMode disconnectMode, ref Array custom) + { + Log.Information("Goodbye from {AddInName}! :)", DnaLibrary.CurrentLibrary.Name); + Log.CloseAndFlush(); + + base.OnDisconnection(disconnectMode, ref custom); + } + } +} diff --git a/sample/SampleAddIn/App.config b/sample/SampleAddIn/App.config new file mode 100644 index 0000000..de16c92 --- /dev/null +++ b/sample/SampleAddIn/App.config @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sample/SampleAddIn/ExcelDna.DnaLibrary.xsd b/sample/SampleAddIn/ExcelDna.DnaLibrary.xsd new file mode 100644 index 0000000..3abe957 --- /dev/null +++ b/sample/SampleAddIn/ExcelDna.DnaLibrary.xsd @@ -0,0 +1,281 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sample/SampleAddIn/Properties/AssemblyInfo.cs b/sample/SampleAddIn/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..4e752bd --- /dev/null +++ b/sample/SampleAddIn/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("SampleAddIn")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("SampleAddIn")] +[assembly: AssemblyCopyright("Copyright © 2019 Caio Proiete & Contributors")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("e5dde716-6890-4af1-9cf6-f88f5b293b0c")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] +[assembly: AssemblyInformationalVersion("1.0.0")] diff --git a/sample/SampleAddIn/Properties/ExcelDna.Build.props b/sample/SampleAddIn/Properties/ExcelDna.Build.props new file mode 100644 index 0000000..82d6ece --- /dev/null +++ b/sample/SampleAddIn/Properties/ExcelDna.Build.props @@ -0,0 +1,70 @@ + + + + + + + + true + + + + + + + + + + + + true + true + + + + 64 + + + + + + true + + + -packed + + + diff --git a/sample/SampleAddIn/SampleAddIn.csproj b/sample/SampleAddIn/SampleAddIn.csproj new file mode 100644 index 0000000..7bb40f0 --- /dev/null +++ b/sample/SampleAddIn/SampleAddIn.csproj @@ -0,0 +1,81 @@ + + + + + Debug + AnyCPU + {E5DDE716-6890-4AF1-9CF6-F88F5B293B0C} + Library + Properties + SampleAddIn + SampleAddIn + v4.7.2 + 512 + true + + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\..\packages\ExcelDna.Integration.1.0.0\lib\ExcelDna.Integration.dll + False + + + ..\..\packages\Serilog.2.8.0\lib\net46\Serilog.dll + + + ..\..\packages\Serilog.Sinks.ExcelDnaLogDisplay.1.1.0\lib\net45\Serilog.Sinks.ExcelDnaLogDisplay.dll + + + ..\..\packages\Serilog.Sinks.File.4.1.0\lib\net45\Serilog.Sinks.File.dll + + + + + + + + + + + + + {bc12b80d-e4d4-4217-9774-bdaaf10e6637} + ExcelDna.Diagnostics.Serilog + + + + + + Designer + + + + + + + + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + + \ No newline at end of file diff --git a/sample/SampleAddIn/SampleAddIn.dna b/sample/SampleAddIn/SampleAddIn.dna new file mode 100644 index 0000000..2a90675 --- /dev/null +++ b/sample/SampleAddIn/SampleAddIn.dna @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/sample/SampleAddIn/packages.config b/sample/SampleAddIn/packages.config new file mode 100644 index 0000000..fe84baa --- /dev/null +++ b/sample/SampleAddIn/packages.config @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/src/ExcelDna.Diagnostics.Serilog/Diagnostics/Serilog/ExcelDnaTraceSource.cs b/src/ExcelDna.Diagnostics.Serilog/Diagnostics/Serilog/ExcelDnaTraceSource.cs new file mode 100644 index 0000000..dceb4dc --- /dev/null +++ b/src/ExcelDna.Diagnostics.Serilog/Diagnostics/Serilog/ExcelDnaTraceSource.cs @@ -0,0 +1,56 @@ +using System; +using System.Diagnostics; +using System.Linq; +using Serilog; + +namespace ExcelDna.Diagnostics.Serilog +{ + ///