WebAPI增加log4net错误日志:GlobalExceptionFilter记录异常堆栈到App_Data\logs

main
haoliang 18 hours ago
parent 09efa51b0c
commit bdf0e6b085

@ -43,6 +43,7 @@
<ItemGroup> <ItemGroup>
<Content Include="Web.config" CopyToOutputDirectory="PreserveNewest" /> <Content Include="Web.config" CopyToOutputDirectory="PreserveNewest" />
<Content Include="Global.asax" CopyToOutputDirectory="PreserveNewest" /> <Content Include="Global.asax" CopyToOutputDirectory="PreserveNewest" />
<Content Include="log4net.config" CopyToOutputDirectory="PreserveNewest" />
</ItemGroup> </ItemGroup>
</Project> </Project>

@ -4,6 +4,7 @@ using System.Web.Http;
using System.Web.Http.Filters; using System.Web.Http.Filters;
using CncModels.Dto; using CncModels.Dto;
using CncService; using CncService;
using log4net;
namespace CncWebApi.Filters namespace CncWebApi.Filters
{ {
@ -14,6 +15,8 @@ namespace CncWebApi.Filters
/// </summary> /// </summary>
public class GlobalExceptionFilter : ExceptionFilterAttribute public class GlobalExceptionFilter : ExceptionFilterAttribute
{ {
private static readonly ILog _log = LogManager.GetLogger(typeof(GlobalExceptionFilter));
/// <summary> /// <summary>
/// 异常发生时自动调用 /// 异常发生时自动调用
/// </summary> /// </summary>
@ -23,6 +26,7 @@ namespace CncWebApi.Filters
if (context.Exception is BusinessException bex) if (context.Exception is BusinessException bex)
{ {
// 业务异常:返回对应的错误码和消息 // 业务异常:返回对应的错误码和消息
_log.Warn($"业务异常: [{bex.Code}] {bex.Message}");
var response = ApiResponse<object>.Fail(bex.Code, bex.Message); var response = ApiResponse<object>.Fail(bex.Code, bex.Message);
context.Response = context.Request.CreateResponse( context.Response = context.Request.CreateResponse(
HttpStatusCode.OK, response); HttpStatusCode.OK, response);
@ -30,7 +34,8 @@ namespace CncWebApi.Filters
else else
{ {
// 未预期异常:返回通用错误提示,不暴露内部细节 // 未预期异常:返回通用错误提示,不暴露内部细节
// 详细异常信息由log4net记录到日志文件 var requestUrl = context.Request?.RequestUri?.ToString();
_log.Error($"未处理异常: {requestUrl}", context.Exception);
var response = ApiResponse<object>.Fail( var response = ApiResponse<object>.Fail(
CncModels.Constants.ErrorCode.InternalError, CncModels.Constants.ErrorCode.InternalError,
"服务器内部错误,请稍后重试"); "服务器内部错误,请稍后重试");

@ -1,7 +1,9 @@
using System; using System;
using System.IO;
using System.Web; using System.Web;
using System.Web.Http; using System.Web.Http;
using CncWebApi.App_Start; using CncWebApi.App_Start;
using log4net;
namespace CncWebApi namespace CncWebApi
{ {
@ -16,6 +18,13 @@ namespace CncWebApi
/// </summary> /// </summary>
protected void Application_Start() protected void Application_Start()
{ {
// 初始化 log4net
var logConfig = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "log4net.config");
if (File.Exists(logConfig))
{
log4net.Config.XmlConfigurator.Configure(new FileInfo(logConfig));
}
GlobalConfiguration.Configure(WebApiConfig.Register); GlobalConfiguration.Configure(WebApiConfig.Register);
} }

@ -0,0 +1,35 @@
<?xml version="1.0" encoding="utf-8" ?>
<log4net>
<!-- 错误日志ERROR和FATAL -->
<appender name="ErrorFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="App_Data\logs\error.log" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="10MB" />
<staticLogFileName value="true" />
<threshold value="ERROR" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger - %message%newline%exception%newline" />
</layout>
</appender>
<!-- 全量日志INFO及以上 -->
<appender name="AllFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="App_Data\logs\webapi.log" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="10MB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger - %message%newline%exception%newline" />
</layout>
</appender>
<root>
<level value="INFO" />
<appender-ref ref="AllFileAppender" />
<appender-ref ref="ErrorFileAppender" />
</root>
</log4net>
Loading…
Cancel
Save