.net core 自制错误日志

前言

之前.net framework用的ErrorLog帮助类,对于监控错误形成日志,内容非常清晰,想在.net core2.2中继续用,但是有很多不一样的地方,所以想总结一下.

首先需要HttpContext,而.net core 与之前的.net framework有所不同,封装一下便于使用

建两个静态类 HttpContext

using Microsoft.AspNetCore.Http;

namespace logs
{
    public static class HttpContext
    {
        private static IHttpContextAccessor _accessor;

        public static Microsoft.AspNetCore.Http.HttpContext Current => _accessor.HttpContext;

        internal static void Configure(IHttpContextAccessor accessor)
        {
            _accessor = accessor;
        }
    }
}

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;

namespace logs
{
    public static class StaticHttpContextExtensions
    {
        public static void AddHttpContextAccessor(this IServiceCollection services)
        {
            services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
        }

        public static IApplicationBuilder UseStaticHttpContext(this IApplicationBuilder app)
        {
            var httpContextAccessor = app.ApplicationServices.GetRequiredService<IHttpContextAccessor>();
            HttpContext.Configure(httpContextAccessor);
            return app;
        }
    }
}

在Startup.cs中注入

 public void ConfigureServices(IServiceCollection services)
        {
            services.Configure<CookiePolicyOptions>(options =>
            {
                // This lambda determines whether user consent for non-essential cookies is needed for a given request.
                options.CheckConsentNeeded = context => true;
                options.MinimumSameSitePolicy = SameSiteMode.None;
            });

            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

            //DI 注入
            services.AddHttpContextAccessor();

        }

新建一个ErrorLog类

using System;
using System.IO;

namespace logs
{
    public class ErrorLog
    {
        public static void WriteLog(Exception ex)
        {
            //读取二级
            var logsPath=AppConfigurtaionServices.Configuration["Path:LogsPath"];

            string errorTime = "异常时间:" + DateTime.Now.ToString();
            string errorAddress = "异常地址:" + HttpContext.Current.Request.Scheme.ToString()+"://"+ HttpContext.Current.Request.Host.ToString()+ HttpContext.Current.Request.Path.ToString();
            string errorInfo = "异常信息:" + ex.Message;
            string errorSource = "错误源:" + ex.Source;
            string errorType = "运行类型:" + ex.GetType();
            string errorFunction = "异常函数:" + ex.TargetSite;
            string errorTrace = "堆栈信息:" + ex.StackTrace;

            //HttpContext.Current.Server.ClearError();
            System.IO.StreamWriter writer = null;
            try
            {
                //写入日志
                string path = string.Empty;
               path= System.AppDomain.CurrentDomain.BaseDirectory.ToString()+ logsPath;
                //path = HttpContext.Current.Server.MapPath("~/ErrorLogs/");
                //不存在则创建错误日志文件夹
                if (!Directory.Exists(path))
                {
                    Directory.CreateDirectory(path);
                }
                path += string.Format(@"\{0}.txt", DateTime.Now.ToString("yyyy-MM-dd"));

                writer = !System.IO.File.Exists(path) ? System.IO.File.CreateText(path) : System.IO.File.AppendText(path); //判断文件是否存在,如果不存在则创建,存在则添加
                writer.WriteLine("用户IP:" + HttpContext.Current.Connection.RemoteIpAddress.ToString());
                writer.WriteLine(errorTime);
                writer.WriteLine(errorAddress);
                writer.WriteLine(errorInfo);
                writer.WriteLine(errorSource);
                writer.WriteLine(errorType);
                writer.WriteLine(errorFunction);
                writer.WriteLine(errorTrace);
                writer.WriteLine("********************************************************************************************");
            }
            finally
            {
                if (writer != null)
                {
                    writer.Close();
                }
            }
        }
    }
}

新建控制器测试

        public IActionResult Index()
        {
            try
            {
                var b = 0;
                int a = 10 / b;
            }
            catch (Exception ex)
            {

              ErrorLog.WriteLog(ex);
            }
            return View();
        }

  新建视图运行,在\bin\Debug\netcoreapp2.2\下创建logs文件夹与日期命名的txt文件  结果如下

最后  安利一个特别棒的appsetting读取类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace logs
{
    using Microsoft.Extensions.Configuration;
    using Microsoft.Extensions.Configuration.Json;
    /// <summary>
    /// 读取appsetting.json
    /// </summary>
    public class AppConfigurtaionServices
    {
        public static IConfiguration Configuration { get; set; }
        static AppConfigurtaionServices()
        {
            //ReloadOnChange = true 当appsettings.json被修改时重新加载
            Configuration = new ConfigurationBuilder()
            .Add(new JsonConfigurationSource { Path = "appsettings.json", ReloadOnChange = true })
            .Build();
        }
    }
}
         //调用
        // AppConfigurtaionServices.Configuration.GetConnectionString("conn");
        //读取一级
        // AppConfigurtaionServices.Configuration["str"];
        //读取二级
        // AppConfigurtaionServices.Configuration["Path:LogsPath"];

        //注意,如果AppConfigurtaionServices类中抛出FileNotFoundException异常,说明目录下未找到appsettings.json文件,这时请在项目appsettings.json文件上右键——属性——将“复制到输出目录”项的值改为“如果较新则复制”即可。

  

