中国建设银行网站公积金查询余额/seo排名课程咨询电话

中国建设银行网站公积金查询余额,seo排名课程咨询电话,来宾网站建设公司,中国建设工程造价协会网站一、介绍此篇文章将会介绍项目的全局异常收集以及采用log4net或者NLog记录。众所周知,一旦自己的项目报错,如果没有进行处理都是显示不友好的,有得甚至直接爆出错误页面,看的也是很奇怪。为了避免出现这样的错误以及在错误出现的时…

一、介绍


 

此篇文章将会介绍项目的全局异常收集以及采用log4net或者NLog记录。

众所周知,一旦自己的项目报错,如果没有进行处理都是显示不友好的,有得甚至直接爆出错误页面,看的也是很奇怪。

 为了避免出现这样的错误以及在错误出现的时候可以进行收集错误,供维护人员进行bug修改,因此需要进行全局异常的收集。

 让我们开始部署吧。 

此篇文章的目录

1、log4net使用

2、Nlog使用

后期将会把NLog+ELK进行结合部署收集我们的asp.net core的项目。大家可以拭目以待吧。 

二、部署(log4net使用)


 1、新建一个asp.net core webapi的项目

然后目前我先引入 log4net   nuget包。

640?wx_fmt=png

2、然后创建一个log4net.config文件

此文件中,我创建了一个是记录 错误的文件夹(LogError)以及是记录操作的文件夹(LogInfo),代码如下:我把需要记录的文件放在了log文件夹下面。

<?xml version="1.0" encoding="utf-8"?>

<configuration>

  <log4net>

    <!-- 错误日志类-->

    <logger name="logerror">

      <level value="ALL" />

      <appender-ref ref="ErrorAppender" />

    </logger>

    <!-- 错误日志附加介质-->

    <appender name="ErrorAppender" type="log4net.Appender.RollingFileAppender">

      <!--日志文件路径-->

      <param name="File" value="Log\\LogError\\" />

      <!--是否是向文件中追加日志-->

      <param name="AppendToFile" value="true" />

      <!--log保留天数-->

      <param name="MaxSizeRollBackups" value="1000" />

      <!--最大文件大小-->

      <param name="MaxFileSize" value="10240" />

      <!--日志文件名是否是固定不变的-->

      <param name="StaticLogFileName" value="false" />

      <!--日志文件名格式为:2008-08-31.log-->

      <param name="DatePattern" value="yyyy-MM-dd&quot;.htm&quot;" />

      <!--日志根据日期滚动-->

      <param name="RollingStyle" value="Date" />

      <!--信息日志布局-->

      <layout type="log4net.Layout.PatternLayout">

        <param name="ConversionPattern" value="&lt;HR COLOR=red&gt;%n【异常时间】:%d [%t] &lt;BR&gt;%n【异常级别】:%-5p &lt;BR&gt;%n%m &lt;BR&gt;%n &lt;HR Size=1&gt;"  />

      </layout>

    </appender>


    <!-- 信息日志类 -->

    <logger name="loginfo">

      <level value="ALL" />

      <appender-ref ref="InfoAppender" />

    </logger>

    <!-- 信息日志附加介质-->

    <appender name="InfoAppender" type="log4net.Appender.RollingFileAppender">

      <!--日志文件路径-->

      <param name="File" value="Log\\LogInfo\\" />

      <!--是否是向文件中追加日志-->

      <param name="AppendToFile" value="true" />

      <!--log保留天数-->

      <param name="MaxSizeRollBackups" value="100" />

      <param name="MaxFileSize" value="1" />

      <!--日志文件名是否是固定不变的-->

      <param name="StaticLogFileName" value="false" />

      <!--日志文件名格式为:2008-08-31.log-->

      <param name="DatePattern" value="yyyy-MM-dd&quot;.htm&quot;" />

      <!--日志根据日期滚动-->

      <param name="RollingStyle" value="Date" />

      <!--信息日志布局-->

      <layout type="log4net.Layout.PatternLayout">

        <param name="ConversionPattern" value="&lt;HR COLOR=blue&gt;%n日志时间:%d [%t] &lt;BR&gt;%n日志级别:%-5p &lt;BR&gt;%n%m &lt;BR&gt;%n &lt;HR Size=1&gt;"  />

      </layout>

    </appender>

  </log4net>


  <!-- To customize the asp.net core module uncomment and edit the following section. 

  For more info see https://go.microsoft.com/fwlink/?linkid=838655 -->

  <!--

  <system.webServer>

    <handlers>

      <remove name="aspNetCore"/>

      <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified"/>

    </handlers>

    <aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" />

  </system.webServer>

  -->


