C # рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рд╕реЗ рд▓реЙрдЧ рдПрдХрддреНрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧреНрд░реЗрд▓реЙрдЧ рдФрд░ NLog рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред рдирд┐рдЬреА рдЕрдиреБрднрд╡


KDPV

Habr, рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ!

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдПрдХ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдпрд╛ рд╕рд░реНрд╡реЛрддреНрддрдо рдЕрднреНрдпрд╛рд╕ рдирд╣реАрдВ рд╣реИ ред рдореИрдВрдиреЗ рдХреЗрд╡рд▓ рдкреНрд░рд╢реНрди рдореЗрдВ рдЕрдкрдиреА рдЙрдкрд▓рдмреНрдзрд┐рдпреЛрдВ рдХреЛ рдПрдХрддреНрд░ рдХрд░рдиреЗ рдФрд░ рджрд╕реНрддрд╛рд╡реЗрдЬ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред

рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЗрд╕ рд▓реЗрдЦ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреБрдЫ рдирдпрд╛ рд╕реАрдЦрдиреЗ рдпрд╛ рдХреБрдЫ рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЙрдЧрд┐рдВрдЧ рдкрд░ рдЬрд╛рдирдХрд╛рд░реА рдорд╛рдВрдЧрдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЛ рдЕрдиреБрдорддрд┐ рджреЗрдЧреА ред рдФрд░, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдореБрдЭреЗ рд╕рдореБрджрд╛рдп рд╕реЗ рд░рдЪрдирд╛рддреНрдордХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдорд┐рд▓рдиреЗ рдХреА рдЙрдореНрдореАрдж рд╣реИред рдпрд╣ рдХреБрдЫ рдмреЗрд╣рддрд░ рдХрд░рдиреЗ рдХрд╛ рдореМрдХрд╛ рджреЗрддрд╛ рд╣реИред

рдХрд┐рд╕ рд▓рд┐рдП? рдХрд┐рд╕рдХреЗ рд▓рд┐рдП?


рдореИрдВ рдпрд╣ рдмрддрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рд▓реЙрдЧрд┐рдВрдЧ рдореЗрд░реЗ рдЕрдкрдиреЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ рдХреНрдпрд╛ рд╣реИ:
рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛрдб рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди рдПрдХ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдпрд╛ рдирдХрд╛рд░рд╛рддреНрдордХ рдШрдЯрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдорд╛рдирд╡-рдкрдардиреАрдп рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рд╕рд╣реЗрдЬрдирд╛, рд╕рдВрднрд╡рддрдГ рдШрдЯрдирд╛ рдХреЗ рд╕рдордп рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдЧреБрдгрд╛рддреНрдордХ рдпрд╛ рдорд╛рддреНрд░рд╛рддреНрдордХ рд╕рдВрдХреЗрддрдХреЛрдВ рдФрд░ рдбреЗрдЯрд╛ рдХреЗ рд╕рдВрд░рдХреНрд╖рдг рдХреЗ рд╕рд╛рдеред
рдПрдХ рдЬрдЯрд┐рд▓ рд╕реВрддреНрд░реАрдХрд░рдг рд╕рд╛рдордиреЗ рдЖрдпрд╛, рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд▓реЙрдЧ рдмрдирд╛рдиреЗ рдФрд░ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рдХрд╛рд░реНрдп рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред рдЙрдЪреНрдЪ-рдЧреБрдгрд╡рддреНрддрд╛ рд╡рд╛рд▓реЗ рд▓реЙрдЧрд┐рдВрдЧ рд╕реЗ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдЕрдкрдиреЗ рдЬреАрд╡рди рдХреЗ рдХрд┐рд╕реА рднреА рдЪрд░рдг рдореЗрдВ рдХреЛрдб рдХреА рдЖрдВрддрд░рд┐рдХ рд╕реНрдерд┐рддрд┐ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓рддреА рд╣реИ: рдбрд┐рдмрдЧ рд╕реЗ рд▓реЗрдХрд░ рдЙрдкрднреЛрдХреНрддрд╛ рдХреЗ рдХрдВрдкреНрдпреВрдЯрд░ рдХреЗ рдЕрдЬреНрдЮрд╛рдд рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рд╕реНрдерд╛рдкрдирд╛ рддрдХред

рдЦреИрд░, рдЖрдЗрдП рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдореИрдВ рдХреИрд╕реЗ рд▓реЙрдЧ рд▓рд┐рдЦрддрд╛ рд╣реВрдВред

рдЙрдкрдХрд░рдг


