我有一个非常具体的要求。
我有一个.net web api,我需要记录所有内容,我需要在调用每个api方法时记录,由谁,时间,我需要在有受控和不受控制的异常时记录。
我主要担心的是: 这可能与DI有关吗?我不想手动在代码上添加一个Logger行。 2.如何在1小时后关闭文件,并自动创建一个新文件?
答案 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
答案 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