【问题标题】:ASP.NET Core 2.1 Using Nlog configuration as .NET MVC5ASP.NET Core 2.1 使用 Nlog 配置作为 .NET MVC5
【发布时间】:2018-10-01 04:29:15
【问题描述】:

我的项目使用 .NET MVC 5 时设置了这个 NLog 配置。在我将此代码移植到 ASP.NET Core 2.1 之前,它可以正常记录。现在它根本不会记录任何内容。

App.ClassLibrary > LoggingSettings.cs

public class LoggingSettings
{
    public static void ConfigureLogger()
    {
        var logConfig = new LoggingConfiguration();
        var consoleTarget = new ColoredConsoleTarget();
        consoleTarget.Layout = consoleTarget.Layout = @"${date:format=HH\:mm\:ss} ${logger} ${message} ${mdc:item=AppName} ${mdc:item=UserName}";
        logConfig.AddTarget("console", consoleTarget);

        var dbTarget = new DatabaseTarget();
        dbTarget.ConnectionString = DatabaseGlobals.ConnectionString;

        dbTarget.CommandText = @"
            INSERT INTO [dbo].[AspNetEventLogs]
            ([Application]
            ,[Logged]
            ,[Level]
            ,[Message]
            ,[UserName]
            ,[ServerName]
            ,[Port]
            ,[Url]
            ,[Https]
            ,[ServerAddress]
            ,[Logger]
            ,[Callsite]
            ,[Exception])
                VALUES (
            @application,
            @logged,
            @level,
            @message,
            @UserName,
            @serverName,
            @port,
            @url,
            @https,
            @serverAddress,
            @logger,
            @callSite,
            @exception
            )
        ";
        dbTarget.Parameters.Add(new DatabaseParameterInfo("@Application", "${mdc:item=AppName}"));
        dbTarget.Parameters.Add(new DatabaseParameterInfo("@Logged", "${date}"));
        dbTarget.Parameters.Add(new DatabaseParameterInfo("@Level", "${level}"));
        dbTarget.Parameters.Add(new DatabaseParameterInfo("@Message", "${message}"));
        dbTarget.Parameters.Add(new DatabaseParameterInfo("@Username", "${identity}"));
        dbTarget.Parameters.Add(new DatabaseParameterInfo("@ServerName", "n/a"));
        dbTarget.Parameters.Add(new DatabaseParameterInfo("@Port", "n/a"));
        dbTarget.Parameters.Add(new DatabaseParameterInfo("@Url", "n/a"));
        dbTarget.Parameters.Add(new DatabaseParameterInfo("@Https", "0"));
        dbTarget.Parameters.Add(new DatabaseParameterInfo("@ServerAddress", "n/a"));
        dbTarget.Parameters.Add(new DatabaseParameterInfo("@Logger", "${logger}"));
        dbTarget.Parameters.Add(new DatabaseParameterInfo("@CallSite", "${callsite}"));
        dbTarget.Parameters.Add(new DatabaseParameterInfo("@Exception", "${exception:tostring"));

        var rule = new LoggingRule("*", LogLevel.Debug, dbTarget);
        logConfig.LoggingRules.Add(rule);

        LogManager.Configuration = logConfig;
    }
}

App.ClassLibrary > LoggingController.cs

public class LoggingController : Logger
{
    public void ConfigureLogger()
    {
        LoggingSettings.ConfigureLogger();
    }

    public void SetApplicationName(String Name)
    {
        MappedDiagnosticsContext.Set("AppName", Name);
    }
}

然后,当我想将任何条目记录到数据库时,会引用我的控制器。其引用方式的示例如下:

App.Data > ApplicationUsersData

这就是我初始化它的方式

private readonly LoggingController logger = (LoggingController)LogManager.GetCurrentClassLogger(typeof(LoggingController));

public ApplicationUsersData(ApplicationDbContext dbContext)
{
    this.dbContext = dbContext;
    logger.ConfigureLogger();
    logger.SetApplicationName(ConfigurationManager.AppSettings["AppName"]);
}

我是这样称呼它的:

logger.Info("测试");

这曾经在 .NET MVC 5 中工作,但是当我移植代码时,它停止工作。我所做的唯一更改是在 LoggingSettings 文件中:

var dbTarget = new DatabaseTarget();
dbTarget.ConnectionString = DatabaseGlobals.ConnectionString;

曾经是

var dbTarget = new DatabaseTarget();
dbTarget.ConnectionStringName = "App";

但我认为 ConnectionStringName 已被淘汰?

我试过调试,但没有出现错误。

【问题讨论】:

  • 这在 ASP.NET MVC 5 中也是错误的。控制器不应该与记录器的配置有任何关系。如果可能的话,它甚至不应该知道使用了哪个记录器。例如,记录器应作为控制器构造函数中的依赖项传递,或配置为过滤器
  • 你有你提到的例子吗?我很困惑,但这对我有用。
  • 这在 MVC 5 教程中也有描述。您会看到大多数控制器在其构造函数中都有一个ILog<> 参数,它们不会直接调用硬编码的控制器
  • 对于 .NET Core,它已经有一个日志抽象,您可以在所有代码中使用它并隐藏实际使用的控制器。以Logging in .NET Core 为例。完成此操作后,使用特定记录器只需将其与其他服务一起配置即可。 NLog's docs explain how to configure it in ASP.NET Core
  • 如果 .NET 已经有自己的日志记录,我可以知道为什么我会使用 NLog 之类的东西吗?

标签: c# asp.net asp.net-mvc asp.net-core nlog


【解决方案1】:

与其在 Controller 中设置日志记录,不如考虑关注 wiki:https://github.com/NLog/NLog.Web/wiki/Getting-started-with-ASP.NET-Core-2

确保您已安装 nuget-package System.Data.SqlClient 以在 NetCore 上使用 DatabaseTarget。

确保您已检查 NLog InternalLogger:https://github.com/NLog/NLog/wiki/Internal-Logging

NLog.Web.AspNetCore 版本。 4.8.0 允许您使用${configsetting} 分配来自appsettings.json 的ConnectionString:https://github.com/NLog/NLog/wiki/ConfigSetting-Layout-Renderer

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-24
    • 1970-01-01
    • 2018-11-16
    • 1970-01-01
    • 2020-07-09
    • 1970-01-01
    • 2020-07-13
    • 2018-12-16
    相关资源
    最近更新 更多