рд╣рдо " рдбреЗрдЯрд╛рдмреЗрд╕ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИ ," " рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рд╣реЗрдЬрдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓, " рдФрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рд░реВрдк рдореЗрдВ рдХрдо-рдЬрд╛рдирдХрд╛рд░реАрдкреВрд░реНрдг рдкрд╛рда рд╕рдВрджреЗрд╢реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓реЙрдЧрд┐рдВрдЧ рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓реЙрдЧ рдмрдирд╛рдирд╛ рдЖрд╕рд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдХреЛрдб рдпрд╛ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕рд╛рд░ рдФрд░ рд╕реНрд░реЛрддреЛрдВ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рд╡реЗ рдЕрдХреНрд╕рд░ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред рдХреБрдЫ рдмрд┐рдВрджреБ рдкрд░, рд╣рд░ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдХреЗрд╡рд▓ рд╕рдВрд░рдЪрд┐рдд рд▓реЙрдЧрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдЖрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдореЗрд░реЗ рдЕрдЪреНрдЫреЗ рджреЛрд╕реНрдд рдФрд░ рдЖрдИрдЯреА рдЧреБрд░реБ рдиреЗ рдореБрдЭрд╕реЗ рдХрд╣рд╛ рдерд╛: " рд╕рдм рдХреБрдЫ рдЗрдХрдЯреНрдард╛ рдХрд░реЛ, рдлрд┐рд░ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдХреЛ рдмрд╛рд╣рд░ рдХрд░реЛ ... " рд╡рд┐рд╢рд┐рд╖реНрдЯ рд░реВрдкрд░реЗрдЦрд╛ рд╣рдореЗрдВ рдЗрд╕рдореЗрдВ рдорджрдж рдХрд░реЗрдЧреАред

рдЙрдирдореЗрдВ рд╕реЗ рдХрд╛рдлреА рд╣реИрдВред рдЙрдирдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдореЗрдВ рд╕рдорд╛рди рдХреНрд╖рдорддрд╛рдПрдВ рдФрд░ рд╕реАрдорд╛рдПрдВ рд╣реИрдВред рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд▓реЗрдЦ рдФрд░ рд╕рдореАрдХреНрд╖рд╛рдПрдВ рд▓рд┐рдЦреА рдЧрдИ рд╣реИрдВред, рддреБрд▓рдирд╛ рдФрд░ рдореИрдиреБрдЕрд▓ред C # рдореЗрдВ рд▓рд┐рдЦреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рд▓реЙрдЧ рдЗрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдПрдХ рдмрд╛рд░ NLog рдХреЛ рдЪреБрдирд╛ ред рдЕрдм рдореБрдЭреЗ рдпрд╣ рдпрд╛рдж рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡рд╣ рдХреНрдпреЛрдВ рдерд╛, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд╣реА рд╣реБрдЖред

рдЗрд╕ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдореЗрдВ рдмрд╣реБрдд рдЕрдЪреНрдЫреЗ рдкреНрд░рд▓реЗрдЦрди рдФрд░ рдмреЗрд╣рдж рдЙрдкрдпреЛрдЧреА рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рд╣реИрдВ ред рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдордп рдкрд░ рдФрд░ рд╡рд┐рднрд┐рдиреНрди рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЛрдВ рд╕реЗ NLog рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рд▓реЗрдХрд┐рди рдХреБрдЫ рдмрд┐рдВрджреБ рдкрд░ рдПрдХ рдХреЛрдб рдХрд╛ рдЬрдиреНрдо рд╣реБрдЖ рдЬреЛ рдЕрдм рдПрдХ рд╕реНрдирд┐рдкреЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИред

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


рд╡реНрдпрд╛рдкрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП! рдХреЛрдб рджрд┐рдЦрд╛рдПрдВ:
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Text;
using Newtonsoft.Json;
using NLog;
using NLog.Config;
using NLog.Layouts;
using NLog.Targets;
using NLog.Targets.GraylogHttp;
using NLog.Targets.Wrappers;

namespace BIMLIB.Converter
{
	public static class BimlibLogger
	{
		private static readonly ApplicationSettings _settings = BimlibSettingsManager.Instance.AppSettings;
		private static Lazy<LogFactory> _instance = null;
		private static LoggingConfiguration _logConfig = null;

		private static Lazy<LogFactory> Instance
		{
			get
			{
				return _instance ?? (_instance = new Lazy<LogFactory>(BuildLogFactory));
			}
		}

		public static Logger GetLogger()
		{
			return Instance.Value.GetCurrentClassLogger();
		}

