diff --git a/README.md b/README.md index 9e4994e..61e583a 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,14 @@ This file should not be uploaded to the repository as it contains sensitive data "StorageConnectionString": "", "DatabaseCollection": "integrations", "DatabaseName": "dbintegrationlab", - "StorageContainerName": "messages" + "StorageContainerName": "messages", + "Serilog.DataDogLogs.ApiKey": "dummy", + "Serilog.DataDogLogs.Source": "azure-functions-lab", + "Serilog.DataDogLogs.Service": "some-example-functions", + "Serilog.DataDogLogs.Env": "azfn-lab", + "Serilog.DataDogLogs.Host": "azure", + "Serilog.DataDogLogs.BatchSizeLimit": 5000, + "Serilog.DataDogLogs.QueueLimit": 500000 } } ``` diff --git a/SomeExampleFunctions/Shared/SerilogConfiguration.cs b/SomeExampleFunctions/Shared/SerilogConfiguration.cs new file mode 100644 index 0000000..b429402 --- /dev/null +++ b/SomeExampleFunctions/Shared/SerilogConfiguration.cs @@ -0,0 +1,80 @@ +using Serilog; +using Serilog.Events; +using System; + +namespace SomeExampleFunctions.Shared +{ + public static class SerilogConfiguration + { + private static readonly string SinkOutputTemplate = Configuration.ValueOf("Serilog.Sink.OutputTemplate"); + + public static LoggerConfiguration Configure() + { + LoggerConfiguration configuration = GetLoggerConfiguration(); + SetLevelOverrides(configuration); + SetEnrichers(configuration); + SetConsoleSink(configuration); + SetFileSink(configuration); + SetDataDogLogsSink(configuration); + return configuration; + }//func + + private static LoggerConfiguration GetLoggerConfiguration() + { + LoggerConfiguration config = new LoggerConfiguration(); + return config; + }//func + + private static void SetLevelOverrides(LoggerConfiguration configuration) + { + configuration + .MinimumLevel.Override("Default", LogEventLevel.Information) + .MinimumLevel.Override("Microsoft", LogEventLevel.Information) + .MinimumLevel.Override("Microsoft.Hosting.Lifetime", LogEventLevel.Information); + }//func + + private static void SetEnrichers(LoggerConfiguration configuration) + { + configuration + .Enrich.FromLogContext() + .Enrich.WithThreadId() + .Enrich.WithThreadName(); + }//func + + private static void SetConsoleSink(LoggerConfiguration configuration) + { + configuration.WriteTo.Console(outputTemplate: SinkOutputTemplate); + }//func + + private static void SetFileSink(LoggerConfiguration configuration) + { + configuration.WriteTo.Async(a => + { + string appName = Configuration.ValueOf("AppName"); + a.File( + path: $"{Configuration.ValueOf("Serilog.File.BaseFilePath")}/{appName}/{appName}.txt", + fileSizeLimitBytes: Convert.ToInt64(Configuration.ValueOf("Serilog.File.FileSizeLimitBytes")), + rollOnFileSizeLimit: true, + retainedFileCountLimit: Convert.ToInt32(Configuration.ValueOf("Serilog.File.RetainedFileCountLimit")), + encoding: System.Text.Encoding.UTF8, + outputTemplate: SinkOutputTemplate + ); + }); + }//func + + private static void SetDataDogLogsSink(LoggerConfiguration configuration) + { + configuration + .WriteTo.DatadogLogs( + apiKey: Configuration.ValueOf("Serilog.DataDogLogs.ApiKey"), + source: Configuration.ValueOf("Serilog.DataDogLogs.Source"), + service: Configuration.ValueOf("Serilog.DataDogLogs.Service"), + host: Configuration.ValueOf("Serilog.DataDogLogs.Host"), + tags: new[] { $"env:{Configuration.ValueOf("Serilog.DataDogLogs.Env")}" }, + logLevel: LogEventLevel.Debug, + batchSizeLimit: Convert.ToInt32(Configuration.ValueOf("Serilog.DataDogLogs.BatchSizeLimit")), + queueLimit: Convert.ToInt32(Configuration.ValueOf("Serilog.DataDogLogs.QueueLimit")) + ); + }//func + } +} diff --git a/SomeExampleFunctions/SomeExampleFunctions.csproj b/SomeExampleFunctions/SomeExampleFunctions.csproj index c3f1ebe..f3299a0 100644 --- a/SomeExampleFunctions/SomeExampleFunctions.csproj +++ b/SomeExampleFunctions/SomeExampleFunctions.csproj @@ -4,6 +4,7 @@ v3 + @@ -11,6 +12,10 @@ + + + + @@ -36,6 +41,5 @@ - diff --git a/SomeExampleFunctions/Startup.cs b/SomeExampleFunctions/Startup.cs index a0c70af..66ab831 100644 --- a/SomeExampleFunctions/Startup.cs +++ b/SomeExampleFunctions/Startup.cs @@ -1,19 +1,27 @@ -using System; -using Azure.Storage.Blobs; using Microsoft.Azure.Functions.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Serilog; using SomeExampleFunctions.Shared; +using System; [assembly: FunctionsStartup(typeof(SomeExampleFunctions.Startup))] namespace SomeExampleFunctions { - public class Startup: FunctionsStartup - { - public override void Configure(IFunctionsHostBuilder builder) - { - builder.Services.AddHttpClient("processorApi", client => { - client.BaseAddress = new Uri(Configuration.ValueOf("MessageProcessorServiceUrl")); - }); - } - } + public class Startup : FunctionsStartup + { + public override void Configure(IFunctionsHostBuilder builder) + { + builder.Services.AddHttpClient("processorApi", client => + { + client.BaseAddress = new Uri(Configuration.ValueOf("MessageProcessorServiceUrl")); + }); + + builder.Services.AddLogging(loggingBuilder => + { + loggingBuilder.ClearProvidersExceptFunctionProviders(); + loggingBuilder.AddSerilog(SerilogConfiguration.Configure().CreateLogger()); + }); + } + } } \ No newline at end of file