This article shows how to use Microsoft patterns & practices OUT-OF-PROCESS Semantic Logging Version 2 with an Elasticsearch sink. Version 2 has breaking changes compared to version 1.1 for the Elasticsearch sink; this has been removed from the standard SLAB NuGet package… Due to this, a custom sink configuration is required and also some copy paste deployment in the windows service.
Step 1: Install Elasticsearch
When installed, you can check that it is running by browsing http://localhost:9200/ (default installation)
Step 2: Install EnterpriseLibrary Semantic Logging as a service
Download EnterpriseLibrary.SemanticLogging.Service from NuGet (at present version 2.0.1406.1), extract and copy the files to some folder on your PC and install the service using the install-packages.ps1 file in powershell.
Download EnterpriseLibrary.SemanticLogging.Elasticsearch from NuGet (at present version 2.2.5) and copy the files to the EnterpriseLibrary.SemanticLogging.Service/tools directory.
Step 3: Add the Elasticsearch custom sink to the XML configuration file.
Open the SemanticLogging-svc.xml file and add a custom sink like shown below.
<?xml version="1.0" encoding="utf-8" ?> <configuration xmlns="http://schemas.microsoft.com/practices/2013/entlib/semanticlogging/etw" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://schemas.microsoft.com/practices/2013/entlib/semanticlogging/etw SemanticLogging-svc.xsd"> <traceEventService/> <sinks> <customSink name="MyElasticsearchSink" type ="FullScale180.SemanticLogging.Sinks.ElasticsearchSink, FullScale180.SemanticLogging.Elasticsearch"> <sources> <eventSource name="TestEvents" level="LogAlways" /> </sources> <parameters> <parameter name="instanceName" type="System.String" value="damienbod" /> <parameter name="connectionString" type="System.String" value="http://localhost:9200" /> <parameter name="index" type="System.String" value="outofprocessslab" /> <parameter name="type" type="System.String" value="webapitracing" /> <parameter name="flattenPayload" type="System.Boolean" value="true" /> <parameter name="bufferInterval" type="System.TimeSpan" value="00:00:30" /> <parameter name="bufferingCount" type="System.Int32" value="10" /> <parameter name="maxBufferSize" type="System.Int32" value="500" /> <parameter name="onCompletedTimeout" type="System.TimeSpan" value="00:05:00" /> <parameter name="jsonGlobalContextExtension" type="System.String" value="null" /> </parameters> </customSink> </sinks> </configuration>
Step 4: Install and start the service
Open the command line as admin and execute the following:
SemanticLogging-svc.exe -install
Now the service should be running and ready to log. This can be checked in the services. (services.msc)
Step 5: Create a test application
Create a simple console application and add the package
“EnterpriseLibrary.SemanticLogging”: “2.0.1406.1”
Add an EventSource class which matches the configuration in the SLAB service.
[EventSource(Name = "TestEvents")] public class TestEvents : EventSource { public static readonly TestEvents Log = new TestEvents(); [Event(1, Message = "TestEvents Critical: {0}", Level = EventLevel.Critical)] public void Critical(string message) { if (IsEnabled()) WriteEvent(1, message); } [Event(2, Message = "TestEvents Error {0}", Level = EventLevel.Error)] public void Error(string message) { if (IsEnabled()) WriteEvent(2, message); } [Event(3, Message = "TestEvents Informational {0}", Level = EventLevel.Informational)] public void Informational(string message) { if (IsEnabled()) WriteEvent(3, message); } [Event(4, Message = "TestEvents LogAlways {0}", Level = EventLevel.LogAlways)] public void LogAlways(string message) { if (IsEnabled()) WriteEvent(4, message); } [Event(5, Message = "TestEvents Verbose {0}", Level = EventLevel.Verbose)] public void Verbose(string message) { if (IsEnabled()) WriteEvent(5, message); } [Event(6, Message = "TestEvents Warning {0}", Level = EventLevel.Warning)] public void Warning(string message) { if (IsEnabled()) WriteEvent(6, message); } }
Add some log messages.
using System.Diagnostics.Tracing; using Microsoft.Practices.EnterpriseLibrary.SemanticLogging; namespace Slab.Elasticsearch.Console { class Program { static void Main(string[] args) { OutOfProcessLogging(); System.Console.ReadLine(); } private static void OutOfProcessLogging() { TestEvents.Log.Critical("Hello world Out-Of-Process Critical"); TestEvents.Log.Error("Hello world Out-Of-Process Error"); TestEvents.Log.Informational("Hello world Out-Of-Process Informational"); } } }
Run the application and you should see logs in Elasticsearch:
Links:
https://github.com/fullscale180/slab-sinks
https://github.com/mspnp/semantic-logging
https://www.nuget.org/packages/EnterpriseLibrary.SemanticLogging.Service/
https://www.nuget.org/packages/EnterpriseLibrary.SemanticLogging.Elasticsearch/