		private static LogFactory BuildLogFactory()
		{
			LoggingConfiguration config = _logConfig ?? new LoggingConfiguration();
			//     .   .
			string headerStr = _settings.LogHeader;
			//    .       - , : https://github.com/drewnoakes/figgle
			Layout header = headerStr;

			//      : https://nlog-project.org/config/?tab=layout-renderers
			//     :
			// -   : 2020-04-24 19:13:51.1620 [BIMLIB.Converter.MainClass.Main] -> I : Service starting...
			// -  : 2020-04-22 09:55:33.1132 [BIMLIB.Converter.Converter.ClearFile] -> E : mscorlib
			//{
			//	"Type":"System.IO.FileNotFoundException", "Message":" 'D:\\path\\to\\file\\file_name.ifc'  .", "FileName":"D:\\path\\to\\file\\file_name.ifc", "Data":{
			//	}, "TargetSite":"Void WinIOError(Int32, System.String)", "StackTrace":"    System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)\r\n    System.IO.FileInfo.get_Length()\r\n    BIMLIB.Converter.Converter.ClearFile(String path)", "Source":"mscorlib", "HResult":-2147024894}

			Layout layout = "${longdate} [${callsite:className=true:includeNamespace=true:fileName=false:includeSourcePath=false:methodName=true:cleanNamesOfAnonymousDelegates=true:cleanNamesOfAsyncContinuations=true}] -> ${level:format=FirstCharacter} : ${message}${onexception:inner=${newline}${exception:format=@}}";

			#region Targets ----------------------------

			#region FileTarget ----------------------------

			Target fileTarget = FileTarget(header, layout).MakeAsyncTarget();
			config.AddTarget(fileTarget);
			config.AddRuleForAllLevels(fileTarget);

			#endregion

			#region ConsoleTarget ----------------------------

			Target consoleTarget = ConsoleTarget(header, layout).MakeAsyncTarget();
			config.AddTarget(consoleTarget);
			config.AddRuleForAllLevels(consoleTarget);

			#endregion

			#region DebuggerTarget ----------------------------

			Target debugTarget = DebuggerTarget(header, layout).MakeAsyncTarget();
			config.AddTarget(debugTarget);
			config.AddRuleForAllLevels(debugTarget);

			#endregion

			#region GelfTarget ----------------------------

			//       Graylog  ,    
			if (_settings.Statistics)
			{
				Target gelfTarget = GelfTarget(headerStr).MakeAsyncTarget();
				config.AddTarget(gelfTarget);
				config.AddRuleForAllLevels(gelfTarget);
			}

			#endregion

			#endregion

			LogFactory logFactory = new LogFactory
			{
				Configuration = config
			};

			try
			{
				// ,           
				config.LoggingRules.ToList().ForEach(r => r.SetLoggingLevels(LogLevel.AllLevels.Min(), LogLevel.AllLevels.Max()));

				_logConfig = config;
			}
			catch (Exception ex)
			{
				//  ,        
				Debug.Write(ex);
			}

			return logFactory;
		}

		#region Target Methods

		private static FileTarget FileTarget(Layout header, Layout layout)
		{
			#region FileTarget ----------------------------

			FileTarget fileTarget = new FileTarget("log_file_target")
			{
				ArchiveAboveSize = 1048576,
				ArchiveDateFormat = "yyyy.MM.dd_HH.mm.ss",
				ArchiveEvery = FileArchivePeriod.Day,
				ArchiveFileName = GetApplicationLogAndArchivePath(false),
				ArchiveNumbering = ArchiveNumberingMode.Date,
				ArchiveOldFileOnStartup = false,
				AutoFlush = true,
				ConcurrentWrites = true,
				DeleteOldFileOnStartup = false,
				EnableArchiveFileCompression = true,
				EnableFileDelete = true,
				Encoding = Encoding.UTF8,
				FileName = GetApplicationLogAndArchivePath(true),
				Header = header,
				Layout = layout,
				MaxArchiveFiles = 100,
				OpenFileCacheTimeout = 30,
				OpenFileFlushTimeout = 30,
				OptimizeBufferReuse = true
			};

			#endregion

			return fileTarget;
		}

		private static ColoredConsoleTarget ConsoleTarget(Layout header, Layout layout)
		{
			#region ConsoleTarget ----------------------------

			ColoredConsoleTarget consoleTarget = new ColoredConsoleTarget("log_console_target")
			{
				Encoding = Encoding.UTF8,
				EnableAnsiOutput = false,

				UseDefaultRowHighlightingRules = true,

				Layout = layout,
				Header = header
			};

			ConsoleWordHighlightingRule dateHighLightRule = new ConsoleWordHighlightingRule
			{
				Regex = @"^(?=\d).+(?=\s\[)",
				ForegroundColor = ConsoleOutputColor.Yellow
			};

			ConsoleWordHighlightingRule methodsHighLightRule = new ConsoleWordHighlightingRule
			{
				Regex = @"(?<=\[).+(?=\])",
				ForegroundColor = ConsoleOutputColor.Blue
			};

			ConsoleWordHighlightingRule levelHighLightRule = new ConsoleWordHighlightingRule
			{
				Regex = @"(?<=>).+(?=\s:)",
				ForegroundColor = ConsoleOutputColor.Red
			};

			ConsoleWordHighlightingRule messageHighLightRule = new ConsoleWordHighlightingRule
			{
				Regex = @"(?<=\s:\s).+",
				ForegroundColor = ConsoleOutputColor.Green
			};

			consoleTarget.WordHighlightingRules.Add(dateHighLightRule);
			consoleTarget.WordHighlightingRules.Add(methodsHighLightRule);
			consoleTarget.WordHighlightingRules.Add(levelHighLightRule);
			consoleTarget.WordHighlightingRules.Add(messageHighLightRule);

			#endregion

			return consoleTarget;
		}