</configuration>

3、在asp.net core项目中 Startup.cs 中需要添加初始化log4net的仓储名,主要是用来给log4net标记一个名称,这边可以随意。

640?wx_fmt=png

 

4、在项目中创建一个类用来记录log的日志格式以及数据分类存放

创建LogHelper.cs,

640?wx_fmt=png

 定义log格式,当然自己可以随意定义哈。

#region 全局异常错误记录持久化

        /// <summary>

        /// 全局异常错误记录持久化

        /// </summary>

        /// <param name="throwMsg"></param>

        /// <param name="ex"></param>

        public static void ErrorLog(string throwMsg, Exception ex)

        {

            string errorMsg = string.Format("【抛出信息】:{0} <br>【异常类型】:{1} <br>【异常信息】:{2} <br>【堆栈调用】:{3}", new object[] { throwMsg,

                ex.GetType().Name, ex.Message, ex.StackTrace });

            errorMsg = errorMsg.Replace("\r\n", "<br>");

            errorMsg = errorMsg.Replace("位置", "<strong style=\"color:red\">位置</strong>");

            logerror.Error(errorMsg);

        }

        #endregion

#region 自定义操作记录

        /// <summary>

        /// 自定义操作记录,与仓储中的增删改的日志是记录同一张表

        /// </summary>

        /// <param name="throwMsg"></param>

        /// <param name="ex"></param>

        public static void WriteLog(string throwMsg, Exception ex)

        {

            string errorMsg = string.Format("【抛出信息】:{0} <br>【异常类型】:{1} <br>【异常信息】:{2} <br>【堆栈调用】:{3}", new object[] { throwMsg,

                ex.GetType().Name, ex.Message, ex.StackTrace });

            errorMsg = errorMsg.Replace("\r\n", "<br>");

            errorMsg = errorMsg.Replace("位置", "<strong style=\"color:red\">位置</strong>");

            logerror.Error(errorMsg);

        }

        #endregion

5、有了以上的log格式,这样我就开始定义一下全局异常处理吧

我这边先创建一个全局异常处理类 GlobalExceptions.cs 然后需要在startup.cs中注入

在ConfigureServices 方法中注入。

//注入全局异常捕获services.AddMvc(o =>{
o.Filters.Add(typeof(GlobalExceptions));
}); 

6、GlobalExceptions类中添加处理,当然异常需要继承IExceptionFilter。

代码如下:

GlobalExceptions 

public class GlobalExceptions : IExceptionFilter

    {

        private readonly IHostingEnvironment _env;

        public GlobalExceptions(IHostingEnvironment env)

        {

            _env = env;

        }

        public void OnException(ExceptionContext context)

        {

            var json = new JsonErrorResponse();

            //这里面是自定义的操作记录日志

            if (context.Exception.GetType() == typeof(UserOperationException))

            {

                json.Message = context.Exception.Message;

                if (_env.IsDevelopment())

                {

                    json.DevelopmentMessage = context.Exception.StackTrace;//堆栈信息

                }

                context.Result = new BadRequestObjectResult(json);//返回异常数据

            }

            else

            {

                json.Message = "发生了未知内部错误";

                if (_env.IsDevelopment())

                {

                    json.DevelopmentMessage = context.Exception.StackTrace;//堆栈信息

                }

                context.Result = new InternalServerErrorObjectResult(json);

            }


            //采用log4net 进行错误日志记录

            LogHelper.ErrorLog(json.Message, context.Exception);


        }

    }

    public class InternalServerErrorObjectResult : ObjectResult

    {

        public InternalServerErrorObjectResult(object value) : base(value)

        {

            StatusCode = StatusCodes.Status500InternalServerError;

        }

    }

JsonErrorResponse.cs 

public class JsonErrorResponse

    {

        /// <summary>

        /// 生产环境的消息

        /// </summary>

        public string Message { get; set; }

        /// <summary>

        /// 开发环境的消息

        /// </summary>

        public string DevelopmentMessage { get; set; }

    }


/// <summary>

    /// 操作日志

    /// </summary>

    public class UserOperationException : Exception

    {

        public UserOperationException() { }

        public UserOperationException(string message) : base(message) { }

        public UserOperationException(string message, Exception innerException) : base(message, innerException) { }

    }

