|
@@ -31,7 +31,7 @@ namespace Logs
|
|
|
if (type.SubLogNames.ContainsKey(flagKey))
|
|
|
return LogManager.GetLogger(LoggerRepository.Name, type.SubLogNames[flagKey]);
|
|
|
|
|
|
- string defaultKey = string.Empty;
|
|
|
+ var defaultKey = string.Empty;
|
|
|
foreach (var key in type.SubLogNames.Keys)
|
|
|
{
|
|
|
defaultKey = key;
|
|
@@ -57,7 +57,7 @@ namespace Logs
|
|
|
/// <param name="type">日志类型</param>
|
|
|
/// <param name="message">消息</param>
|
|
|
/// <param name="flagKey">日志子项索引Key</param>
|
|
|
- public static void Info(this ILogType type, string message, string flagKey) => type.Info(message, null, flagKey);
|
|
|
+ public static void Info(this ILogType type, string message, string flagKey) => type.Info(message, null!, flagKey);
|
|
|
|
|
|
/// <summary>
|
|
|
/// 运行记录
|
|
@@ -65,7 +65,7 @@ namespace Logs
|
|
|
/// <param name="type">日志类型</param>
|
|
|
/// <param name="ex">异常</param>
|
|
|
/// <param name="flagKey">日志子项索引Key</param>
|
|
|
- public static void Info(this ILogType type, Exception ex, string flagKey) => type.Info(null, ex, flagKey);
|
|
|
+ public static void Info(this ILogType type, Exception ex, string flagKey) => type.Info(null!, ex, flagKey);
|
|
|
|
|
|
#endregion Info
|
|
|
|
|
@@ -94,7 +94,7 @@ namespace Logs
|
|
|
/// <param name="type">日志类型</param>
|
|
|
/// <param name="ex">异常</param>
|
|
|
/// <param name="flagKey">日志子项索引Key</param>
|
|
|
- public static void Error(this ILogType type, Exception ex, string flagKey) => type.Error(null, ex, flagKey);
|
|
|
+ public static void Error(this ILogType type, Exception ex, string flagKey) => type.Error(null!, ex, flagKey);
|
|
|
|
|
|
#endregion Error
|
|
|
|
|
@@ -115,7 +115,7 @@ namespace Logs
|
|
|
/// <param name="type">日志类型</param>
|
|
|
/// <param name="message">消息</param>
|
|
|
/// <param name="flagKey">日志子项索引Key</param>
|
|
|
- public static void Warn(this ILogType type, string message, string flagKey) => type.Warn(message, null, flagKey);
|
|
|
+ public static void Warn(this ILogType type, string message, string flagKey) => type.Warn(message, null!, flagKey);
|
|
|
|
|
|
/// <summary>
|
|
|
/// 警告
|
|
@@ -123,7 +123,7 @@ namespace Logs
|
|
|
/// <param name="type">日志类型</param>
|
|
|
/// <param name="ex">异常</param>
|
|
|
/// <param name="flagKey">日志子项索引Key</param>
|
|
|
- public static void Warn(this ILogType type, Exception ex, string flagKey) => type.Warn(null, ex, flagKey);
|
|
|
+ public static void Warn(this ILogType type, Exception ex, string flagKey) => type.Warn(null!, ex, flagKey);
|
|
|
|
|
|
#endregion Warn
|
|
|
|
|
@@ -141,7 +141,7 @@ namespace Logs
|
|
|
return $"[Type:{ex.GetType().Name}][StackTrace:{ex.StackTrace}][Message:{ex.Message.Replace("\r\n", " ")}]";
|
|
|
if (!string.IsNullOrEmpty(message) && ex == null)
|
|
|
return message;
|
|
|
- return $"[Message:{message}][Type:{ex.GetType().Name}][StackTrace:{ex.StackTrace}][Ex Message:{ex.Message.Replace("\r\n", " ")}]";
|
|
|
+ return $"[Message:{message}][Type:{ex!.GetType().Name}][StackTrace:{ex.StackTrace}][Ex Message:{ex.Message.Replace("\r\n", " ")}]";
|
|
|
}
|
|
|
|
|
|
#endregion 写入日志
|
|
@@ -151,25 +151,25 @@ namespace Logs
|
|
|
private static string? _configPath = "Log";
|
|
|
private static int _fileSize = 500;
|
|
|
|
|
|
- private static readonly List<ILogType> _initList = new List<ILogType>();
|
|
|
+ private static readonly List<ILogType> InitList = new List<ILogType>();
|
|
|
|
|
|
- private static readonly LogConfig _configModel = new LogConfig();
|
|
|
+ private static readonly LogConfig ConfigModel = new LogConfig();
|
|
|
|
|
|
private static bool _cleanSet = false;
|
|
|
private static string _previousCleanDay = null;
|
|
|
private static int _cleanDays = 30;
|
|
|
- private static Timer _logCleanTimer;
|
|
|
+ private static Timer? _logCleanTimer;
|
|
|
|
|
|
/// <summary>
|
|
|
/// 设置配置信息
|
|
|
/// </summary>
|
|
|
- /// <param name="logConfigs">配置信息</param>
|
|
|
+ /// <param name="logConfig">配置信息</param>
|
|
|
public static void SetConfigInfo(LogConfig logConfig)
|
|
|
{
|
|
|
SetConfigPath(logConfig.LogPath);
|
|
|
SetLogFileSize(logConfig.LogSize);
|
|
|
SetLogCleanDays(logConfig.LogDays);
|
|
|
- SetConfigInfo(logConfig.Logs);
|
|
|
+ SetConfigInfo(logConfig.Logs!);
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
@@ -187,7 +187,7 @@ namespace Logs
|
|
|
/// <param name="logConfigs">配置信息</param>
|
|
|
public static void SetConfigInfo(List<LogConfigModel> logConfigs)
|
|
|
{
|
|
|
- _configModel.Logs = logConfigs;
|
|
|
+ ConfigModel.Logs = logConfigs;
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
@@ -218,21 +218,21 @@ namespace Logs
|
|
|
/// <param name="types">日志类型数组</param>
|
|
|
public static void Init(params ILogType[] types)
|
|
|
{
|
|
|
- var addedTypes = types.Where(p => !_initList.Contains(p)).ToList();
|
|
|
+ var addedTypes = types.Where(p => !InitList.Contains(p)).ToList();
|
|
|
if (addedTypes.Count == 0)
|
|
|
return;
|
|
|
- if (_configModel.Logs == null || _configModel.Logs.Count == 0)
|
|
|
+ if (ConfigModel.Logs == null || ConfigModel.Logs.Count == 0)
|
|
|
throw new Exception("Log init, config is null.");
|
|
|
- _configPath = _configModel.Logs.FirstOrDefault(p => !string.IsNullOrEmpty(p.FileName)).FileName;
|
|
|
- XmlDocument xmlDoc = new XmlDocument();
|
|
|
+ _configPath = ConfigModel.Logs.FirstOrDefault(p => !string.IsNullOrEmpty(p.FileName))!.FileName;
|
|
|
+ var xmlDoc = new XmlDocument();
|
|
|
xmlDoc.AppendChild(xmlDoc.CreateXmlDeclaration("1.0", "UTF-8", null));
|
|
|
- XmlElement configuration = xmlDoc.CreateElement("configuration");
|
|
|
- XmlElement root = xmlDoc.CreateElement("log4net");
|
|
|
+ var configuration = xmlDoc.CreateElement("configuration");
|
|
|
+ var root = xmlDoc.CreateElement("log4net");
|
|
|
|
|
|
foreach (var item in addedTypes)
|
|
|
{
|
|
|
- _initList.Add(item);
|
|
|
- LogConfigModel config = _configModel.Logs.FirstOrDefault(p => p.Name == item.LogName);
|
|
|
+ InitList.Add(item);
|
|
|
+ var config = ConfigModel.Logs.FirstOrDefault(p => p.Name == item.LogName);
|
|
|
if (config is null)
|
|
|
{
|
|
|
config = new LogConfigModel
|
|
@@ -244,19 +244,14 @@ namespace Logs
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- if (config.SubLogNames is null)
|
|
|
- config.SubLogNames = new Dictionary<string, string>();
|
|
|
+ config.SubLogNames ??= new Dictionary<string, string>();
|
|
|
|
|
|
- foreach (var key in config.SubLogNames.Keys)
|
|
|
+ foreach (var key in config.SubLogNames.Keys.Where(key => item.SubLogNames != null && !item.SubLogNames.ContainsKey(key)))
|
|
|
{
|
|
|
- if (item.SubLogNames != null && item.SubLogNames.ContainsKey(key))
|
|
|
- continue;
|
|
|
item.SubLogNames?.Add(key, config.SubLogNames[key]);
|
|
|
}
|
|
|
- foreach (var key in item.SubLogNames.Keys)
|
|
|
+ foreach (var key in item.SubLogNames!.Keys.Where(key => !config.SubLogNames.ContainsKey(key)))
|
|
|
{
|
|
|
- if (config.SubLogNames.ContainsKey(key))
|
|
|
- continue;
|
|
|
config.SubLogNames.Add(key, item.SubLogNames[key]);
|
|
|
}
|
|
|
}
|
|
@@ -268,19 +263,16 @@ namespace Logs
|
|
|
xmlDoc.AppendChild(configuration);
|
|
|
|
|
|
//InitRepository.LoggerRepository ??= LogManager.CreateRepository("NETCoreRepository");
|
|
|
- if (LoggerRepository == null)
|
|
|
- LoggerRepository = LogManager.CreateRepository("NETCoreRepository");
|
|
|
+ LoggerRepository ??= LogManager.CreateRepository("NETCoreRepository");
|
|
|
XmlConfigurator.Configure(LoggerRepository, new StreamReader(new MemoryStream(Encoding.ASCII.GetBytes(xmlDoc.OuterXml))).BaseStream);
|
|
|
|
|
|
- if (!_cleanSet)
|
|
|
- {
|
|
|
- _cleanSet = true;
|
|
|
- _previousCleanDay = DateTime.Now.ToString("yyyyMMdd");
|
|
|
- // clean log
|
|
|
- _logCleanTimer = new Timer(1000 * 60);
|
|
|
- _logCleanTimer.Elapsed += LogCleanTimer_Elapsed;
|
|
|
- _logCleanTimer.Enabled = true;
|
|
|
- }
|
|
|
+ if (_cleanSet) return;
|
|
|
+ _cleanSet = true;
|
|
|
+ _previousCleanDay = DateTime.Now.ToString("yyyyMMdd");
|
|
|
+ // clean log
|
|
|
+ _logCleanTimer = new Timer(1000 * 60);
|
|
|
+ _logCleanTimer.Elapsed += LogCleanTimer_Elapsed;
|
|
|
+ _logCleanTimer.Enabled = true;
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
@@ -291,53 +283,53 @@ namespace Logs
|
|
|
/// <param name="config"></param>
|
|
|
private static void CreateXml(XmlDocument xmlDoc, XmlElement root, LogConfigModel config)
|
|
|
{
|
|
|
- foreach (var key in config.SubLogNames.Keys)
|
|
|
+ foreach (var key in config.SubLogNames!.Keys)
|
|
|
{
|
|
|
// 创建 Logger
|
|
|
- XmlElement logger = xmlDoc.CreateElement("logger");
|
|
|
+ var logger = xmlDoc.CreateElement("logger");
|
|
|
logger.SetAttribute("name", config.SubLogNames[key]);
|
|
|
- XmlElement level = xmlDoc.CreateElement("level");
|
|
|
+ var level = xmlDoc.CreateElement("level");
|
|
|
level.SetAttribute("value", "ALL");
|
|
|
- XmlElement appender_ref = xmlDoc.CreateElement("appender-ref");
|
|
|
- appender_ref.SetAttribute("ref", $"{config.SubLogNames[key]}Appender");
|
|
|
+ var appenderRef = xmlDoc.CreateElement("appender-ref");
|
|
|
+ appenderRef.SetAttribute("ref", $"{config.SubLogNames[key]}Appender");
|
|
|
logger.AppendChild(level);
|
|
|
- logger.AppendChild(appender_ref);
|
|
|
+ logger.AppendChild(appenderRef);
|
|
|
// 创建 Appender
|
|
|
- XmlElement appender = xmlDoc.CreateElement("appender");
|
|
|
+ var appender = xmlDoc.CreateElement("appender");
|
|
|
appender.SetAttribute("name", $"{config.SubLogNames[key]}Appender");
|
|
|
appender.SetAttribute("type", "log4net.Appender.RollingFileAppender");
|
|
|
- XmlElement param = xmlDoc.CreateElement("param");
|
|
|
+ var param = xmlDoc.CreateElement("param");
|
|
|
param.SetAttribute("name", "Encoding");
|
|
|
param.SetAttribute("value", "utf-8");
|
|
|
appender.AppendChild(param);
|
|
|
- XmlElement file = xmlDoc.CreateElement("file");
|
|
|
- file.SetAttribute("value", Path.Combine(config.FileName, config.Name));
|
|
|
+ var file = xmlDoc.CreateElement("file");
|
|
|
+ file.SetAttribute("value", Path.Combine(config.FileName!, config.Name!));
|
|
|
appender.AppendChild(file);
|
|
|
- XmlElement appendToFile = xmlDoc.CreateElement("appendToFile");
|
|
|
+ var appendToFile = xmlDoc.CreateElement("appendToFile");
|
|
|
appendToFile.SetAttribute("value", "true");
|
|
|
appender.AppendChild(appendToFile);
|
|
|
- XmlElement rollingStyle = xmlDoc.CreateElement("rollingStyle");
|
|
|
+ var rollingStyle = xmlDoc.CreateElement("rollingStyle");
|
|
|
rollingStyle.SetAttribute("value", "Composite");
|
|
|
appender.AppendChild(rollingStyle);
|
|
|
- XmlElement maxSizeRollBackups = xmlDoc.CreateElement("maxSizeRollBackups");
|
|
|
+ var maxSizeRollBackups = xmlDoc.CreateElement("maxSizeRollBackups");
|
|
|
maxSizeRollBackups.SetAttribute("value", "-1");
|
|
|
appender.AppendChild(maxSizeRollBackups);
|
|
|
- XmlElement maximumFileSize = xmlDoc.CreateElement("maximumFileSize");
|
|
|
+ var maximumFileSize = xmlDoc.CreateElement("maximumFileSize");
|
|
|
maximumFileSize.SetAttribute("value", $"{_fileSize}MB");
|
|
|
appender.AppendChild(maximumFileSize);
|
|
|
- XmlElement lockingModel = xmlDoc.CreateElement("lockingModel");
|
|
|
+ var lockingModel = xmlDoc.CreateElement("lockingModel");
|
|
|
lockingModel.SetAttribute("type", "log4net.Appender.FileAppender+MinimalLock");
|
|
|
appender.AppendChild(lockingModel);
|
|
|
- XmlElement staticLogFileName = xmlDoc.CreateElement("staticLogFileName");
|
|
|
+ var staticLogFileName = xmlDoc.CreateElement("staticLogFileName");
|
|
|
staticLogFileName.SetAttribute("value", "false");
|
|
|
appender.AppendChild(staticLogFileName);
|
|
|
- XmlElement DatePattern = xmlDoc.CreateElement("DatePattern");
|
|
|
- DatePattern.SetAttribute("value", $"/yyyyMMdd/'{config.SubLogNames[key]}.log'");
|
|
|
- appender.AppendChild(DatePattern);
|
|
|
- XmlElement layout = xmlDoc.CreateElement("layout");
|
|
|
+ var datePattern = xmlDoc.CreateElement("DatePattern");
|
|
|
+ datePattern.SetAttribute("value", $"/yyyyMMdd/'{config.SubLogNames[key]}.log'");
|
|
|
+ appender.AppendChild(datePattern);
|
|
|
+ var layout = xmlDoc.CreateElement("layout");
|
|
|
layout.SetAttribute("type", "log4net.Layout.PatternLayout");
|
|
|
- XmlElement conversionPattern = xmlDoc.CreateElement("conversionPattern");
|
|
|
- conversionPattern.SetAttribute("value", "%date [%thread] %-5level - %message%newline");
|
|
|
+ var conversionPattern = xmlDoc.CreateElement("conversionPattern");
|
|
|
+ conversionPattern.SetAttribute("value", "%date || %thread || %5level || %message ||end %newline");
|
|
|
layout.AppendChild(conversionPattern);
|
|
|
appender.AppendChild(layout);
|
|
|
|
|
@@ -355,19 +347,19 @@ namespace Logs
|
|
|
_previousCleanDay = DateTime.Now.ToString("yyyyMMdd");
|
|
|
if (!Directory.Exists(_configPath))
|
|
|
return;
|
|
|
- string[] typeDirs = Directory.GetDirectories(_configPath);
|
|
|
- for (int i = 0; i < typeDirs.Length; i++)
|
|
|
+ var typeDirs = Directory.GetDirectories(_configPath);
|
|
|
+ foreach (var t in typeDirs)
|
|
|
{
|
|
|
- string[] dateDirs = Directory.GetDirectories(typeDirs[i]);
|
|
|
- for (int j = 0; j < dateDirs.Length; j++)
|
|
|
+ var dateDirs = Directory.GetDirectories(t);
|
|
|
+ foreach (var t1 in dateDirs)
|
|
|
{
|
|
|
- string dirName = dateDirs[j].Substring(dateDirs[j].LastIndexOf('\\') + 1);
|
|
|
+ var dirName = t1[(t1.LastIndexOf('\\') + 1)..];
|
|
|
if (Convert.ToInt32(dirName) < Convert.ToInt32(DateTime.Now.AddDays(_cleanDays * -1).ToString("yyyyMMdd")))
|
|
|
- Directory.Delete(dateDirs[j], true);
|
|
|
+ Directory.Delete(t1, true);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- catch (Exception ex)
|
|
|
+ catch (Exception)
|
|
|
{
|
|
|
//LogInfo.Log.Info(ex.Message, ex, "FATAL");
|
|
|
}
|
|
@@ -375,4 +367,4 @@ namespace Logs
|
|
|
|
|
|
#endregion 初始化日志
|
|
|
}
|
|
|
-}
|
|
|
+}
|