如何在asp.net vNext中添加日志

时间:2016-01-27 12:02:19

标签: asp.net-mvc azure asp.net-core

我需要在我的asp.net应用程序中设置日志。将输出添加到控制台很容易,但我需要在Azure中进行配置。我不知道怎么做。我需要将我的应用程序发生的所有信息记录到某个文件中并阅读它。

2 个答案:

答案 0 :(得分:1)

ILoggerFactory允许应用使用ILoggerILoggerProvider的任何实现。

有关如何正确实现接口的详细信息,请查看框架ConsoleLoggerConsoleLoggerProvider。另请参阅ASP.NET Core documentation on logging

以下是自定义ILogger的最小示例。 这不是生产代码,而是展示足够的技术深度来编写您自己的ILogger或使用社区中的一个。

<强> project.json

"dependencies": {
    "Microsoft.AspNet.Mvc": "6.0.0-rc1-final",
    "Microsoft.AspNet.Server.Kestrel": "1.0.0-rc1-final",
    "Microsoft.Extensions.Logging": "1.0.0-rc1-final",
    "Microsoft.Extensions.Logging.Console": "1.0.0-rc1-final"
}

<强> MyLoggingProvider.cs

namespace LoggingExample
{
    using Microsoft.Extensions.Logging;

    public class MyLoggingProvider : ILoggerProvider
    {
        public ILogger CreateLogger(string categoryName)
        {
            return new MyLogger();
        }

        public void Dispose()
        {
            // TODO Cleanup
        }
    }
}

MyLogger.cs

在Azure中,您需要写入C:/temp/some-guid.txt以外的其他位置。但是,这足以让您开始编写自己的简单记录器。

namespace LoggingExample
{
    using System;
    using Microsoft.Extensions.Logging;

    public class MyLogger : ILogger
    {
        public void Log(LogLevel logLevel, int eventId, object state,
            Exception exception, Func<object, Exception, string> formatter)
        {
            var builder = new StringBuilder();
            if (formatter != null) {
                builder.AppendLine(formatter(state, exception));
            }

            var values = state as ILogValues;
            if (values != null) {
                foreach (var v in values.GetValues()) {
                    builder.AppendLine(v.Key + ":" + v.Value);
                }
            }

            var logPath = string.Format("C:/temp/{0}.txt", Guid.NewGuid());
            File.WriteAllText(logPath, builder.ToString());
        }

        public bool IsEnabled(LogLevel logLevel) {
            return true;
        }

        public IDisposable BeginScopeImpl(object state) {
            return null;
        }
    }
}

<强> Startup.cs

现在,您可以通过loggerFactory.AddProvider(new MyLoggingProvider())添加记录器。现在,对ILogger的每次通话都会与您的提供商进行对话。

namespace LoggingExample
{
    using Microsoft.AspNet.Builder;
    using Microsoft.AspNet.Http;
    using Microsoft.Extensions.Logging;

    public class Startup
    {
        public void Configure(
            IApplicationBuilder app, 
            ILoggerFactory loggerFactory)
        {
            loggerFactory
                .AddConsole(minLevel: LogLevel.Verbose)
                .AddProvider(new MyLoggingProvider());

            app.Run(async (context) =>
            {
                var logger = loggerFactory.CreateLogger("CatchAll");
                logger.LogInformation("Hello logger!");

                await context.Response.WriteAsync("Hello world!");
            });
        }
    }
}

<强> MyController.cs

支持依赖项注入的任何地方现在都可以收到ILogger,它将记录到我们在Startup.Configure方法中注册的所有提供程序。

namespace LoggingExample
{
    using Microsoft.AspNet.Mvc;
    using Microsoft.Extensions.Logging;
    public class MyController : Controller
    {
        public MyController(ILogger logger)
        {
            logger.LogInformation("Logging from my controller");
        }
    }
}

答案 1 :(得分:0)

log4net的

使用Log4Net。它是一个常见的日志记录框架,每个跟踪代码的人都能理解,并且它可以让你通过编辑配置文件来动态地附加一个新的日志“目标”。它已经涵盖了你想要做的大部分事情(比如为每个“day”创建一个单独的文件),并且那里的大多数日志挖掘工具都能够读取l4n创建的文件。

设置

如何开始tutorials online,但它们基本上只需要几个简单的步骤:

  1. 下载 Log4Net nuget package

  2. Adjust the log settings in your web.config file

  3. 创建 logger object的静态实例

  4. 日志资料,无论您需要哪个地方。如果您决定要让记录器写入文件,它会。如果添加数据库编写器,它也会写入数据库。希望您的日志条目显示在控制台中,只需在默认(调试)配置中添加该记录器。

  5. 设置完成后,日志记录就像这段代码一样简单:

    ...
    } catch(SystemException ex) {
       logger.Error("This error was thrown by the XXX routine", ex);
    }
    

    希望这有帮助。

    编辑:配置文件+核心

    正如@auga在他非常有用的评论中指出的那样,ASP.Net 5的配置可能要求您仔细阅读我在上面的步骤#2中添加的链接(配置您的记录器)。我只是link to the article I used在我们的ASP.NET 5环境中设置它,而不是重写其他人的博客文章。工作得很好。

    如果您正在阅读这篇文章以学习(而不是略读评论),我建议您关注这些链接......