自此,全局异常配置完成,然后我们可以测试一下,随便写一个除以0的代码在日志记录中就会出现如下的展示:

哇,发现我的错误日志的格式非常的清楚,当然这个跟我的做事态度以及性格有很大的关系的啦,毕竟楼主还是很帅的。哈哈哈。

640?wx_fmt=png

 三、NLog使用


 

1、在项目中添加nlog的nuget包引入,“NLog.Web.AspNetCore”

640?wx_fmt=png

2、创建nlog.config文件,大家会发现我的log格式跟上面的格式操作,而且我的分层层次也很清楚。哈哈

<?xml version="1.0" encoding="utf-8" ?>

<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"

      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

      autoReload="true">

  <!-- the targets to write to -->

  <targets>

    <!-- 输出到文件,这个文件记录所有的日志 -->

    <target xsi:type="File" name="allfile" fileName="Log\LogAll\${shortdate}.htm"

                layout="&lt;HR COLOR=red&gt;${longdate}&lt;BR&gt;${logger}&lt;BR&gt;${uppercase:${level}}&lt;BR&gt;${message} ${exception}&lt;HR Size=1&gt;" />


    <!-- 输出到文件,这个文件记录错误日志 -->

    <target xsi:type="File" name="logError" fileName="Log\LogError\${shortdate}.htm"

            layout="&lt;HR COLOR=red&gt;【异常时间】:${date} &lt;BR&gt;【异常级别】:${level:uppercase=true} &lt;BR&gt;${message}&lt;HR Size=1&gt;" />


    <!-- 输出到文件,这个文件记录操作日志 -->

    <target xsi:type="File" name="logInfo" fileName="Log\LogInfo\${shortdate}.htm"

                 layout="&lt;HR COLOR=red&gt;【操作时间】:${date} &lt;BR&gt;【操作级别】:${level:uppercase=true} &lt;BR&gt;${message}&lt;HR Size=1&gt;" />

  </targets>

  <!-- rules to map from logger name to target -->

  <rules>

    <!--All logs, including from Microsoft-->

    <logger name="*" minlevel="Trace" writeTo="allfile" />

    <logger name="*" minlevel="Error" writeTo="logError" />

    <logger name="*" minlevel="Info" writeTo="logInfo" />

    <logger name="Microsoft.*" maxLevel="Info" final="true" />

  </rules>

</nlog>

3、在startup.cs中的  Configure方法注入

//ILoggerFactory loggerFactory
loggerFactory.AddNLog(); NLog.LogManager.LoadConfiguration("nlog.config"
); //填入上面创建的文件的名称

 

4、创建NLogHelp.cs类

public class NLogHelp

    {

        public static Logger logger = LogManager.GetCurrentClassLogger();

        public static void ErrorLog(string throwMsg, Exception ex)

        {

            string errorMsg = string.Format("【异常信息】:{0} <br>【异常类型】:{1} <br>【堆栈调用】:{2}",

                new object[] { throwMsg, ex.GetType().Name, ex.StackTrace });

            errorMsg = errorMsg.Replace("\r\n", "<br>");

            errorMsg = errorMsg.Replace("位置", "<strong style=\"color:red\">位置</strong>");

            logger.Error(errorMsg);

        }

        public static void InfoLog(string operateMsg)

        {

            string errorMsg = string.Format("【操作信息】:{0} <br>",

                new object[] { operateMsg });

            errorMsg = errorMsg.Replace("\r\n", "<br>");

            logger.Info(errorMsg);

        }

    }

5、在上面log4net中的GlobalExceptions类把

LogHelper.ErrorLog(json.Message, context.Exception)替换成如下:NLogHelp.ErrorLog(json.Message,context.Exception)即可。

运行测试如下:

【异常时间】:2018/09/03 14:41:36.786 

【异常级别】:ERROR 

【异常信息】:错误消息:Failed to create instance of type

at AspectCore.Injector.ServiceCallSiteResolver.ResolvePropertyInject(ServiceDefinition service)

【异常类型】:InvalidOperationException 

【堆栈调用】: at AspectCore.Injector.ServiceCallSiteResolver.ResolveTypeService(TypeServiceDefinition typeServiceDefinition)

at AspectCore.Injector.ServiceCallSiteResolver.ResolvePropertyInject(ServiceDefinition service)

