登记
container.AddFacility<LoggingFacility>(f => f.LogUsing(LoggerImplementation.NLog)
.WithConfig("NLog.config"));
此代码根据此文档页面。
现在这是使用 NLog 的代码,即 Castle Windsor 将提供 NLog 作为 _logger 实现:
public class EmailController : Controller
{
private ILogger _logger = NullLogger.Instance;
...
public ILogger Logger
{
get { return _logger; }
set { _logger = value; }
}
public ActionResult Send(UserMessageModel userMessage, bool captchaValid, string captchaErrorMessage)
{
if (ModelState.IsValid)
{
try
{
// Do something
}
catch (Exception ex)
{
_logger.Error(string.Format("Error msg:{0}\rError stacktrace:{1}", ex.Message, ex.StackTrace));
...
}
}
...
}
}
但是,如果我这样更改代码:
[CustomHandleError]
public class EmailController : Controller
{
[CustomHandleError]
public ActionResult Send(UserMessageModel userMessage, bool captchaValid, string captchaErrorMessage)
{
if (ModelState.IsValid)
{
// Do something
}
...
}
...
}
public class CustomHandleError: HandleErrorAttribute
{
private ILogger _logger = NullLogger.Instance;
public ILogger Logger
{
get { return _logger; }
set { _logger = value; }
}
public override void OnException(ExceptionContext filterContext)
{
if (filterContext == null)
{
base.OnException(null);
}
_logger.Error(string.Format("Error msg:{0}\rError stacktrace:{1}", filterContext.Exception.Message, filterContext.Exception.StackTrace));
if (filterContext.HttpContext.IsCustomErrorEnabled)
{
filterContext.ExceptionHandled = true;
base.OnException(filterContext);
}
}
}
在这种情况下,_logger 是“NullLogger.Instance”。我认为我拥有“Logger”属性这一事实意味着 Castle Windsor 会像之前的代码一样将 _logger 更改为 NLog。
我会误会什么?
编辑
我现在在这里添加了代码,如果有人可以看看它会很棒。
仅供参考:有 4 个提交。第一次提交是初始提交 第二次提交表明我可以让 NLog 按我的要求工作 第三次提交表明我可以让数据属性正常工作,即我在 Castle Windsor 中成功注册了过滤器 最后一次提交是问题我在上面描述过,即我无法让集中式日志记录使用 NLog。