【问题标题】:getting {aspnet-request} to work properly without referencing NLog.Web from project that is calling NLog让 {aspnet-request} 正常工作,而无需从调用 NLog 的项目中引用 NLog.Web
【发布时间】:2019-10-03 15:45:02
【问题描述】:

我有一个调用我的 NLog 包装类 (.netframework 4.7) 的 asp.net 项目。为了让 {aspnet-request} 工作,我必须添加一个对 asp.net 项目的 NLog.Web 引用,以及对我的 NLog 包装类的引用。有没有一种方法可以让 {aspnet} 调用工作而无需从 asp.net 项目中引用 NLog.Web,而只需引用我的 NLog 包装类?我尝试添加扩展以在我的 NLog.config 中添加 NLog.Web 程序集,但无济于事。我也尝试在我的包装类中引用 NLog.Web 。但是从 asp.net 项目类中抛出一个错误,说它找不到 NLog.Web。提前致谢。

当前参考:my references

NLog 包装类

using System;
using NLog;

public class MyLogger {

    private Logger _logger;

    public MyLogger(string name)
    {
        _logger = LogManager.GetLogger(name); 
    }

    public void Info(string msg, params object[] args)
    {
        LogEventInfo logEvent = new LogEventInfo(LogLevel.Info, _logger.Name, null, msg, args);
        _logger.Log(typeof(MyLogger), logEvent); 
    }
}

调用 NLog 包装类的 Asp.Net 项目:

WebApplication.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            EventLog.MyLogger l = new EventLog.MyLogger("uuu");
            l.Info("Test {param1} and {param2}", new { OrderId = 2, Status = "Processing" }, new { OrderId = 1, Status = "Processing" });
        }
    }
}

这是我的 NLog.config

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  autoReload="true"
  throwConfigExceptions="true"
  internalLogLevel="info"
  internalLogFile="${basedir}\logs\internal\nlog.log">

     <extensions>
         <add assembly="NLog.Web"/>
     </extensions>

      <!-- NLog wikipedia: https://github.com/nlog/nlog/wiki/Tutorial -->

     <!-- the targets to write to -->
     <targets async="true">
         <!-- write logs to file  -->   
         <target xsi:type="File" name="allfile" fileName="${basedir}\logs\events\${date:format=yyyyMMdd}-${appsetting:item=Version}-${appsetting:item=Environment}.log"
             layout="${longdate}
              |${uppercase:${level}}
              |IP:${aspnet-request-ip}
              |Identity:${windows-identity}
              |Controller:${aspnet-mvc-controller}
              |Action:${aspnet-mvc-action}     
              |Callsite:${callsite}
              |Message:${message} />   
      </targets>
      <!-- rules to map from logger name to target -->
      <rules>
          <!--All logs-->
          <logger name="*" minlevel="Trace" writeTo="allfile" />
      </rules>
</nlog>

这是我在 NLog 包装类中遇到的错误:Error Message I get

【问题讨论】:

  • 你能在&lt;extensions&gt; 中显示你正在使用的包含NLog.Web 的NLog.config 吗?你记得用你的 Nlog.config 部署NLog.Web.dll 吗?
  • 好的,先生。我更新了一些东西,包括 Nlog.config 和我得到的异常消息。我更新了参考图片,还编辑了包装类,以根据我在网上找到的文档正确包装 NLog
  • 我确实将 NLog 和 NLog.Web 源代码编译成 dll,然后引用它们。我没有使用 NuGet 包管理器将它们导入。idk 如果这有所作为。但这是我必须遵循的准则
  • 旧的 dotnet 项目在处理瞬态依赖方面很糟糕。部署应用程序时,您必须手动包含所有子依赖项(例如 NLog.dll + NLog.Web.dll)。如果您确实包含了相关的依赖项,那么您必须使用 Fuslogvw.exe 之类的东西来查看运行应用程序时缺少的内容。
  • 顺便说一句。无需手动编译 NLog.dll 和 NLog.Web.dll,您也可以直接从 nuget-packages 解压缩官方版本。请参阅nuget.org/packages/NLog.Webnuget.org/packages/NLog 上的“下载包”

标签: c# asp.net nlog


【解决方案1】:

WebApplication 项目正在引用 EventLog 类库,但其中一个 dll 没有被复制到项目的输出中。这是因为即使类库引用了这个 dll,除了引用之外没有实际调用或使用 dll,需要显式调用这个 dll 才能将其复制到项目。

所以我在类库内的 NLog.Web.dll 中添加了一个对随机属性的虚拟调用,现在引用类库的项目在其输出文件夹 (bin) 中获取 NLog.Web.dll。

Dependent DLL is not getting copied to the build output folder in Visual Studio

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-25
    相关资源
    最近更新 更多