.Net Core3.0 WebApi 项目框架搭建:目录
安装Log4j
webapi.core项目Nuget安装Log4j
添加Log4net.json配置文件
xml version="1.0" encoding="utf-8"?> <configuration> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> configSections> <system.web> <compilation debug="true" targetFramework="4.5.2" /> <httpRuntime targetFramework="4.5.2" /> system.web> <log4net> <appender name="ErrorAppender" type="log4net.Appender.RollingFileAppender"> <file value="log/error/error_" /> <appendToFile value="true"/> <rollingStyle value="Date"/> <datePattern value="yyyy-MM-dd'.log'"/> <staticLogFileName value="false"/> <param name="MaxSizeRollBackups" value="100"/> <maximumFileSize value="50MB" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%n========== %n【日志级别】%-5level %n【记录时间】%date %n【执行时间】[%r]毫秒 %n【错误位置】%logger 属性[%property{NDC}] %n【错误描述】%message %n【错误详情】%newline"/> layout> <filter type="log4net.Filter.LevelRangeFilter,log4net"> <levelMin value="ERROR" /> <levelMax value="FATAL" /> filter> appender> <appender name="DebugAppender" type="log4net.Appender.RollingFileAppender"> <file value="log/debug/debug_" /> <appendToFile value="true"/> <rollingStyle value="Date"/> <datePattern value="yyyy-MM-dd'.log'"/> <staticLogFileName value="false"/> <param name="MaxSizeRollBackups" value="100"/> <maximumFileSize value="50MB" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%n========== %n【日志级别】%-2level %n【记录时间】%date %n【执行时间】[%r]毫秒 %n【debug位置】%logger 属性[%property{NDC}] %n【debug描述】%message"/> layout> <filter type="log4net.Filter.LevelRangeFilter,log4net"> <levelMin value="DEBUG" /> <levelMax value="WARN" /> filter> appender> <root> <level value="ALL" /> <appender-ref ref="DebugAppender" /> <appender-ref ref="ErrorAppender" /> root> log4net> configuration>
添加日志接口类
weapi.core项目新建Log 文件夹,新建 ILoggerHelper.cs
public interface ILoggerHelper { ////// 调试信息 /// /// source /// message void Debug(object source, string message); /// /// 调试信息 /// /// source /// message /// ps void Debug(object source, string message, params object[] ps); /// /// 调试信息 /// /// source /// message void Debug(Type source, string message); /// /// 关键信息 /// /// source /// message void Info(object source, object message); /// /// 关键信息 /// /// source /// message void Info(Type source, object message); /// /// 警告信息 /// /// source /// message void Warn(object source, object message); /// /// 警告信息 /// /// source /// message void Warn(Type source, object message); /// /// 错误信息 /// /// source /// message void Error(object source, object message); /// /// 错误信息 /// /// source /// message void Error(Type source, object message); /// /// 失败信息 /// /// source /// message void Fatal(object source, object message); /// /// 失败信息 /// /// source /// message void Fatal(Type source, object message); /* Log a message object and exception */ /// /// 调试信息 /// /// source /// message /// ex void Debug(object source, object message, Exception exception); /// /// 调试信息 /// /// source /// message /// ex void Debug(Type source, object message, Exception exception); /// /// 关键信息 /// /// source /// message /// ex void Info(object source, object message, Exception exception); /// /// 关键信息 /// /// source /// message /// ex void Info(Type source, object message, Exception exception); /// /// 警告信息 /// /// source /// message /// ex void Warn(object source, object message, Exception exception); /// /// 警告信息 /// /// source /// message /// ex void Warn(Type source, object message, Exception exception); /// /// 错误信息 /// /// source /// message /// ex void Error(object source, object message, Exception exception); /// /// 错误信息 /// /// source /// message /// ex void Error(Type source, object message, Exception exception); /// /// 失败信息 /// /// source /// message /// ex void Fatal(object source, object message, Exception exception); /// /// 失败信息 /// /// source /// message /// ex void Fatal(Type source, object message, Exception exception); }
在 Log 文件夹下新建 LogHelper.cs
public class LogHelper : ILoggerHelper { private readonly ConcurrentDictionaryLoggers = new ConcurrentDictionary (); /// /// 获取记录器 /// /// soruce /// private ILog GetLogger(Type source) { if (Loggers.ContainsKey(source)) { return Loggers[source]; } else { ILog logger = LogManager.GetLogger(Startup.repository.Name, source); Loggers.TryAdd(source, logger); return logger; } } /* Log a message object */ /// /// 调试信息 /// /// source /// message public void Debug(object source, string message) { Debug(source.GetType(), message); } /// /// 调试信息 /// /// source /// message /// ps public void Debug(object source, string message, params object[] ps) { Debug(source.GetType(), string.Format(message, ps)); } /// /// 调试信息 /// /// source /// message public void Debug(Type source, string message) { ILog logger = GetLogger(source); if (logger.IsDebugEnabled) { logger.Debug(message); } } /// /// 关键信息 /// /// source /// message public void Info(object source, object message) { Info(source.GetType(), message); } /// /// 关键信息 /// /// source /// message public void Info(Type source, object message) { ILog logger = GetLogger(source); if (logger.IsInfoEnabled) { logger.Info(message); } } /// /// 警告信息 /// /// source /// message public void Warn(object source, object message) { Warn(source.GetType(), message); } /// /// 警告信息 /// /// source /// message public void Warn(Type source, object message) { ILog logger = GetLogger(source); if (logger.IsWarnEnabled) { logger.Warn(message); } } /// /// 错误信息 /// /// source /// message public void Error(object source, object message) { Error(source.GetType(), message); } /// /// 错误信息 /// /// source /// message public void Error(Type source, object message) { ILog logger = GetLogger(source); if (logger.IsErrorEnabled) { logger.Error(message); } } /// /// 失败信息 /// /// source /// message public void Fatal(object source, object message) { Fatal(source.GetType(), message); } /// /// 失败信息 /// /// source /// message public void Fatal(Type source, object message) { ILog logger = GetLogger(source); if (logger.IsFatalEnabled) { logger.Fatal(message); } } /* Log a message object and exception */ /// /// 调试信息 /// /// source /// message /// ex public void Debug(object source, object message, Exception exception) { Debug(source.GetType(), message, exception); } /// /// 调试信息 /// /// source /// message /// ex public void Debug(Type source, object message, Exception exception) { GetLogger(source).Debug(message, exception); } /// /// 关键信息 /// /// source /// message /// ex public void Info(object source, object message, Exception exception) { Info(source.GetType(), message, exception); } /// /// 关键信息 /// /// source /// message /// ex public void Info(Type source, object message, Exception exception) { GetLogger(source).Info(message, exception); } /// /// 警告信息 /// /// source /// message /// ex public void Warn(object source, object message, Exception exception) { Warn(source.GetType(), message, exception); } /// /// 警告信息 /// /// source /// message /// ex public void Warn(Type source, object message, Exception exception) { GetLogger(source).Warn(message, exception); } /// /// 错误信息 /// /// source /// message /// ex public void Error(object source, object message, Exception exception) { Error(source.GetType(), message, exception); } /// /// 错误信息 /// /// source /// message /// ex public void Error(Type source, object message, Exception exception) { GetLogger(source).Error(message, exception); } /// /// 失败信息 /// /// source /// message /// ex public void Fatal(object source, object message, Exception exception) { Fatal(source.GetType(), message, exception); } /// /// 失败信息 /// /// source /// message /// ex public void Fatal(Type source, object message, Exception exception) { GetLogger(source).Fatal(message, exception); } }
配置LogManger 自启动
在startup.cs文件中添加 Loger 日志仓库
////// log4net 仓储库 /// public static ILoggerRepository repository { get; set; }
ConfigureServices方法中注入ILoggerHelper和日志启动
//log注入ILoggerHelper services.AddSingleton(); //log4net repository = LogManager.CreateRepository("");//需要获取日志的仓库名,也就是你的当然项目名 XmlConfigurator.Configure(repository, new FileInfo("Log4net.config"));//指定配置文件,
测试日志
Test控制写一个测试接口
private readonly ILoggerHelper _logger; public TestController(ILoggerHelper loggerHelper) { _logger = loggerHelper; } ////// 测试日志 /// /// [HttpGet] public IActionResult LogTest() { _logger.Error(typeof(TestController), "这是错误日志", new Exception("123")); _logger.Debug(typeof(TestController), "这是bug日志"); //throw new System.IO.IOException(); return Ok(); }
F5运行调试
查看日志文件,有输出
定义全局异常过滤器
webapi.core项目 新建Filter 文件夹,添加 GlobalExceptionFilter.cs
public class GlobalExceptionsFilter : IExceptionFilter { private readonly IHostEnvironment _env; private readonly ILoggerHelper _loggerHelper; public GlobalExceptionsFilter(IHostEnvironment env, ILoggerHelper loggerHelper) { _env = env; _loggerHelper = loggerHelper; } public void OnException(ExceptionContext context) { var json = new JsonErrorResponse(); json.Message = context.Exception.Message;//错误信息 if (_env.IsDevelopment()) { json.DevelopmentMessage = context.Exception.StackTrace;//堆栈信息 } context.Result = new InternalServerErrorObjectResult(json); //采用log4net 进行错误日志记录 _loggerHelper.Error(json.Message,"出现未知异常", context.Exception); } public class InternalServerErrorObjectResult : ObjectResult { public InternalServerErrorObjectResult(object value) : base(value) { StatusCode = StatusCodes.Status500InternalServerError; } } //返回错误信息 public class JsonErrorResponse { ////// 生产环境的消息 /// public string Message { get; set; } /// /// 开发环境的消息 /// public string DevelopmentMessage { get; set; } } }
在启动服务中,注入全局异常
services.AddControllers(option => { option.Filters.Add(typeof(GlobalExceptionsFilter)); });
测试全局异常
Test控制器新建接口,这里直接抛出一个异常。
////// 抛出异常 /// /// [HttpGet] public IActionResult Throw() { throw new System.IO.IOException(); }
F5运行,测试接口
查看日志文件,有日志输出。