		private static DebuggerTarget DebuggerTarget(Layout header, Layout layout)
		{
			#region DebuggerTarget ----------------------------

			DebuggerTarget debugTarget = new DebuggerTarget("log_debug_target")
			{
				Layout = layout,
				Header = header
			};

			#endregion

			return debugTarget;
		}

		private static GraylogHttpTarget GelfTarget(string header)
		{
			#region GelfTarget ----------------------------

			Layout gelfCommonLayout = "${message}";

			IList<TargetPropertyWithContext> gelfParameterInfos =
				new List<TargetPropertyWithContext>()
				{
					//     : https://nlog-project.org/config/?tab=layout-renderers
					new TargetPropertyWithContext()  { Name = "appdomain", Layout = "${appdomain}" },
					new TargetPropertyWithContext()  { Name = "assembly-version", Layout = "${assembly-version}" },
					new TargetPropertyWithContext()  { Name = "activityid", Layout = "${activityid}" },
					new TargetPropertyWithContext()  { Name = "callsite", Layout = "${callsite}" },
					new TargetPropertyWithContext()  { Name = "callsite-linenumber", Layout = "${callsite-linenumber}" },
					new TargetPropertyWithContext()  { Name = "environment-user", Layout = "${environment-user:userName=true:domain=true}" },
					new TargetPropertyWithContext()  { Name = "exeption_json_data", Layout = "${onexception:inner=${exception:format=@}}" },
					new TargetPropertyWithContext()  { Name = "frameWorkInfo", Layout = $"{RuntimeInformation.FrameworkDescription} ({RuntimeInformation.ProcessArchitecture})" },
					new TargetPropertyWithContext()  { Name = "guid", Layout = "${guid:format=N}" },
					new TargetPropertyWithContext()  { Name = "hostname", Layout = "${hostname}" },
					new TargetPropertyWithContext()  { Name = "identity", Layout = "${identity:authType=true:separator=\n:name=true:isAuthenticated=true}" },
					new TargetPropertyWithContext()  { Name = "level_name", Layout = "${level:format=Name}" },
					new TargetPropertyWithContext()  { Name = "local-ip", Layout = "${local-ip:addressFamily=InterNetwork}" },
					new TargetPropertyWithContext()  { Name = "logger", Layout = "${logger:shortName=false}" },
					new TargetPropertyWithContext()  { Name = "machinename", Layout = "${machinename}" },
					new TargetPropertyWithContext()  { Name = "osInfo", Layout = $"{RuntimeInformation.OSDescription} ({RuntimeInformation.OSArchitecture})" },
					new TargetPropertyWithContext()  { Name = "processid", Layout = "${processid}" },
					new TargetPropertyWithContext()  { Name = "processinfo_MainWindowHandle", Layout = "${processinfo:property=MainWindowHandle}" },
					new TargetPropertyWithContext()  { Name = "processinfo_PagedMemorySize", Layout = "${processinfo:property=PagedMemorySize}" },
					new TargetPropertyWithContext()  { Name = "processname", Layout = "${processname:fullName=true}" },
					new TargetPropertyWithContext()  { Name = "processtime", Layout = "${processtime:invariant=false}" },
					new TargetPropertyWithContext()  { Name = "sequenceid", Layout = "${sequenceid}" },
					new TargetPropertyWithContext()  { Name = "stacktrace", Layout = "${stacktrace:format=Raw:topFrames=3:skipFrames=0:separator=
}" },
					new TargetPropertyWithContext()  { Name = "threadid", Layout = "${threadid}" },
					new TargetPropertyWithContext()  { Name = "threadname", Layout = "${threadname}" },
					new TargetPropertyWithContext()  { Name = "timestamp", Layout = $"{DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()}" },
					new TargetPropertyWithContext()  { Name = "timestamp_local", Layout = @"${date:universalTime=false:format=yyyy-MM-dd HH\:mm\:ss zzz}" },
					new TargetPropertyWithContext()  { Name = "windows-identity", Layout = "${windows-identity:userName=true:domain=true}" }
				};

			GraylogHttpTarget gelfUdpTarget = new GraylogHttpTarget
			{
				AddNLogLevelName = true,
				Facility = header,
				GraylogServer = _settings.LogServerAddress,
				IncludeCallSite = true,
				IncludeCallSiteStackTrace = true,
				IncludeEventProperties = true,
				Layout = gelfCommonLayout,
				Name = "GelfHttp",
				OptimizeBufferReuse = true
			};

			foreach (TargetPropertyWithContext gelfParameterInfo in gelfParameterInfos)
			{
				gelfUdpTarget.ContextProperties.Add(gelfParameterInfo);
			}

			#endregion

			return gelfUdpTarget;
		}

		//   https://github.com/nlog/NLog/wiki/AsyncWrapper-target    
		private static Target MakeAsyncTarget(this Target targ)
		{
			return new AsyncTargetWrapper
			{
				BatchSize = 100,
				ForceLockingQueue = true,
				FullBatchSizeWriteLimit = 5,
				Name = targ.Name,
				OptimizeBufferReuse = true,
				OverflowAction = AsyncTargetWrapperOverflowAction.Grow,
				QueueLimit = 10000,
				TimeToSleepBetweenBatches = 1,
				WrappedTarget = targ
			};
		}

