From b21d7bfab79497bdc8d908ed3f0456790a11d201 Mon Sep 17 00:00:00 2001 From: runebaas Date: Tue, 24 Nov 2020 21:23:22 +0100 Subject: [PATCH] Log to datadog --- src/Core/Core.csproj | 6 +- .../LoggingAdapter/NpgsqlLoggingAdapter.cs | 19 +-- src/Core/Logger/GeekbotLogger.cs | 14 +- src/Core/Logger/IGeekbotLogger.cs | 2 +- src/Core/Logger/LoggerFactory.cs | 128 ++++++++++++------ src/Core/RunParameters.cs | 7 +- src/Web/Logging/AspLogger.cs | 18 +-- 7 files changed, 119 insertions(+), 75 deletions(-) diff --git a/src/Core/Core.csproj b/src/Core/Core.csproj index 780d0e2..c05d75c 100644 --- a/src/Core/Core.csproj +++ b/src/Core/Core.csproj @@ -23,11 +23,11 @@ - - + + + - diff --git a/src/Core/Database/LoggingAdapter/NpgsqlLoggingAdapter.cs b/src/Core/Database/LoggingAdapter/NpgsqlLoggingAdapter.cs index 8a46c0d..29acb93 100644 --- a/src/Core/Database/LoggingAdapter/NpgsqlLoggingAdapter.cs +++ b/src/Core/Database/LoggingAdapter/NpgsqlLoggingAdapter.cs @@ -1,7 +1,8 @@ using System; using Geekbot.Core.Logger; +using Microsoft.Extensions.Logging; using Npgsql.Logging; -using LogLevel = NLog.LogLevel; +using Serilog.Events; namespace Geekbot.Core.Database.LoggingAdapter { @@ -21,7 +22,7 @@ namespace Geekbot.Core.Database.LoggingAdapter public override bool IsEnabled(NpgsqlLogLevel level) { - return (_runParameters.DbLogging && _geekbotLogger.GetNLogger().IsEnabled(ToGeekbotLogLevel(level))); + return (_runParameters.DbLogging && _geekbotLogger.GetLogger().IsEnabled(ToGeekbotLogLevel(level))); } public override void Log(NpgsqlLogLevel level, int connectorId, string msg, Exception exception = null) @@ -51,16 +52,16 @@ namespace Geekbot.Core.Database.LoggingAdapter } } - private static LogLevel ToGeekbotLogLevel(NpgsqlLogLevel level) + private static LogEventLevel ToGeekbotLogLevel(NpgsqlLogLevel level) { return level switch { - NpgsqlLogLevel.Trace => LogLevel.Trace, - NpgsqlLogLevel.Debug => LogLevel.Debug, - NpgsqlLogLevel.Info => LogLevel.Info, - NpgsqlLogLevel.Warn => LogLevel.Warn, - NpgsqlLogLevel.Error => LogLevel.Error, - NpgsqlLogLevel.Fatal => LogLevel.Fatal, + NpgsqlLogLevel.Trace => LogEventLevel.Verbose, + NpgsqlLogLevel.Debug => LogEventLevel.Debug, + NpgsqlLogLevel.Info => LogEventLevel.Information, + NpgsqlLogLevel.Warn => LogEventLevel.Warning, + NpgsqlLogLevel.Error => LogEventLevel.Error, + NpgsqlLogLevel.Fatal => LogEventLevel.Fatal, _ => throw new ArgumentOutOfRangeException(nameof(level)) }; } diff --git a/src/Core/Logger/GeekbotLogger.cs b/src/Core/Logger/GeekbotLogger.cs index 652faef..d9b7752 100644 --- a/src/Core/Logger/GeekbotLogger.cs +++ b/src/Core/Logger/GeekbotLogger.cs @@ -6,13 +6,13 @@ namespace Geekbot.Core.Logger public class GeekbotLogger : IGeekbotLogger { private readonly bool _logAsJson; - private readonly NLog.Logger _logger; + private readonly Serilog.ILogger _logger; private readonly JsonSerializerSettings _serializerSettings; public GeekbotLogger(RunParameters runParameters) { - _logAsJson = !string.IsNullOrEmpty(runParameters.SumologicEndpoint) || runParameters.LogJson; - _logger = LoggerFactory.CreateNLog(runParameters); + _logAsJson = !string.IsNullOrEmpty(runParameters.DatadogApiKey) || runParameters.LogJson; + _logger = LoggerFactory.CreateLogger(runParameters); _serializerSettings = new JsonSerializerSettings { ReferenceLoopHandling = ReferenceLoopHandling.Serialize, @@ -22,21 +22,21 @@ namespace Geekbot.Core.Logger } public void Trace(LogSource source, string message, object extra = null) - => _logger.Trace(CreateLogString("Trace", source, message, null, extra)); + => _logger.Verbose(CreateLogString("Trace", source, message, null, extra)); public void Debug(LogSource source, string message, object extra = null) => _logger.Debug(CreateLogString("Debug", source, message, null, extra)); public void Information(LogSource source, string message, object extra = null) - => _logger.Info(CreateLogString("Information", source, message, null, extra)); + => _logger.Information(CreateLogString("Information", source, message, null, extra)); public void Warning(LogSource source, string message, Exception stackTrace = null, object extra = null) - => _logger.Warn(CreateLogString("Warning", source, message, stackTrace, extra)); + => _logger.Warning(CreateLogString("Warning", source, message, stackTrace, extra)); public void Error(LogSource source, string message, Exception stackTrace, object extra = null) => _logger.Error(stackTrace, CreateLogString("Error", source, message, stackTrace, extra)); - public NLog.Logger GetNLogger() => _logger; + public Serilog.ILogger GetLogger() => _logger; public bool LogAsJson() => _logAsJson; diff --git a/src/Core/Logger/IGeekbotLogger.cs b/src/Core/Logger/IGeekbotLogger.cs index 1363629..3359d10 100644 --- a/src/Core/Logger/IGeekbotLogger.cs +++ b/src/Core/Logger/IGeekbotLogger.cs @@ -9,7 +9,7 @@ namespace Geekbot.Core.Logger void Information(LogSource source, string message, object extra = null); void Warning(LogSource source, string message, Exception stackTrace = null, object extra = null); void Error(LogSource source, string message, Exception stackTrace, object extra = null); - NLog.Logger GetNLogger(); + Serilog.ILogger GetLogger(); bool LogAsJson(); } } \ No newline at end of file diff --git a/src/Core/Logger/LoggerFactory.cs b/src/Core/Logger/LoggerFactory.cs index bf3d926..d44c331 100644 --- a/src/Core/Logger/LoggerFactory.cs +++ b/src/Core/Logger/LoggerFactory.cs @@ -1,64 +1,104 @@ using System; -using System.Text; -using NLog; -using NLog.Config; -using NLog.Targets; -using SumoLogic.Logging.NLog; +using Serilog; +using Serilog.Events; +using Serilog.Sinks.Datadog.Logs; namespace Geekbot.Core.Logger { public class LoggerFactory { - public static NLog.Logger CreateNLog(RunParameters runParameters) + public static ILogger CreateLogger(RunParameters runParameters) { - var config = new LoggingConfiguration(); - var minLevel = runParameters.Verbose ? LogLevel.Trace : LogLevel.Info; - - if (!string.IsNullOrEmpty(runParameters.SumologicEndpoint)) + var logger = new LoggerConfiguration(); + var minLevel = runParameters.Verbose ? LogEventLevel.Verbose : LogEventLevel.Information; + if (!string.IsNullOrEmpty(runParameters.DatadogApiKey)) { - Console.WriteLine("Logging Geekbot Logs to Sumologic"); - config.LoggingRules.Add( - new LoggingRule("*", minLevel, LogLevel.Fatal, - new SumoLogicTarget() - { - Url = runParameters.SumologicEndpoint, - SourceName = "GeekbotLogger", - Layout = "${message}", - UseConsoleLog = false, - OptimizeBufferReuse = true, - Name = "Geekbot" - }) + // 2nd error logger + var errorLogger = new LoggerConfiguration().WriteTo.Console().CreateLogger(); + errorLogger.Information("Enabling Datadog Logger"); + + logger.WriteTo.DatadogLogs( + apiKey: runParameters.DatadogApiKey, + source: "GeekbotLogger", + service: "Geekbot", + host: Environment.MachineName, + configuration: new DatadogConfiguration() + { + Url = "https://http-intake.logs.datadoghq.eu", + Port = 443, + UseSSL = true, + UseTCP = false + }, + logLevel: minLevel, + exceptionHandler: exception => + { + var cannotSendLogEventException = exception as CannotSendLogEventException; + errorLogger.Error(cannotSendLogEventException, "Datadog Error"); + } ); } else if (runParameters.LogJson) { - config.LoggingRules.Add( - new LoggingRule("*", minLevel, LogLevel.Fatal, - new ConsoleTarget - { - Name = "Console", - Encoding = Encoding.UTF8, - Layout = "${message}" - } - ) - ); + logger.WriteTo.Console(restrictedToMinimumLevel: minLevel, outputTemplate: "{Message:lj}{NewLine}"); } else { - config.LoggingRules.Add( - new LoggingRule("*", minLevel, LogLevel.Fatal, - new ColoredConsoleTarget - { - Name = "Console", - Encoding = Encoding.UTF8, - Layout = "[${longdate} ${level:format=FirstCharacter}] ${message} ${exception:format=toString}" - } - ) - ); + logger.WriteTo.Console(restrictedToMinimumLevel: minLevel); } - var loggerConfig = new LogFactory {Configuration = config}; - return loggerConfig.GetCurrentClassLogger(); + return logger.CreateLogger(); } + + // public static NLog.Logger CreateNLog(RunParameters runParameters) + // { + // var config = new LoggingConfiguration(); + // var minLevel = runParameters.Verbose ? LogLevel.Trace : LogLevel.Info; + // + // if (!string.IsNullOrEmpty(runParameters.SumologicEndpoint)) + // { + // Console.WriteLine("Logging Geekbot Logs to Sumologic"); + // config.LoggingRules.Add( + // new LoggingRule("*", minLevel, LogLevel.Fatal, + // new SumoLogicTarget() + // { + // Url = runParameters.SumologicEndpoint, + // SourceName = "GeekbotLogger", + // Layout = "${message}", + // UseConsoleLog = false, + // OptimizeBufferReuse = true, + // Name = "Geekbot" + // }) + // ); + // } + // else if (runParameters.LogJson) + // { + // config.LoggingRules.Add( + // new LoggingRule("*", minLevel, LogLevel.Fatal, + // new ConsoleTarget + // { + // Name = "Console", + // Encoding = Encoding.UTF8, + // Layout = "${message}" + // } + // ) + // ); + // } + // else + // { + // config.LoggingRules.Add( + // new LoggingRule("*", minLevel, LogLevel.Fatal, + // new ColoredConsoleTarget + // { + // Name = "Console", + // Encoding = Encoding.UTF8, + // Layout = "[${longdate} ${level:format=FirstCharacter}] ${message} ${exception:format=toString}" + // } + // ) + // ); + // } + // + // var loggerConfig = new LogFactory {Configuration = config}; + // return loggerConfig.GetCurrentClassLogger(); + // } } } \ No newline at end of file diff --git a/src/Core/RunParameters.cs b/src/Core/RunParameters.cs index 3210587..00ff5f2 100644 --- a/src/Core/RunParameters.cs +++ b/src/Core/RunParameters.cs @@ -74,12 +74,15 @@ namespace Geekbot.Core * Intergrations * ************************************/ - [Option("sumologic", HelpText = "Sumologic endpoint for logging (default: null) (env: SUMOLOGIC)")] - public string SumologicEndpoint { get; set; } = ParamFallback("SUMOLOGIC"); + // [Option("sumologic", HelpText = "Sumologic endpoint for logging (default: null) (env: SUMOLOGIC)")] + // public string SumologicEndpoint { get; set; } = ParamFallback("SUMOLOGIC"); [Option("sentry", HelpText = "Sentry endpoint for error reporting (default: null) (env: SENTRY)")] public string SentryEndpoint { get; set; } = ParamFallback("SENTRY"); + [Option("datadog-api-key", HelpText = "Datadog API Key (default: null) (env: DATADOG_API_KEY)")] + public string DatadogApiKey { get; set; } = ParamFallback("DATADOG_API_KEY"); + /************************************ * Helper Functions * ************************************/ diff --git a/src/Web/Logging/AspLogger.cs b/src/Web/Logging/AspLogger.cs index c18a7f3..ad6fe15 100644 --- a/src/Web/Logging/AspLogger.cs +++ b/src/Web/Logging/AspLogger.cs @@ -1,6 +1,7 @@ using System; using Geekbot.Core.Logger; using Microsoft.Extensions.Logging; +using Serilog.Events; namespace Geekbot.Web.Logging { @@ -45,7 +46,7 @@ namespace Geekbot.Web.Logging public bool IsEnabled(LogLevel logLevel) { - return !_geekbotLogger.LogAsJson() && _geekbotLogger.GetNLogger().IsEnabled(ToGeekbotLogLevel(logLevel)); + return !_geekbotLogger.LogAsJson() && _geekbotLogger.GetLogger().IsEnabled(ToGeekbotLogLevel(logLevel)); } public IDisposable BeginScope(TState state) @@ -53,17 +54,16 @@ namespace Geekbot.Web.Logging return null; } - private static NLog.LogLevel ToGeekbotLogLevel(LogLevel level) + private static LogEventLevel ToGeekbotLogLevel(LogLevel level) { return level switch { - LogLevel.Trace => NLog.LogLevel.Trace, - LogLevel.Debug => NLog.LogLevel.Debug, - LogLevel.Information => NLog.LogLevel.Info, - LogLevel.Warning => NLog.LogLevel.Warn, - LogLevel.Error => NLog.LogLevel.Error, - LogLevel.Critical => NLog.LogLevel.Fatal, - LogLevel.None => NLog.LogLevel.Off, + LogLevel.Trace => LogEventLevel.Verbose, + LogLevel.Debug => LogEventLevel.Debug, + LogLevel.Information => LogEventLevel.Information, + LogLevel.Warning => LogEventLevel.Warning, + LogLevel.Error => LogEventLevel.Error, + LogLevel.Critical => LogEventLevel.Fatal, _ => throw new ArgumentOutOfRangeException(nameof(level)) }; }