Decompiled source of Serilog Sinks Map v2.0.0

BepInEx/core/Serilog.Sinks.Map/netstandard2.0/Serilog.Sinks.Map.dll

Decompiled 3 weeks ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using Microsoft.CodeAnalysis;
using Serilog.Configuration;
using Serilog.Core;
using Serilog.Events;
using Serilog.Sinks.Map;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: InternalsVisibleTo("Serilog.Sinks.Map.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100fb8d13fd344a1c6fe0fe83ef33c1080bf30690765bc6eb0df26ebfdf8f21670c64265b30db09f73a0dea5b3db4c9d18dbf6d5a25af5ce9016f281014d79dc3b4201ac646c451830fc7e61a2dfd633d34c39f87b81894191652df5ac63cc40c77f3542f702bda692e6e8a9158353df189007a49da0f3cfd55eb250066b19485ec")]
[assembly: TargetFramework(".NETStandard,Version=v2.0", FrameworkDisplayName = ".NET Standard 2.0")]
[assembly: AssemblyCompany("Serilog Contributors")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyCopyright("Copyright © Serilog Contributors")]
[assembly: AssemblyDescription("A Serilog sink wrapper that dispatches events based on a property value.")]
[assembly: AssemblyFileVersion("2.0.0.0")]
[assembly: AssemblyInformationalVersion("2.0.0+5cff06e49235500f641296a4a8e8a56be7788dfe")]
[assembly: AssemblyProduct("Serilog.Sinks.Map")]
[assembly: AssemblyTitle("Serilog.Sinks.Map")]
[assembly: AssemblyVersion("2.0.0.0")]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableAttribute : Attribute
	{
		public readonly byte[] NullableFlags;

		public NullableAttribute(byte P_0)
		{
			NullableFlags = new byte[1] { P_0 };
		}

		public NullableAttribute(byte[] P_0)
		{
			NullableFlags = P_0;
		}
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableContextAttribute : Attribute
	{
		public readonly byte Flag;

		public NullableContextAttribute(byte P_0)
		{
			Flag = P_0;
		}
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace Serilog
{
	public static class MapLoggerConfigurationExtensions
	{
		public static LoggerConfiguration Map(this LoggerSinkConfiguration loggerSinkConfiguration, string keyPropertyName, string defaultKey, Action<string, LoggerSinkConfiguration> configure, int? sinkMapCountLimit = null, LogEventLevel restrictedToMinimumLevel = 0, LoggingLevelSwitch? levelSwitch = null)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			string keyPropertyName2 = keyPropertyName;
			string defaultKey2 = defaultKey;
			return loggerSinkConfiguration.Map((Func<LogEvent, string>)delegate(LogEvent le)
			{
				if (le.Properties.TryGetValue(keyPropertyName2, out var value))
				{
					ScalarValue val = (ScalarValue)(object)((value is ScalarValue) ? value : null);
					if (val != null)
					{
						return val.Value?.ToString() ?? defaultKey2;
					}
				}
				return defaultKey2;
			}, configure, sinkMapCountLimit, restrictedToMinimumLevel, levelSwitch);
		}

		public static LoggerConfiguration Map<TKey>(this LoggerSinkConfiguration loggerSinkConfiguration, string keyPropertyName, TKey defaultKey, Action<TKey, LoggerSinkConfiguration> configure, int? sinkMapCountLimit = null, LogEventLevel restrictedToMinimumLevel = 0, LoggingLevelSwitch? levelSwitch = null)
		{
			//IL_0053: Unknown result type (might be due to invalid IL or missing references)
			string keyPropertyName2 = keyPropertyName;
			TKey defaultKey2 = defaultKey;
			if (loggerSinkConfiguration == null)
			{
				throw new ArgumentNullException("loggerSinkConfiguration");
			}
			if (keyPropertyName2 == null)
			{
				throw new ArgumentNullException("keyPropertyName");
			}
			if (configure == null)
			{
				throw new ArgumentNullException("configure");
			}
			return loggerSinkConfiguration.Map(delegate(LogEvent le)
			{
				if (le.Properties.TryGetValue(keyPropertyName2, out var value))
				{
					ScalarValue val = (ScalarValue)(object)((value is ScalarValue) ? value : null);
					if (val != null)
					{
						object value2 = val.Value;
						if (value2 is TKey)
						{
							return (TKey)value2;
						}
					}
				}
				return defaultKey2;
			}, configure, sinkMapCountLimit, restrictedToMinimumLevel, levelSwitch);
		}

		public static LoggerConfiguration Map<TKey>(this LoggerSinkConfiguration loggerSinkConfiguration, Func<LogEvent, TKey> keySelector, Action<TKey, LoggerSinkConfiguration> configure, int? sinkMapCountLimit = null, LogEventLevel restrictedToMinimumLevel = 0, LoggingLevelSwitch? levelSwitch = null)
		{
			//IL_006e: Unknown result type (might be due to invalid IL or missing references)
			Func<LogEvent, TKey> keySelector2 = keySelector;
			if (loggerSinkConfiguration == null)
			{
				throw new ArgumentNullException("loggerSinkConfiguration");
			}
			if (keySelector2 == null)
			{
				throw new ArgumentNullException("keySelector");
			}
			if (configure == null)
			{
				throw new ArgumentNullException("configure");
			}
			if (sinkMapCountLimit.HasValue && sinkMapCountLimit.GetValueOrDefault() < 0)
			{
				throw new ArgumentOutOfRangeException("sinkMapCountLimit");
			}
			return loggerSinkConfiguration.Sink((ILogEventSink)(object)new MappedSink<TKey>((LogEvent logEvent, [MaybeNull] out TKey key) =>
			{
				key = keySelector2(logEvent);
				return true;
			}, configure, sinkMapCountLimit), restrictedToMinimumLevel, levelSwitch);
		}

		public static LoggerConfiguration Map(this LoggerSinkConfiguration loggerSinkConfiguration, string keyPropertyName, Action<string?, LoggerSinkConfiguration> configure, int? sinkMapCountLimit = null, LogEventLevel restrictedToMinimumLevel = 0, LoggingLevelSwitch? levelSwitch = null)
		{
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			string keyPropertyName2 = keyPropertyName;
			return loggerSinkConfiguration.Map(delegate(LogEvent le, out string? key)
			{
				if (le.Properties.TryGetValue(keyPropertyName2, out var value))
				{
					ScalarValue val = (ScalarValue)(object)((value is ScalarValue) ? value : null);
					if (val != null)
					{
						key = val.Value?.ToString();
						return true;
					}
				}
				key = null;
				return false;
			}, configure, sinkMapCountLimit, restrictedToMinimumLevel, levelSwitch);
		}

		public static LoggerConfiguration Map<TKey>(this LoggerSinkConfiguration loggerSinkConfiguration, string keyPropertyName, Action<TKey, LoggerSinkConfiguration> configure, int? sinkMapCountLimit = null, LogEventLevel restrictedToMinimumLevel = 0, LoggingLevelSwitch? levelSwitch = null)
		{
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			string keyPropertyName2 = keyPropertyName;
			if (loggerSinkConfiguration == null)
			{
				throw new ArgumentNullException("loggerSinkConfiguration");
			}
			if (keyPropertyName2 == null)
			{
				throw new ArgumentNullException("keyPropertyName");
			}
			if (configure == null)
			{
				throw new ArgumentNullException("configure");
			}
			return loggerSinkConfiguration.Map<TKey>(delegate(LogEvent le, out TKey? key)
			{
				if (le.Properties.TryGetValue(keyPropertyName2, out var value))
				{
					ScalarValue val = (ScalarValue)(object)((value is ScalarValue) ? value : null);
					if (val != null && val.Value is TKey val2)
					{
						key = val2;
						return true;
					}
				}
				key = default(TKey);
				return false;
			}, configure, sinkMapCountLimit, restrictedToMinimumLevel, levelSwitch);
		}

		public static LoggerConfiguration Map<TKey>(this LoggerSinkConfiguration loggerSinkConfiguration, KeySelector<TKey> keySelector, Action<TKey, LoggerSinkConfiguration> configure, int? sinkMapCountLimit = null, LogEventLevel restrictedToMinimumLevel = 0, LoggingLevelSwitch? levelSwitch = null)
		{
			//IL_0051: Unknown result type (might be due to invalid IL or missing references)
			if (loggerSinkConfiguration == null)
			{
				throw new ArgumentNullException("loggerSinkConfiguration");
			}
			if (keySelector == null)
			{
				throw new ArgumentNullException("keySelector");
			}
			if (configure == null)
			{
				throw new ArgumentNullException("configure");
			}
			if (sinkMapCountLimit.HasValue && sinkMapCountLimit.GetValueOrDefault() < 0)
			{
				throw new ArgumentOutOfRangeException("sinkMapCountLimit");
			}
			return loggerSinkConfiguration.Sink((ILogEventSink)(object)new MappedSink<TKey>(keySelector, configure, sinkMapCountLimit), restrictedToMinimumLevel, levelSwitch);
		}
	}
}
namespace Serilog.Sinks.Map
{
	public delegate bool KeySelector<TKey>(LogEvent logEvent, [MaybeNull] out TKey key);
	internal class MappedSink<TKey> : ILogEventSink, IDisposable
	{
		private readonly KeySelector<TKey> _keySelector;

		private readonly Action<TKey, LoggerSinkConfiguration> _configure;

		private readonly int? _sinkMapCountLimit;

		private readonly object _sync = new object();

		private readonly Dictionary<KeyValuePair<TKey, bool>, ILogEventSink> _sinkMap = new Dictionary<KeyValuePair<TKey, bool>, ILogEventSink>();

		private bool _disposed;

		public MappedSink(KeySelector<TKey> keySelector, Action<TKey, LoggerSinkConfiguration> configure, int? sinkMapCountLimit)
		{
			_keySelector = keySelector;
			_configure = configure;
			_sinkMapCountLimit = sinkMapCountLimit;
		}

		public void Emit(LogEvent logEvent)
		{
			if (!_keySelector(logEvent, out var key2))
			{
				return;
			}
			KeyValuePair<TKey, bool> key = new KeyValuePair<TKey, bool>(key2, value: false);
			lock (_sync)
			{
				if (_disposed)
				{
					throw new ObjectDisposedException("MappedSink", "The mapped sink has been disposed.");
				}
				if (_sinkMap.TryGetValue(key, out ILogEventSink value))
				{
					value.Emit(logEvent);
					return;
				}
				ILogEventSink val = LoggerSinkConfiguration.CreateSink((Action<LoggerSinkConfiguration>)delegate(LoggerSinkConfiguration wt)
				{
					_configure(key.Key, wt);
				});
				if (_sinkMapCountLimit == 0)
				{
					using (val as IDisposable)
					{
						val.Emit(logEvent);
						return;
					}
				}
				if (!_sinkMapCountLimit.HasValue || _sinkMapCountLimit > _sinkMap.Count)
				{
					_sinkMap[key] = val;
					val.Emit(logEvent);
					return;
				}
				_sinkMap[key] = val;
				try
				{
					val.Emit(logEvent);
				}
				finally
				{
					while (_sinkMap.Count > _sinkMapCountLimit.Value)
					{
						foreach (KeyValuePair<TKey, bool> key3 in _sinkMap.Keys)
						{
							if (!key.Equals(key3))
							{
								ILogEventSink obj = _sinkMap[key3];
								_sinkMap.Remove(key3);
								(obj as IDisposable)?.Dispose();
								break;
							}
						}
					}
				}
			}
		}

		public void Dispose()
		{
			lock (_sync)
			{
				if (!_disposed)
				{
					_disposed = true;
					ILogEventSink[] array = _sinkMap.Values.ToArray();
					_sinkMap.Clear();
					ILogEventSink[] array2 = array;
					for (int i = 0; i < array2.Length; i++)
					{
						(array2[i] as IDisposable)?.Dispose();
					}
				}
			}
		}
	}
}
namespace System.Diagnostics.CodeAnalysis
{
	[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, Inherited = false)]
	[ExcludeFromCodeCoverage]
	[DebuggerNonUserCode]
	internal sealed class AllowNullAttribute : Attribute
	{
	}
	[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, Inherited = false)]
	[ExcludeFromCodeCoverage]
	[DebuggerNonUserCode]
	internal sealed class DisallowNullAttribute : Attribute
	{
	}
	[AttributeUsage(AttributeTargets.Method, Inherited = false)]
	[ExcludeFromCodeCoverage]
	[DebuggerNonUserCode]
	internal sealed class DoesNotReturnAttribute : Attribute
	{
	}
	[AttributeUsage(AttributeTargets.Parameter, Inherited = false)]
	[ExcludeFromCodeCoverage]
	[DebuggerNonUserCode]
	internal sealed class DoesNotReturnIfAttribute : Attribute
	{
		public bool ParameterValue { get; }

		public DoesNotReturnIfAttribute(bool parameterValue)
		{
			ParameterValue = parameterValue;
		}
	}
	[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter | AttributeTargets.ReturnValue, Inherited = false)]
	[ExcludeFromCodeCoverage]
	[DebuggerNonUserCode]
	internal sealed class MaybeNullAttribute : Attribute
	{
	}
	[AttributeUsage(AttributeTargets.Parameter, Inherited = false)]
	[ExcludeFromCodeCoverage]
	[DebuggerNonUserCode]
	internal sealed class MaybeNullWhenAttribute : Attribute
	{
		public bool ReturnValue { get; }

		public MaybeNullWhenAttribute(bool returnValue)
		{
			ReturnValue = returnValue;
		}
	}
	[AttributeUsage(AttributeTargets.Method | AttributeTargets.Property, Inherited = false, AllowMultiple = true)]
	[ExcludeFromCodeCoverage]
	[DebuggerNonUserCode]
	internal sealed class MemberNotNullAttribute : Attribute
	{
		public string[] Members { get; }

		public MemberNotNullAttribute(string member)
		{
			Members = new string[1] { member };
		}

		public MemberNotNullAttribute(params string[] members)
		{
			Members = members;
		}
	}
	[AttributeUsage(AttributeTargets.Method | AttributeTargets.Property, Inherited = false, AllowMultiple = true)]
	[ExcludeFromCodeCoverage]
	[DebuggerNonUserCode]
	internal sealed class MemberNotNullWhenAttribute : Attribute
	{
		public bool ReturnValue { get; }

		public string[] Members { get; }

		public MemberNotNullWhenAttribute(bool returnValue, string member)
		{
			ReturnValue = returnValue;
			Members = new string[1] { member };
		}

		public MemberNotNullWhenAttribute(bool returnValue, params string[] members)
		{
			ReturnValue = returnValue;
			Members = members;
		}
	}
	[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter | AttributeTargets.ReturnValue, Inherited = false)]
	[ExcludeFromCodeCoverage]
	[DebuggerNonUserCode]
	internal sealed class NotNullAttribute : Attribute
	{
	}
	[AttributeUsage(AttributeTargets.Property | AttributeTargets.Parameter | AttributeTargets.ReturnValue, AllowMultiple = true, Inherited = false)]
	[ExcludeFromCodeCoverage]
	[DebuggerNonUserCode]
	internal sealed class NotNullIfNotNullAttribute : Attribute
	{
		public string ParameterName { get; }

		public NotNullIfNotNullAttribute(string parameterName)
		{
			ParameterName = parameterName;
		}
	}
	[AttributeUsage(AttributeTargets.Parameter, Inherited = false)]
	[ExcludeFromCodeCoverage]
	[DebuggerNonUserCode]
	internal sealed class NotNullWhenAttribute : Attribute
	{
		public bool ReturnValue { get; }

		public NotNullWhenAttribute(bool returnValue)
		{
			ReturnValue = returnValue;
		}
	}
}