		#endregion

		private static string GetApplicationLogAndArchivePath(bool isLog)
		{
			string addition;

			if (!isLog)
			{
				addition = ".{#}.zip";
			}
			else
			{
				addition = ".log";
			}

			try
			{
				if (!Directory.Exists(_settings.LogsFolder))
				{
					Directory.CreateDirectory(_settings.LogsFolder);
				}

				return Path.Combine(_settings.LogsFolder, _settings.ProductName + addition);
			}
			catch (Exception ex)
			{
				Debug.Write(ex);
				return string.Empty;
			}
		}
}

рдЙрдкрдпреЛрдЧ рдЙрджрд╛рд╣рд░рдг:
using NLog;
...

public static class Downloader
	{
		...
		private static readonly Logger log = BimlibLogger.GetLogger();
		...
		public static string GetFileToConvert(ConverterRequest.Inputitem inputItem)
		{
			...
			try
			{
				...
				log.Debug($"Downloaded file: {downloadedFile}, size: {new FileInfo(downloadedFile).Length / 1e6}Mb");
			}
			catch (Exception ex)
			{
				log.Error(ex, ex.Source);
				return ...;
			}
		}
	}

рдХреБрдЫ рд╡рд┐рд╡рд░рдг


рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдирдВрдЧреЗ рдХреЛрдб, рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдХрдИ рд╕рдореНрдореЗрд▓рдиреЛрдВ рдФрд░ рдорд╛рдиреНрдпрддрд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛:

