问题
在编写API功能时,记录调用日志是必不可少的功能,日志在后续分析问题起到一个非常重要的作用。
这里使用log4net作为日志记录。
步骤
- 使用NuGet为项目添加log4net
- 添加log4net.config文件
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
<log4net>
<!--Info日志-->
<appender name="InfoAppender" type="log4net.Appender.RollingFileAppender">
<param name="File" value="Log\\LogInfo\\" />
<param name="AppendToFile" value="true" />
<param name="MaxFileSize" value="10240" />
<param name="MaxSizeRollBackups" value="100" />
<param name="StaticLogFileName" value="false" />
<param name="DatePattern" value="yyyyMMdd'.txt'" />
<param name="RollingStyle" value="Date" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="Date:%date %nMessage:%n%message%newline %n"/>
</layout>
</appender>
<!--Info日志-->
<logger name="loginfo">
<level value="INFO" />
<appender-ref ref="InfoAppender" />
</logger>
</log4net>
</configuration>
- 在项目的AssemblyInfo.cs文字添加log4net配置
[assembly: log4net.Config.XmlConfigurator(ConfigFile = @"log4net.config", Watch = true)]
- 添加LoggerHelper
public class LoggerHelper
{
static readonly log4net.ILog loginfo = log4net.LogManager.GetLogger("loginfo");
/// <summary>
/// 记录消息日志
/// </summary>
/// <param name="Msg"></param>
public static void Info(string Msg)
{
loginfo.Info(Msg);
}
}
- 添加CustomMessageHandler
public class CustomMessageHandler : DelegatingHandler
{
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
//return base.SendAsync(request, cancellationToken);
//记录请求内容
if (request.Content != null)
{
string msg = $"Request | Request Method: {request.Method},Request Uri: {request.RequestUri.AbsoluteUri}, Request Content: { request.Content.ReadAsStringAsync().Result}";
LoggerHelper.Info(msg);
}
//发送HTTP请求到内部处理程序,在异步处理完成后记录相应内容
return base.SendAsync(request, cancellationToken).ContinueWith<HttpResponseMessage>((task) =>
{
string result = task.Result.Content == null ? "Bad Request" : task.Result.Content.ReadAsStringAsync().Result;
string msg = $"Response | Request Method:{request.Method},Request Uri: {request.RequestUri.AbsoluteUri}, Response Content: {result}";
// 记录响应内容
LoggerHelper.Info(msg);
return task.Result;
});
}
}
- 在Global.asax文件添加日志配置
GlobalConfiguration.Configuration.MessageHandlers.Add(new CustomMessageHandler());
效果
目录
日志
参考
ASP.NET Web API 记录请求响应数据到日志的一个方法 - Garson_Zhang - 博客园