asp.net每小时记录和创建文件

时间:2017-03-24 15:05:01

标签: c# .net asp.net-mvc logging asp.net-web-api

我有一个非常具体的要求。

我有一个.net web api,我需要记录所有内容,我需要在调用每个api方法时记录,由谁,时间,我需要在有受控和不受控制的异常时记录。

我主要担心的是: 这可能与DI有关吗?我不想手动在代码上添加一个Logger行。 2.如何在1小时后关闭文件,并自动创建一个新文件?

2 个答案:

答案 0 :(得分:1)

您可以使用log2net。以下2个属性将有助于每小时创建日志文件。如果你有相同的登录模式(带有日志条目的ex - wrap方法),那么你也可以使用AOP(面向方面​​编程)。 PostSharp在AOP中非常有用。

<rollingStyle value="Date" />
<datePattern value="yyyyMMdd-HH" />

前 -

<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
    <file value="logfile" />
    <appendToFile value="true" />
    <rollingStyle value="Date" />
    <datePattern value="yyyyMMdd-HH" />
    <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
    </layout>
</appender>

http://logging.apache.org/log4net/release/config-examples.html#rollingfileappender

https://www.postsharp.net/aspects

答案 1 :(得分:1)

当然这是可能的。我的答案基于.Net Core,但大部分内容(如记录器建议和中间件的使用)也适用于非.Net Core项目。

对于初学者,我建议您阅读:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/logging

  

ASP.NET Core支持与各种日志记录提供程序一起使用的日志记录API。内置提供程序允许您将日志发送到一个或多个目标,并且您可以插入第三方日志记录框架。

     

ASP.NET Core依赖注入(DI)提供了ILoggerFactory实例。

您可以使用ILogger和ILoggerFactory接口注入日志记录实现。

对于异常处理和访问日志记录,您可以编写一些中间件(https://docs.microsoft.com/en-us/aspnet/core/fundamentals/middleware)。使用中间件可以防止您在每个控制器操作中调用日志记录逻辑。

类似的东西:

    public class RequestTrackingMiddleware
    {
        private readonly RequestDelegate next;
        private readonly ILogger logger;

        public RequestTrackingMiddleware(RequestDelegate next, ILogger logger)
        {
            this.next = next;
            this.logger = logger;
        }

        public async Task Invoke(HttpContext context)
        {
            using (logger.BeginScope(new Dictionary<string, object>
            {
                [SharedProperties.TraceId] =         context.Request.HttpContext.TraceIdentifier,
            }))
            {
                var stopwatch = Stopwatch.StartNew();
                bool success = false;

                try
                {
                    await next(context);
                    success = true;
                }
                catch (System.Exception exception)
                {
                    logger.LogCritical((int)ServiceFabricEvent.Exception, exception, exception.Message);
                    throw;
                }
                finally
                {
                    stopwatch.Stop();
                    logger.LogRequest(context, stopwatch.Elapsed, success);
                }
            }
        }
    }

现在,鉴于前面的链接,有一些内置和第三方记录器实现支持提供的.Net核心记录接口。请根据自己的喜好选择一个接收器(destionation)或自己写一个接收器(大多数基于记录器的时间并不那么难。

我使用了Serilog(https://serilog.net/),因为它对.Net Core提供了开箱即用的支持,而且它有很多接收器。如果您不使用.Net Core,这仍然是一个很好的选择!

编辑:我看到Serilog支持每小时生成一个新文件的基于文件的接收器:https://github.com/serilog/serilog-sinks-rollingfile