  1. _settings - рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреА рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╡рд╕реНрддреБред рдпрд╣ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреИрд╕реЗ рдмрдирддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд▓рдХрдбрд╝рд╣рд╛рд░реЗ рдХреА рдкрд╣рд▓реА рдЖрд░рдВрднреАрдХрд░рдг рд╕реЗ рдкрд╣рд▓реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
  2. _logConfig - NLog рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди, рдПрдХ рдЕрд▓рдЧ NLog.config рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд╣реАрдВ , рдмрд▓реНрдХрд┐ рд╕реАрдзреЗ рдХреЛрдб рдореЗрдВред

рдЬреИрд╕рд╛ рдХрд┐ рдкреНрд░рд▓реЗрдЦрди рдХрд╣рддрд╛ рд╣реИ :
рдпрджрд┐ рдПрдХ (рдпрд╛ рдЕрдзрд┐рдХ) NLog рд▓рдХреНрд╖реНрдп рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ NLog рдХреЗрд╡рд▓ рдЙрддреНрдкрд╛рджрди рдХрд░реЗрдЧрд╛ред
рджрд░рдЕрд╕рд▓, рдЯрд╛рд░рдЧреЗрдЯ рдореЗрдердбреНрд╕ рдХреНрд╖реЗрддреНрд░ рдХреА рд╡рд┐рдзрд┐рдпрд╛рдБ рдЗрди "рд▓рдХреНрд╖реНрдпреЛрдВ" рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░ рд╣реИрдВ:

рдлрд╝рд╛рдЗрд▓рдЯрд╛рд░реНрдЧ - рдПрдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд▓реЙрдЧ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдПред

рд▓реЙрдЧ рдлрд╝рд╛рдЗрд▓ рдХреИрд╕реА рджрд┐рдЦрддреА рд╣реИ?

ColoredConsoleTarget - рдХрдВрд╕реЛрд▓ рдХреЛ (рдпрджрд┐ рдХреЛрдИ рд╣реЛ) "рд╕реБрдВрджрд░" рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред

рд░рдВрдЧ рдХрдВрд╕реЛрд▓ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ?

рдбреАрдмрдЧрд░ рдЯрд╛рд░реНрдЧреЗрдЯ - рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ рдЖрдЙрдЯрдкреБрдЯ рд╡рд┐рдВрдбреЛ рдореЗрдВ рд▓рдХрдбрд╝рд╣рд╛рд░рд╛ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╛ рдбреАрдмрдЧ рдореЛрдб рдореЗрдВ рдерд░реНрдб рдкрд╛рд░реНрдЯреА рдХрдиреЗрдХреНрдЯреЗрдб рдбреАрдмрдЧрд░ рдХреЗ рд▓рд┐рдПред

рдбрд┐рдмрдЧрд░ рдореЗрдВ NLog рд╕рдВрджреЗрд╢ рдХреНрдпрд╛ рджрд┐рдЦрддреЗ рд╣реИрдВ?

GraylogHttpTarget - рд▓рдХреНрд╖реНрдп рд╡рд╣рд╛рдБ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдП рдЧрдП рдЧреНрд░реЗрд▓реЙрдЧ рдХреЗ рд╕рд╛рде рд╕рд░реНрд╡рд░ рдХреЛ рд╕рдВрджреЗрд╢ рднреЗрдЬрдирд╛ рд╣реИ ред

рдЧреНрд░реЗрд▓реЙрдЧ рд╕рдВрджреЗрд╢ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ?

рд╣реЗрдмрд░ рдкрд░ рдЕрдкрдиреЗ рдкрд╣рд▓реЗ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВрдиреЗ рдЧреНрд░реЗрд▓рд╛рдЧ рдХреЗ рдЙрдкрдпреЛрдЧ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИред рдореИрдВ рд╕реВрдЪреА рдХреЗ рдЕрдВрддрд┐рдо рд▓рдХреНрд╖реНрдп рдкрд░ рдзреНрдпрд╛рди рдХреЗрдиреНрджреНрд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рдпрд╣ рд╡рд╣ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ NLog рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реЗ рдЧреНрд░реЗрд▓рд╛рдЧ рд╕реЗрд╡рд╛ рдореЗрдВ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдореИрдВ рдЖрдкрдХреЛ рдпрд╣ рдмрддрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдореБрдЭреЗ рдпрд╣ рдЙрдкрдХрд░рдг рдХреИрд╕рд╛ рд▓рдЧрд╛ред

рдЧреНрд░реЗрд▓реЙрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ (рдереЛрдбрд╝рд╛)


рд╕реЗрд╡рд╛ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рд╡рд░рдг рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдореИрдВ рдХреЗрд╡рд▓ рдпрд╣ рдХрд╣ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕реЗ рдбреЙрдХрдЯрд░ рдореЗрдВ рддреИрдирд╛рдд рдХрд┐рдпрд╛ рд╣реИред рдпрд╣ рднреА рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИ :

рдореИрдВ рдЖрдкрдХреЛ рдЕрдкрдиреА рд░рдЪрдирд╛ рдлрд╝рд╛рдЗрд▓ рджреЗрддрд╛ рд╣реВрдБ
version: '2'
services:
  # MongoDB: https://hub.docker.com/_/mongo/
  mongodb:
    image: mongo:4
    restart: always
    volumes:
    - mongo_data:/data/db:rw
    - /etc/localtime:/etc/localtime  
  # Elasticsearch: https://www.elastic.co/guide/en/elasticsearch/reference/6.x/docker.html
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch-oss:6.8.2
    restart: always
    volumes:
    - es_data:/usr/share/elasticsearch/data:rw
    - /etc/localtime:/etc/localtime
    environment:
      - http.host=0.0.0.0
      - transport.host=localhost
      - network.host=0.0.0.0
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    mem_limit: 1g
  # Graylog: https://hub.docker.com/r/graylog/graylog/
  # Graylog: I want to have the lastest
  graylog:
    image: graylog/graylog:3.2
    restart: always
    volumes:
    - graylog_data:/usr/share/graylog/data/journal:rw
    - /etc/localtime:/etc/localtime
# :   .     - 
    - /home/MYUSER/graylog-data/plugin/graylog-plugin-telegram-notification-2.3.0.jar:/usr/share/graylog/plugin/graylog-plugin-telegram-notification-2.3.0.jar
    environment:
      # CHANGE ME (must be at least 16 characters)!
      - GRAYLOG_PASSWORD_SECRET=somepasswordpepper
      # Password: MYPASSWORD
      - GRAYLOG_ROOT_PASSWORD_SHA2=SHA2MYPASSWORDPLEASEINANYONLINESERVICE
      - GRAYLOG_HTTP_BIND_ADDRESS=0.0.0.0:9999
      - GRAYLOG_WEB_LISTEN_URI=http://my.ex.ipa.dr:9999/
      - GRAYLOG_HTTP_EXTERNAL_URI=http://my.ex.ipa.dr:9999/
      - GRAYLOG_HTTP_PUBLISH_URI=http://my.ex.ipa.dr:9999/
      - GRAYLOG_ROOT_TIMEZONE=Europe/Moscow
      - GRAYLOG_PLUGIN_DIR=plugin
    links:
      - mongodb:mongo
      - elasticsearch
    depends_on:
      - mongodb
      - elasticsearch
    ports:
      - 5044:5044
      # Graylog web interface and REST API
      - 9999:9999
      # Syslog TCP
      - 1514:1514
      # Syslog UDP
      - 1514:1514/udp
      # GELF TCP
      - 12201:12201
      # GELF UDP
      - 12201:12201/udp
      #Volumes
volumes:
  mongo_data:
    driver: local
  es_data:
    driver: local
  graylog_data:
    driver: local

рдореИрдВ "рдЗрдирдкреБрдЯ" рдХреА рд╕реНрдерд╛рдкрдирд╛ рдЧреНрд░реЗрдЧреНрд▓реЙрдЧ рдореЗрдВ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рднреА рдЬреЛрдбрд╝реВрдВрдЧрд╛:

рдЧреНрд░реЗрдЧреЙрдЧ http 12 рдкреЛрд░реНрдЯ рдкрд░ http рдЯреНрд░реИрдлрд╝рд┐рдХ рдкрд░ рд╕реБрдирддрд╛ рд╣реИ


Graylog nodes accept data via inputs. Launch or terminate as many inputs as you want here.


my.web.adress.domain 12201 -, . ...

рдЬреАрдИрдПрд▓рдПрдл рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ


GELF - Graylog рд▓реЙрдЧ рд╕реНрд╡рд░реВрдк рд╡рд┐рд╕реНрддрд╛рд░рд┐рддред рд╕рдВрджреЗрд╢реЛрдВ рдХрд╛ рд╡рд╣ рд╕реНрд╡рд░реВрдк рдЬреЛ рдЧреНрд░реЗрдЧрд▓ рдорд╛рдирддрд╛ рд╣реИред

рдХреБрдЫ рдирд┐рд╢реНрдЪрд┐рдд рдпреВрдЖрд░рдПрд▓ рдореЗрдВ GELF рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдХреБрдЫ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд▓рдХреНрд╖реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА ред рдЙрдиреНрд╣реЗрдВ рдкреНрд░рд▓реЗрдЦрди рдХреЗ рдПрдХреАрдХрд░рдг рдЦрдВрдб рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ред рдореИрдВрдиреЗ NLog.Targets.GraylogHttp рдХреЛ рдЪреБрдирд╛ ред рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рд╕реНрдерд╛рдкрд┐рдд nuget рдФрд░ рдЗрд╕рдХреЗ рд▓рдХрдбрд╝рд╣рд╛рд░рд╛ рдХреЗ рд╡рд┐рдиреНрдпрд╛рд╕ рдореЗрдВ NLog.Targets.GraylogHttp.GraylogHttpTarget рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ ред рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд▓реЗрдЖрдЙрдЯ , рдореИрдВрдиреЗ рдПрдХ рд╕рдВрджреЗрд╢ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдпрд╛ рд╣реИ , рд▓реЗрдХрд┐рди ContextProperties рдХреЛ рдЕрдкрдиреЗ рд▓рдХреНрд╖реНрдп рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреА рд╡рд┐рд╕реНрддреГрдд рд╢реНрд░реГрдВрдЦрд▓рд╛:





new TargetPropertyWithContext()  { Name = "someParamName1", Layout = "someStringInfo" },
new TargetPropertyWithContext()  { Name = "someParamName2", Layout = "someNLogLayoutRendered" },
new TargetPropertyWithContext()  { Name = "someParamName3", Layout = (string)SomeMethodThatGetsInfo() }
рдореИрдВрдиреЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛: "рдордирдорд╛рдирд╛ рдирд╛рдо + рдордирдорд╛рдирд╛ рдореВрд▓реНрдп"ред рдореВрд▓реНрдп рдХреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдХрд┐рд╕реА рднреА рд╡рд┐рдзрд┐ рд╕реЗ "рдЦрдирди" рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдпрд╛ рд╕рд┐рд╕реНрдЯрдо рдбреНрд░рд╛рдЗрд╡ рдкрд░ рдореБрдлреНрдд рд╕реНрдерд╛рди рдкрдврд╝рдирд╛ред рдЬреЛ рдХреБрдЫ ...

рдмрдХреНрд╢реАрд╢


рдПрдХ рд░рд╛рдп рд╣реИ (рдФрд░ рдореИрдВ рдЗрд╕реЗ рд╡рд┐рд╡рд╛рдж рдирд╣реАрдВ рдХрд░рддрд╛) рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкрдХрдбрд╝рддреЗ рд╕рдордп рд▓реЙрдЧ рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рд╣реЛрддреЗ рд╣реИрдВред рдХреЛрд╢рд┐рд╢ / рдкрдХрдбрд╝ рдирд┐рд░реНрдорд╛рдг рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЦреБрдж рдХреЛ рд╕рд╣реА рдард╣рд░рд╛рддреЗ рд╣реИрдВред "рддреНрд░реБрдЯрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ" рд╕реНрд╡рдпрдВ рдбрд┐рдмрдЧрд┐рдВрдЧ рдЬрд╛рдирдХрд╛рд░реА, рдШрдЯрдирд╛рдУрдВ рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдбреЗрдЯрд╛ рдЬрдм рдпрд╣ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдЕрдиреНрдп рд╕реЗ рднрд░рд╛ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдкрдврд╝рдиреЗ рдореЗрдВ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рдРрд╕реА рд╡рд╕реНрддреБ рд╣рдореЗрд╢рд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреА рд╣реИред

рдЕрдкрдиреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛:

рдЧреНрд░реЗрдЧрд░реЙрдЧ рд╕реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдХрдбрд╝рд╣рд╛рд░рд╛ рд╡рд░реНрдЧ рдХреЛ рдмреЛрдирд╕ рд╡рд┐рдзрд┐:
// -. ,    Graylog    - .
		//     objWithProps -            json (  GELF)...
		public static LogEventInfo GetLogEventWithProperties(LogLevel logLevel, string logName, string message, object objWithProps)
		{
			//     ,      
			if (string.IsNullOrEmpty(message))
			{
				message = objWithProps?.GetType()?.Name ?? "custom_json_data";
			}

			LogEventInfo e = new LogEventInfo(logLevel, logName, message);

			object logEventProperty = null;
			//     Newtonsoft.Json: https://www.newtonsoft.com/json
			JsonSerializerSettings jsonSerializerSettings = new JsonSerializerSettings
			{
				ReferenceLoopHandling = ReferenceLoopHandling.Serialize,
				PreserveReferencesHandling = PreserveReferencesHandling.Objects,
				NullValueHandling = NullValueHandling.Include
			};

			try
			{
				//  ""  ()   ...
				logEventProperty = JsonConvert.SerializeObject(objWithProps, Formatting.Indented, jsonSerializerSettings);
			}
			catch (Exception ex)
			{
				Debug.Write(ex);

				try
				{
					// ...,   :  ,   , ...
					IEnumerable<PropertyInfo> objProps = objWithProps?.GetType()?.GetProperties()?.Where(p => p?.GetGetMethod()?.GetParameters()?.Length == 0);

					if (objProps?.Any() == true)
					{
						// ...   ,...
						Dictionary<string, string> objPropsDict =
							objProps
							.ToDictionary(
								x => x?.Name,
								x =>
								{
									string rezVal = string.Empty;
									try
									{
										rezVal = x?.GetValue(objWithProps, null)?.ToString();
									}
									catch (Exception ex0)
									{
										Debug.Write(ex0);
									}
									return rezVal;
								}
							)?
							.OrderBy(x => x.Key)?
							.ToDictionary(obj => obj.Key, obj => obj.Value);
						// ...   Newtonsoft.Json
						logEventProperty = JsonConvert.SerializeObject(objPropsDict, Formatting.Indented, jsonSerializerSettings);
					}
				}
				catch (Exception ex1)
				{
					Debug.Write(ex1);
				}
			}
			//   json-,  Graylog      .
			e.Properties["custom_json_data"] = logEventProperty;
			return e;
		}


рдЙрдкрдпреЛрдЧ рдЙрджрд╛рд╣рд░рдг:
log.Debug(BimlibLogger.GetLogEventWithProperties(LogLevel.Debug, log.Name, $"Got the task", message));


рдЧреНрд░реЗрд▓реЙрдЧ рдореЗрдВ рдпрд╣ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ?
exeption_json_data тАФ exception, json.



exception, .



рдкрд░рд┐рдгрд╛рдо


рд╡рд░реНрдгрд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдФрд░ рдХреЛрдб рдХреЗ рд╢рд░реАрд░ рдореЗрдВ рд▓рдХрдбрд╝рд╣рд╛рд░рд╛ рдХреЙрд▓ рдХреЗ рдЙрдЪрд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдореЗрдВ рдкрдврд╝рдиреЗ, рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдФрд░ рдЙрдирдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рдХреЗрдВрджреНрд░реАрдХреГрдд рд▓реЙрдЧ рд╕рдВрдЧреНрд░рд╣ рдорд┐рд▓рддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд▓реЙрдЧ рдореЗрдВ рдХреБрдЫ рдореВрд▓реНрдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реВрдЪрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЙрдкрдХрд░рдг рд╣реИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕рд╛рдорд╛рдиреНрдп рд▓реЙрдЧ-рдлрд╛рдЗрд▓реЗрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рдлрд┐рд░ рд╕реЗ рдкрдврд╝рд╛ рднреА рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдЧрд╛рдпрдм рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред рдпрд╣ рдирд┐рдЧрд░рд╛рдиреА рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рддрд┐рдпреЛрдЧреА рдпрд╛ рдПрдХ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдм рд╕реНрдерд┐рддрд┐ "рдореЗрд░рд╛ рдЖрд╡реЗрджрди 3 + рд╡рд┐рджреЗрд╢реА рднрд╛рд╖рд╛ рд╡рд╛рд▓реЗ рджреЗрд╢реЛрдВ рдореЗрдВ 100 + рдмрд╣реБрдд рдЕрд▓рдЧ рдХрдВрдкреНрдпреВрдЯрд░реЛрдВ рдкрд░ рдЪрд▓рддрд╛ рд╣реИ рдФрд░ рдЕрдЪрд╛рдирдХ рдХрд╣реАрдВ рдЯреВрдЯ рдЬрд╛рддрд╛ рд╣реИ" рдереЛрдбрд╝рд╛ рдЖрд╕рд╛рди рдФрд░ рдмрд╣реБрдд рддреЗрдЬреА рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдпрд╣ рд╕рдм рд╣реИ?


рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдореИрдВрдиреЗ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдЖрд░рд╛рдорджрд╛рдпрдХ рд▓реЙрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рдм рдХреБрдЫ рдмрддрд╛рдпрд╛ред рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░, рд╕реБрдЭрд╛рд╡ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред

рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдЖрдкрдХреЛ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдорд┐рд▓рддреЗ рд╣реИрдВред

UPD : рд╕рд▓рд╛рд╣ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП AsyncWrapper рд▓рдХреНрд╖реНрдп рдЬреЛрдбрд╝реЗjustmara

All Articles