如何在 WebAPI 应用程序中使用 log4net 记录 API 响应
How to log an API response using log4net in WebAPI application
我是 log4net 的新手,我需要记录一个 API 响应。
这就是我在 web.config
中配置它的方式
<log4net>
<appender name="StandardAppenderSync" type="log4net.Appender.RollingFileAppender">
<!-- The standard pattern layout to use -->
<file value="log\Log_" />
<appendToFile value="true" />
<rollingStyle value="Date" />
<maxSizeRollBackups value="-1" />
<maximumFileSize value="5GB" />
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<staticLogFileName value="false" />
<datePattern value="yyyyMMdd'.txt'" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
</layout>
</appender>
<root>
<level value="ALL" />
<appender-ref ref="StandardAppenderSync" />
</root>
</log4net>
这是我用来记录响应的代码。
var client = new RestClient(url);
var request = new RestRequest(Method.POST);
request.AddHeader("header1", header1);
request.AddHeader("header2", header2);
request.AddParameter("parameter1", parameter1);
request.AddParameter("parameter2", parameter2);
IRestResponse response = await client.ExecuteAsync(request);
ILog log = LogManager.GetLogger("mylog");
log.Info(response.Content);
如果我将 response.Content
更改为 "Test message"
,它会正常记录。我认为问题在于,在执行此行时 log.Info(response.Content);
我们不确定 API 是否已响应,因为它是异步请求。
如何在 API 响应后立即记录响应而不影响性能?
如果记录“测试消息”有效,那么记录设置应该没问题。当执行到达日志记录时 API 已经 响应(异步方法上的 await 确保了这一点)因此您可能想要检查响应的状态代码或长度的内容。
如果日志记录在 DEV 中有效但在 TEST/PROD 中无效,则可能是权限问题 - 执行日志记录的进程需要权限才能写入文件位置。尽可能使用日志文件的绝对路径(即 E:\Logs\MyApp\MyApp.log)。
在应用程序启动时记录一条日志消息是值得的,它周围没有条件逻辑,因此您始终可以确定日志记录是否正常工作。
好的,我有 2 个问题阻止它正确记录。
首先是因为这条线<file value="log\Log_" />
。我从某个网站复制了这个配置,我在另一个目录中寻找日志,但它是在那个目录中生成的。一个愚蠢的错误。
一旦我更正了路径,它就会在我的本地机器上按预期捕获 API 响应。当我尝试使用 "Test message"
时,路径是正确的,然后我将其更改为 response.Content
并同时更改了配置,这就是它在我检查的目录中不起作用的原因。一次应该做 1 处更改并进行测试。
然后我发布了对暂存环境的更改,但它没有用。原以为是权限问题,经过多次尝试修复后发现暂存环境中少了一个dll文件。丢失的文件名为 RestSharp.dll。这可能对以后的人有所帮助。
我是 log4net 的新手,我需要记录一个 API 响应。 这就是我在 web.config
中配置它的方式<log4net>
<appender name="StandardAppenderSync" type="log4net.Appender.RollingFileAppender">
<!-- The standard pattern layout to use -->
<file value="log\Log_" />
<appendToFile value="true" />
<rollingStyle value="Date" />
<maxSizeRollBackups value="-1" />
<maximumFileSize value="5GB" />
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<staticLogFileName value="false" />
<datePattern value="yyyyMMdd'.txt'" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
</layout>
</appender>
<root>
<level value="ALL" />
<appender-ref ref="StandardAppenderSync" />
</root>
</log4net>
这是我用来记录响应的代码。
var client = new RestClient(url);
var request = new RestRequest(Method.POST);
request.AddHeader("header1", header1);
request.AddHeader("header2", header2);
request.AddParameter("parameter1", parameter1);
request.AddParameter("parameter2", parameter2);
IRestResponse response = await client.ExecuteAsync(request);
ILog log = LogManager.GetLogger("mylog");
log.Info(response.Content);
如果我将 response.Content
更改为 "Test message"
,它会正常记录。我认为问题在于,在执行此行时 log.Info(response.Content);
我们不确定 API 是否已响应,因为它是异步请求。
如何在 API 响应后立即记录响应而不影响性能?
如果记录“测试消息”有效,那么记录设置应该没问题。当执行到达日志记录时 API 已经 响应(异步方法上的 await 确保了这一点)因此您可能想要检查响应的状态代码或长度的内容。
如果日志记录在 DEV 中有效但在 TEST/PROD 中无效,则可能是权限问题 - 执行日志记录的进程需要权限才能写入文件位置。尽可能使用日志文件的绝对路径(即 E:\Logs\MyApp\MyApp.log)。
在应用程序启动时记录一条日志消息是值得的,它周围没有条件逻辑,因此您始终可以确定日志记录是否正常工作。
好的,我有 2 个问题阻止它正确记录。
首先是因为这条线<file value="log\Log_" />
。我从某个网站复制了这个配置,我在另一个目录中寻找日志,但它是在那个目录中生成的。一个愚蠢的错误。
一旦我更正了路径,它就会在我的本地机器上按预期捕获 API 响应。当我尝试使用 "Test message"
时,路径是正确的,然后我将其更改为 response.Content
并同时更改了配置,这就是它在我检查的目录中不起作用的原因。一次应该做 1 处更改并进行测试。
然后我发布了对暂存环境的更改,但它没有用。原以为是权限问题,经过多次尝试修复后发现暂存环境中少了一个dll文件。丢失的文件名为 RestSharp.dll。这可能对以后的人有所帮助。