【发布时间】:2013-06-07 10:29:57
【问题描述】:
我有一个创建应用程序域并启动它的服务:
this._appDomain = AppDomain.CreateDomain(this._appName, AppDomain.CurrentDomain.Evidence, appDomainSetup);
this._startStopControllerToRun = (IStartStop)this._appDomain.CreateInstanceFromAndUnwrap(assemblyName, this._fullyQualifiedClassName);
this._startStopControllerToRun.Start();
这已经运行了很长时间了。问题是在此应用程序域中启动的控制器何时调用框架日志记录类。记录器获取条目程序集名称并将其记录为事件日志中的源。这是记录器获取源(调用者)名称的方式:
private static string GetSource()
{
try
{
var assembly = Assembly.GetEntryAssembly();
// GetEntryAssembly() can return null when called in the context of a unit test project.
// That can also happen when called from an app hosted in IIS, or even a windows service.
if (assembly == null)
{
// From http://stackoverflow.com/a/14165787/279516:
assembly = new StackTrace().GetFrames().Last().GetMethod().Module.Assembly;
}
return assembly.GetName().Name;
}
catch
{
return "Unknown";
}
}
在添加if 检查之前,记录器会记录源的“未知”。经过一番研究,我在if 块中添加了该尝试。现在记录器将“mscorlib”记录为源(条目程序集名称)。
这是概述: 主机 -> 控制器(在应用程序域内运行)
如何获取在域中运行的程序集(具有控制器)的名称?
注意:我也试过这个(如下),但它给了我存在日志记录类的框架的名称(而不是控制器在应用程序域中运行的程序集的名称):
assembly = Assembly.GetExecutingAssembly();
【问题讨论】:
-
避免寻找后门来获取您的代码提供的琐碎而准确的信息。添加属性。
-
那么基本上是给log方法传一个字符串?
Logger.Log("MyApp", message); -
当日志记录在业务逻辑层完成并且可以从多个消费者调用时,该方法不起作用。消费者知道他们的名字,但随后每个人都必须将此信息传递给逻辑方法。与其传递这样的信息,我真的很想把它放在一个地方。