at System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory)

at AspectCore.Injector.ServiceResolver.b

自此,完美搞定,等后期我将会介绍采用ELK+NLog进行数据采集及展示,请大家拭目以待吧。

原文链接:https://www.cnblogs.com/guolianyu/p/9580626.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/320088.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

牛客网 【每日一题】5月20日题目 简单瞎搞题

比赛链接 文章目录题目描述题解&#xff1a;代码&#xff1a;题目描述 输入描述: 第一行一个数 n。 然后 n 行&#xff0c;每行两个数表示 li,ri。 输出描述: 输出一行一个数表示答案。 示例1 输入 5 1 2 2 3 3 4 4 5 5 6输出 26备注: 1 ≤ n , li , ri ≤ 100 题解&#xf…

ASP.NET Core 2.0利用MassTransit集成RabbitMQ

在ASP.NET Core上利用MassTransit来集成使用RabbitMQ真的很简单&#xff0c;代码也很简洁。近期因为项目需要&#xff0c;我便在这基础上再次进行了封装&#xff0c;抽成了公共方法&#xff0c;使得使用RabbitMQ的调用变得更方便简洁。那么&#xff0c;就让咱们来瞧瞧其魅力所在…

《通过C#学Proto.Actor模型》之 HelloWorld

在微服务中&#xff0c;数据最终一致性的一个解决方案是通过有状态的Actor模型来达到&#xff0c;那什么是Actor模型呢&#xff1f;Actor是并行的计算模型&#xff0c;包含状态&#xff0c;行为&#xff0c;并且包含一个邮箱&#xff0c;来异步处理消息。关于Actor的介绍可参考…

[XSY] 计数(DP,NTT,分治)

计数 考虑转化题目&#xff0c;变为网格上有若干个点&#xff0c;要从(0,0)(0,0)(0,0)走到(n,an1)(n,a_{n1})(n,an1​) &#xff0c;每一步只能往右走一步或往上走一步&#xff0c;且若当前在(i,j)(i,j)(i,j) &#xff0c;必须满足0≤j≤ai10\leq j\leq a_{i1}0≤j≤ai1​&…

.Net Core应用框架Util介绍(一)

距离上次发文&#xff0c;已经过去了三年半&#xff0c;这几年技术更新节奏异常迅猛&#xff0c;.Net进入了跨平台时代&#xff0c;前端也被革命性的颠覆。回顾2015年&#xff0c;正当我还沉迷于JQuery EasyUi的封装时&#xff0c;突然意识到技术已经过时。JQuery在面对更加复…

使用.NET Core+Docker 开发微服务

.NET Core发布很久了,因为近几年主要使用java&#xff0c;所以还没使用过.NET Core&#xff0c;今天正好有一个c#写的demo&#xff0c;需要做成服务&#xff0c;不想再转成java来实现&#xff0c;考虑使用.NET CORE来尝下鲜&#xff0c;目标是开发一个微服务&#xff0c;然后部…

Steeltoe之Config客户端篇

Steeltoe是一款开源项目&#xff0c;其目标是选取源自Netflix及其它公司的工具&#xff0c;使它们能够运用于.NET社区。它不仅可以在.NET Core上&#xff0c;也可以在.NET Framework 4.X以上使用。此外&#xff0c;大多数的组件能够同时运行在本地机器及Cloud Foundry(一个领先…

[XSY] 绿色(圆方树、树形DP、树上差分)

绿色 题意简述 题解 首先&#xff0c;每次修改完点权后&#xff0c;重新考虑一遍所有路径显然是不现实的&#xff0c;所以我们考虑求出经过每个点的两端同色的简单路径数&#xff0c;这样权值和容易统计和修改。 接下来分析仙人掌上的简单路径性质。一条简单路径上的边&…

牛客网 【每日一题】5月29日 管道取珠

链接&#xff1a; 文章目录题目描述题意&#xff1a;题解&#xff1a;代码&#xff1a;时间限制&#xff1a;C/C 2秒&#xff0c;其他语言4秒 空间限制&#xff1a;C/C 524288K&#xff0c;其他语言1048576K 64bit IO Format: %lld题目描述 管道取珠是小X很喜欢的一款游戏。在本…

半天搭建你的Jenkins持续集成与自动化部署系统