原文地址:https://www.cnblogs.com/LiChen19951127/p/10475148.html

时间: 2024-11-05 12:32:12

.net core 自制错误日志的相关文章

.Net Core中间件和过滤器实现错误日志记录

1.中间件的概念 ASP.NET Core的处理流程是一个管道,中间件是组装到应用程序管道中用来处理请求和响应的组件. 每个中间件可以: 选择是否将请求传递给管道中的下一个组件. 可以在调用管道中的下一个组件之前和之后执行业务逻辑. 中间件是一个请求委托( public delegate Task RequestDelegate(HttpContext context) )的实例,所以中间件的本质就是一个方法,方法的参数是HttpContext,返回Task.传入的HttpContext参数包含

解决Apache的错误日志巨大的问题以及关闭Apache web日志记录

调整错误日志的级别 这几天 apache错误日志巨大 莫名其妙的30G  而且 很多都是那种页面不存在的  网站太多了  死链接相应的也很多于是把错误警告调低了 因为写日志会给系统带来很大的损耗.关闭日志以后,甚至最高可以提高整体性能近40%(粗略估计)那么如何关闭日志呢? 可以通过降低log级别的办法来减少日志读写. 这里要提醒的是,这么做将给"入侵检测"以及其他基于日志分析的工作带来麻烦.所以请谨慎使用.网上相关文章很多,但说的都不详细,擦边而过,下面详细说一下具体操作步骤. 编辑

centos7下,解决Apache错误日志文件过大问题

1,日志文件太大问题 第一步:停止Apache服务的所有进程,删除 /var/log/httpd目录下的 error.log.access.log文件 第二步:打开 /etc/httpd/conf 的 httpd.conf配置文件 并找到下面配置 ErrorLog logs/error.log 把上面的注释掉,换成 # 每天生成一个错误日志文件 ErrorLog "|/usr/sbin/rotatelogs /var/log/httpd/error_log%Y%m%d.log 86400 480

玩转ASP.NET Core中的日志组件

玩转ASP.NET Core中的日志组件简介日志组件,作为程序员使用频率最高的组件,给程序员开发调试程序提供了必要的信息.ASP.NET Core中内置了一个通用日志接口ILogger,并实现了多种内置的日志提供器,例如 ConsoleDebugEventSourceEventLogTraceSourceAzure App Service除了内置的日志提供器,ASP.NET Core还支持了多种第三方日志工具,例如 elmah.ioGelfJSNLogKissLog.netLoggrNLogSe

iis部署asp.net core出现错误 HTTP Error 502.5 - Process Failure

502.5 进程失败 出现如下错误的原因通常是由于目标 ASP.NET Core 共享框架版本不存在,因此应用配置错误. 检查目标计算机上安装的 ASP.NET Core 共享框架版本. 工作进程失败. 应用不启动. ASP.NET Core 模块尝试启动后端 dotnet 进程,但启动失败. 通常可以从"应用程序事件日志"和"ASP.NET Core 模块 stdout 日志"的条目中确定进程启动失败的原因. 常见的失败情况是,由于目标 ASP.NET Core

nginx日志及错误日志详解

nginx错误日志信息介绍 配置记录nginx的错误信息是调试nginx服务的重要手段,属于核心功能模块(ngx_core_module)的参数,该参数名字为error_log,可以放在Main区块中全局配置,也可以放置不同的虚拟主机中单独记录虚拟主机的错误信息. error_log的语法格式及参数语法说明如下: error_log    file    level; 关键字        日志文件    错误日志级别 其中,关键字error_log不能改变,日志文件可以指定任意存放日志的目录,

mysql错误日志

1.错误日志路径查询 show variables like '%log_error%'; log_error记录了错误日志路径. 2.告警日志设置 show variables like '%log_warnings%'; log_warnings:0表示不记录警告信息,1表示记录警告信息到错误日志,大于1表示"失败的连接"的信息和创建新连接时"拒绝访问"类的错误信息也会被记录到错误日志中.

MS SQL 监控错误日志的告警信息

SQL Server的错误消息(Error Message)按照消息的严重级别一共划分25个等级,级别越高,表示严重性也越高.但是如果你统计sys.messages,你会发现,实际上只有16(SQL SERVER 2008/2012)或17个(SQL SERVER 2005)个级别.猜测应该是一些留作扩展用,一些留作用户自定义错误消息的级别. sys.messages中有个字段is_event_logged,取值为1时表示出现错误时将消息记入事件日志. 对于 message_id 中的所有消息语

Nginx错误日志整理

Nginx错误日志说明 错误日志类型 类型1: upstream timed out 类型2: connect() failed 类型3: no live upstreams 类型4: upstream prematurely closed connection 类型5: 104: Connection reset by peer 类型6: client intended to send too large body 类型7: upstream sent no valid HTTP/1.0 he