using System.Diagnostics;
using System.Runtime.CompilerServices;
using KH.WMS.Core.Logging.LogEnums;
namespace KH.WMS.Core.Logging;
///
/// 日志模块自动识别器
///
public static class LogModuleDetector
{
///
/// 模块命名空间映射配置
///
private static readonly Dictionary NamespaceModuleMapping = new(StringComparer.OrdinalIgnoreCase)
{
// 基础设施层
["KH.WMS.Core.Api"] = LogModule.Api,
["KH.WMS.Core.Database"] = LogModule.Database,
["KH.WMS.Core.Cache"] = LogModule.Cache,
["KH.WMS.Core.Authentication"] = LogModule.Auth,
["KH.WMS.Core.Security"] = LogModule.Auth,
["KH.WMS.Core.Middleware"] = LogModule.Core,
["KH.WMS.Core.BackgroundServices"] = LogModule.Job,
["KH.WMS.Core.Logging"] = LogModule.Core,
// WMS 业务层 - 入库管理
["KH.WMS.Core.Inbound"] = LogModule.WMS_Inbound,
["KH.WMS.Core.Receiving"] = LogModule.WMS_Inbound,
["KH.WMS.Core.PutAway"] = LogModule.WMS_Inbound,
["KH.WMS.Core.Quality"] = LogModule.WMS_Inbound,
// WMS 业务层 - 出库管理
["KH.WMS.Core.Outbound"] = LogModule.WMS_Outbound,
["KH.WMS.Core.Picking"] = LogModule.WMS_Picking,
["KH.WMS.Core.Packing"] = LogModule.WMS_Outbound,
["KH.WMS.Core.Shipping"] = LogModule.WMS_Outbound,
["KH.WMS.Core.Loading"] = LogModule.WMS_Loading,
// WMS 业务层 - 库存管理
["KH.WMS.Core.Inventory"] = LogModule.WMS_Inventory,
["KH.WMS.Core.Stock"] = LogModule.WMS_Inventory,
["KH.WMS.Core.Stocktaking"] = LogModule.WMS_Counting,
["KH.WMS.Core.Counting"] = LogModule.WMS_Counting,
// WMS 业务层 - 基础数据
["WMKH.WMS.CoreS.Owner"] = LogModule.WMS_Owner,
["KH.WMS.Core.Product"] = LogModule.WMS_Product,
["KH.WMS.Core.Sku"] = LogModule.WMS_Product,
["KH.WMS.Core.Warehouse"] = LogModule.WMS_Warehouse,
["KH.WMS.Core.Zone"] = LogModule.WMS_Zone,
["KH.WMS.Core.Location"] = LogModule.WMS_Location,
// WMS 业务层 - 其他
["KH.WMS.Core.Transfer"] = LogModule.WMS_Transfer,
["KH.WMS.Core.Move"] = LogModule.WMS_Transfer,
["KH.WMS.Core.Wave"] = LogModule.WMS_Wave,
["KH.WMS.Core.Unloading"] = LogModule.WMS_Unloading,
["KH.WMS.Core.Processing"] = LogModule.WMS_Processing,
["KH.WMS.Core.Replenishment"] = LogModule.WMS_Replenishment,
["KH.WMS.Core.Strategy"] = LogModule.WMS_Strategy,
["KH.WMS.Core.Order"] = LogModule.WMS_Order,
["KH.WMS.Core.Transport"] = LogModule.WMS_Transport,
["KH.WMS.Core.Billing"] = LogModule.WMS_Billing,
["KH.WMS.Core.Report"] = LogModule.WMS_Report,
// TODO
// 通用业务层
["Application.Services"] = LogModule.Business,
["Domain.Services"] = LogModule.Business,
["Core.Services"] = LogModule.Business,
// API 层
["Controllers"] = LogModule.Api,
["Api"] = LogModule.Api,
["Controllers.Api"] = LogModule.Api,
// 外部服务
["External"] = LogModule.External,
["ThirdParty"] = LogModule.External,
["Integration"] = LogModule.External,
// 文件处理
["File"] = LogModule.File,
["Storage"] = LogModule.File,
["Upload"] = LogModule.File,
["Download"] = LogModule.File,
};
///
/// 从调用栈中自动识别模块
///
/// 跳过的帧数(默认跳过 LoggerService 内部调用)
/// 识别出的模块,默认返回 Core
public static LogModule DetectModule(int skipFrames = 2)
{
try
{
var stackTrace = new StackTrace(skipFrames, false);
for (int i = 0; i < stackTrace.FrameCount; i++)
{
var frame = stackTrace.GetFrame(i);
if (frame == null) continue;
var namespaceName = frame.GetMethod()?.DeclaringType?.Namespace;
if (string.IsNullOrEmpty(namespaceName)) continue;
// 跳过日志系统本身的命名空间
if (namespaceName.StartsWith("KH.WMS.Core.Logging", StringComparison.OrdinalIgnoreCase) ||
namespaceName.StartsWith("Microsoft.Extensions.Logging", StringComparison.OrdinalIgnoreCase))
{
continue;
}
// 查找匹配的模块
var module = FindModuleByNamespace(namespaceName);
if (module != LogModule.Core)
{
return module;
}
}
return LogModule.Core;
}
catch
{
return LogModule.Core;
}
}
///
/// 根据命名空间查找对应的模块
///
private static LogModule FindModuleByNamespace(string namespaceName)
{
// 完全匹配
if (NamespaceModuleMapping.TryGetValue(namespaceName, out var module))
{
return module;
}
// 前缀匹配
foreach (var mapping in NamespaceModuleMapping)
{
if (namespaceName.StartsWith(mapping.Key, StringComparison.OrdinalIgnoreCase))
{
return mapping.Value;
}
}
// 默认返回业务模块
if (namespaceName.Contains("Service", StringComparison.OrdinalIgnoreCase) ||
namespaceName.Contains("Domain", StringComparison.OrdinalIgnoreCase) ||
namespaceName.Contains("Application", StringComparison.OrdinalIgnoreCase))
{
return LogModule.Business;
}
return LogModule.Core;
}
///
/// 从类型推断模块
///
public static LogModule DetectModuleFromType(Type type)
{
if (type == null) return LogModule.Core;
var namespaceName = type.Namespace;
return string.IsNullOrEmpty(namespaceName) ? LogModule.Core : FindModuleByNamespace(namespaceName);
}
///
/// 添加自定义命名空间映射
///
/// 命名空间前缀
/// 对应的模块
public static void AddMapping(string namespacePrefix, LogModule module)
{
NamespaceModuleMapping[namespacePrefix] = module;
}
///
/// 批量添加命名空间映射
///
public static void AddMappings(Dictionary mappings)
{
foreach (var mapping in mappings)
{
NamespaceModuleMapping[mapping.Key] = mapping.Value;
}
}
}