前言相信每一位程序员都经历过深夜加班上线的痛苦&#xff01;而作为一个加班上线如家常便饭的码农&#xff0c;更是深感其痛。由于我们所做的系统业务复杂&#xff0c;系统庞大&#xff0c;设计到多个系统之间的合作&#xff0c;而核心系统更是采用分布式系统架构&#xff0c;…

.Net业务搭配实用技术栈

前言昨天有篇文章在讨论webform的设计思路&#xff0c;我已经四五年不用webform了&#xff0c;虽然它也提供了HttpModule和httphandle来处理请求&#xff0c;提供了一般处理程序ashx来简化处理流程&#xff0c;但依然会想起它的form runatserver&#xff0c;想起注册客户端脚本…

Service Fabric 用 Powershell 部署应用到本地

前置说明安装 Service Fabric SDK&#xff0c;会在本机 C:\Program Files\Microsoft SDKs\Service Fabric\Tools\PSModule\ServiceFabricSDK 生成部署脚本&#xff0c;如下图&#xff1a;用VS创建一个 Service Fabric 应用后&#xff0c;有一个部署脚本&#xff0c;位置在 [应用…

ElasticSearch入门 附.Net Core例子

1.什么是ElasticSearch?Elasticsearch是基于Lucene的搜索引擎。它提供了一个分布式&#xff0c;支持多租户的全文搜索引擎&#xff0c;它具有HTTP Web界面和无模式JSON文档。 Elasticsearch是用Java开发的&#xff0c;根据Apache许可条款作为开源发布。----来自维基百科的解释…

《.NET 性能优化》送书活动结果公布

截止到9月7日18&#xff1a;00&#xff08;规则本是12&#xff1a;00&#xff0c;忙的忘记了这事&#xff0c;18点截的图&#xff09;&#xff0c;本次送书活动《.NET 性能优化》共收到100多位同学参与回复&#xff0c;本次很多同学在看到活动的书 &#xff0c;自行就到异步社区…

hdu-2844 Coins (混合背包+二进制优化)

HDU链接 文章目录题目描述&#xff1a;题意&#xff1a;题解&#xff08;代码&#xff09;题目描述&#xff1a; 输入描述: 输出描述: For each test case output the answer on a single line. 输入 3 10 1 2 4 2 1 1 2 5 1 4 2 1 0 0输出 8 4题意&#xff1a; 有n种硬币&…

.NET Core WebApi中实现多态数据绑定

什么是多态数据绑定&#xff1f;我们都知道在ASP.NET Core WebApi中数据绑定机制&#xff08;Data Binding&#xff09;负责绑定请求参数&#xff0c; 通常情况下大部分的数据绑定都能在默认的数据绑定器&#xff08;Binder&#xff09;中正常的进行&#xff0c;但是也会出现少…

hdu 1059 Dividing

Hdu链接 文章目录题目描述题意&#xff1a;题解&#xff1a;代码&#xff1a;题目描述 输入描述: 输出描述: 示例1 输入 1 0 1 2 0 0 1 0 0 0 1 1 0 0 0 0 0 0输出 Collection #1: Cant be divided.Collection #2: Can be divided.题意&#xff1a; 有价值分别是1~6的6种…

.Net Core应用框架Util介绍(二)

Util的开源地址https://github.com/dotnetcore/utilUtil的开源协议Util以MIT协议开源&#xff0c;这是目前最宽松的开源协议&#xff0c;你不仅可以用于商业项目&#xff0c;还能把Util的代码放进你的框架&#xff0c;放心使用。Util的命名Util这个名字看上去不怎么高大上&…

.Net架构篇:实用中小型公司支付中心设计

前言说起支付平台&#xff0c;支付宝量级的支付平台和一个小型公司的支付不可同日耳语。一个初创或刚创业一两年的公司&#xff0c;一没人力&#xff0c;二没财力的情况下&#xff0c;如果也想对接支付那怎么办呢&#xff1f;感谢支付宝和微信支付&#xff0c;两大行业巨头提供…

netcore编程之后面对不习惯的xshell黑屏部署,是时候使用jenkins自动化发布工具了...

在很久之前net还只能在windows上部署的时候&#xff0c;或许很多创业公司的朋友发布项目还都是人肉部署&#xff0c;反正windows都是可视化的界面&#xff0c;拖拖拉拉&#xff0c;开开关关还不是特别麻烦。。。现如今你的项目需要在linux上部署&#xff0c;可惜的是再也没有什…