laatzen/Common/Utils/Logging/NLogHelper.cs
Roland Drabesch 8b7f4414ce he tester
2024-11-11 11:40:55 +01:00

221 lines
9.2 KiB
C#

using NLog;
using NLog.Config;
using NLog.Targets;
using NLog.Targets.Wrappers;
using System;
using System.IO;
using System.Linq;
using Xylem.Common.CommonCore.Consts;
namespace Xylem.Common.Utils.Logging
{
[Serializable]
public static class NLogHelper
{
private static readonly String CurrentConfigDir =
Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
ProgramConfig.GenesisBaseFolder);
private const String CurrentConfigFile = ProgramConfig.NlogConfig;
public static String GetCurrentApplicationFolder()
{
return Path.Combine(Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location),
CurrentConfigFile);
}
public static String GetApplicationDataPath()
{
return Path.Combine(CurrentConfigDir, CurrentConfigFile);
}
public static readonly Lazy<XmlLoggingConfiguration> XmlConfig = new Lazy<XmlLoggingConfiguration>(() =>
{
//if file exist in ApplicationData use this
try
{
if (File.Exists(GetApplicationDataPath()))
{
return new XmlLoggingConfiguration(GetApplicationDataPath());
}
}
catch (Exception)
{
}
try
{
if (File.Exists(GetCurrentApplicationFolder()))
{
return new XmlLoggingConfiguration(GetCurrentApplicationFolder());
}
}
catch (Exception)
{
}
return null;
});
public static string GetPath(ILogger logger)
{
string fileName = "";
var target = logger.Factory.Configuration.FindTargetByName(logger.Name);
if (target != null)
{
if (target is BufferingTargetWrapper buffTarget)
{
target = buffTarget.WrappedTarget;
}
if (target is FileTarget fileTarget)
{
var logEventInfo = new LogEventInfo { TimeStamp = DateTime.Now };
fileName = fileTarget.FileName.Render(logEventInfo);
}
}
else
{
}
return fileName;
}
public static ILogger CreateOrGetLogger(String name)
{
return new LogFactory(XmlConfig.Value).GetLogger(name);
}
public static ILogger CreateOrGetMultiLogger(String ident, String identText = "Slot", String type = "Meter", String baseTarget = null, String baseRule = null)
{
//var loggerTargetName = $"Target_{type}_{identText}{ident}";
//var loggerRuleName = $"Rule_{type}_{identText}{ident}";
var loggerTargetName = $"{ident}";
var loggerRuleName = $"{ident}";
if (XmlConfig.Value.FindTargetByName(loggerTargetName) == null || !XmlConfig.Value.LoggingRules.Any(a => a.LoggerNamePattern.Equals(loggerRuleName)))
{
//No logger matches, create a new one
if (string.IsNullOrEmpty(baseTarget))
{
baseTarget = $"{type}Base";
}
if (string.IsNullOrEmpty(baseRule))
{
baseRule = $"{type}Base";
}
BufferingTargetWrapper newWrapper = null;
FileTarget newTarget;
var baseLogger = XmlConfig.Value.FindTargetByName(baseTarget);
if (baseLogger == null)
{
newTarget = new FileTarget(loggerTargetName)
{
FileName = $"{ProgramConfig.BaseLoggingPath}{type}_{identText}{ident}.log"
};
}
else
{
newTarget = new FileTarget(loggerTargetName);
if (baseLogger is BufferingTargetWrapper)
{
var baseWrapperLogger = ((BufferingTargetWrapper)baseLogger);
newWrapper = new BufferingTargetWrapper(loggerTargetName, newTarget);
newWrapper.SlidingTimeout = baseWrapperLogger.SlidingTimeout;
newWrapper.OptimizeBufferReuse = baseWrapperLogger.OptimizeBufferReuse;
newWrapper.FlushTimeout = baseWrapperLogger.FlushTimeout;
newWrapper.BufferSize = baseWrapperLogger.BufferSize;
baseLogger = ((BufferingTargetWrapper)baseLogger).WrappedTarget;
}
if (baseLogger is FileTarget)
{
var baseFileLogger = ((FileTarget)baseLogger);
newTarget.FileName = baseFileLogger.FileName.ToString().Replace("'", "").Replace("BASE", $"{identText}{ident.Replace("LedRawData", "")}");
newTarget.ArchiveFileName = baseFileLogger.ArchiveFileName.ToString().Replace("'", "").Replace("BASE", $"{identText}{ident.Replace("LedRawData", "")}");
newTarget.ArchiveAboveSize = baseFileLogger.ArchiveAboveSize;
newTarget.ArchiveDateFormat = baseFileLogger.ArchiveDateFormat;
newTarget.ArchiveEvery = baseFileLogger.ArchiveEvery;
newTarget.ArchiveFileKind = baseFileLogger.ArchiveFileKind;
newTarget.ArchiveNumbering = baseFileLogger.ArchiveNumbering;
newTarget.ArchiveOldFileOnStartup = baseFileLogger.ArchiveOldFileOnStartup;
newTarget.AutoFlush = baseFileLogger.AutoFlush;
newTarget.BufferSize = baseFileLogger.BufferSize;
newTarget.CleanupFileName = baseFileLogger.CleanupFileName;
newTarget.ConcurrentWriteAttemptDelay = baseFileLogger.ConcurrentWriteAttemptDelay;
newTarget.ConcurrentWriteAttempts = baseFileLogger.ConcurrentWriteAttempts;
newTarget.ConcurrentWrites = baseFileLogger.ConcurrentWrites;
newTarget.CreateDirs = baseFileLogger.CreateDirs;
newTarget.DeleteOldFileOnStartup = baseFileLogger.DeleteOldFileOnStartup;
newTarget.DiscardAll = baseFileLogger.DiscardAll;
newTarget.EnableArchiveFileCompression = baseFileLogger.EnableArchiveFileCompression;
newTarget.EnableFileDelete = baseFileLogger.EnableFileDelete;
newTarget.Encoding = baseFileLogger.Encoding;
newTarget.FileAttributes = baseFileLogger.FileAttributes;
newTarget.FileNameKind = baseFileLogger.FileNameKind;
newTarget.Footer = baseFileLogger.Footer;
newTarget.ForceManaged = baseFileLogger.ForceManaged;
newTarget.ForceMutexConcurrentWrites = baseFileLogger.ForceMutexConcurrentWrites;
newTarget.Header = baseFileLogger.Header;
newTarget.KeepFileOpen = baseFileLogger.KeepFileOpen;
newTarget.Layout = baseFileLogger.Layout;
newTarget.LineEnding = baseFileLogger.LineEnding;
newTarget.MaxArchiveFiles = baseFileLogger.MaxArchiveFiles;
//newTarget.maxLogFilenames = baseFileLogger.maxLogFilenames;
newTarget.NetworkWrites = baseFileLogger.NetworkWrites;
newTarget.OpenFileCacheSize = baseFileLogger.OpenFileCacheSize;
newTarget.OpenFileCacheTimeout = baseFileLogger.OpenFileCacheTimeout;
newTarget.OptimizeBufferReuse = baseFileLogger.OptimizeBufferReuse;
newTarget.ReplaceFileContentsOnEachWrite = baseFileLogger.ReplaceFileContentsOnEachWrite;
newTarget.WriteFooterOnArchivingOnly = baseFileLogger.WriteFooterOnArchivingOnly;
}
}
Target setupDoneOnTarget = newTarget;
if (newWrapper != null)
{
XmlConfig.Value.AddTarget(newWrapper.Name, newWrapper);
setupDoneOnTarget = newWrapper;
}
else
{
XmlConfig.Value.AddTarget(newTarget.Name, newTarget);
}
var newBaseRule = XmlConfig.Value.LoggingRules.FirstOrDefault(f => f.LoggerNamePattern.Equals(baseRule));
LoggingRule newRule;
if (newBaseRule == null)
{
newRule = new LoggingRule(loggerRuleName, LogLevel.Debug, setupDoneOnTarget);
}
else
{
newRule = new LoggingRule(loggerRuleName, newBaseRule.Levels.Min(), setupDoneOnTarget);
}
XmlConfig.Value.LoggingRules.Add(newRule);
}
var t = new LogFactory(XmlConfig.Value).GetLogger(loggerRuleName);
return t;
}
}
}