文档章节

asp.net core之NLog

一介草民Coder
 一介草民Coder
发布于 07/13 06:11
字数 990
阅读 65
收藏 0

行业解决方案、产品招募中!想赚钱就来传!>>>

  1. NuGet添加 NLog.Web.AspNetCore

    <PackageReference Include="Microsoft.AspNetCore.App" />
    
  2. 添加配置文件

    新建一个文件nlog.config(建议全部小写,linux系统中要注意), 并右键点击其属性,将其“复制到输出目录”设置为“始终复制”。文件内容如下

    <?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">
    
      <targets>
        
        <target xsi:type="File" 
                name="allfile" 
                keepFileOpen="false" 
                encoding="utf-8"
                fileName="${basedir}/logs/${shortdate}-${level}.log"
                layout="${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}" />
        
        
        <target xsi:type="Null" name="blackhole" />
        
        <!--需要安装下mysql驱动-->
        <target name="database" xsi:type="Database" dbProvider="MySql.Data.MySqlClient.MySqlConnection, MySql.Data" 
                connectionString="server=127.0.0.1;Database=example;user id=root;password=qwe123;SslMode=none" >
          <commandText>
            insert into log (
               Application, Logged, Level, Message,Username,ServerName, Url,RemoteAddress,Logger, CallSite, Exception
            ) values (
               @Application, @Logged, @Level, @Message,@Username,@ServerName, @Url,@RemoteAddress,@Logger, @Callsite, @Exception
            );
          </commandText>
          <parameter name="@application" layout="yourappname" />
          <parameter name="@logged" layout="${date}" />
          <parameter name="@level" layout="${level}" />
          <parameter name="@message" layout="${message}" />
          <parameter name="@username" layout="${identity}" />
          <parameter name="@serverName" layout="${aspnet-request-host}" />
          <parameter name="@url" layout="${aspnet-request-url:IncludeQueryString=true}" />
          <parameter name="@remoteAddress" layout="${aspnet-Request-ip}" />
          <parameter name="@logger" layout="${logger}" />
          <parameter name="@callSite" layout="${callsite}" />
          <parameter name="@exception" layout="${exception:tostring}" />
        </target>
        
      </targets>
      <rules>
        <logger name="*" minlevel="Trace" writeTo="allfile" />
        <logger name="Microsoft.*" minlevel="Trace" writeTo="blackhole" final="true" />
        <logger name="dblog" minlevel="Trace" writeTo="database" />
      </rules>
    </nlog>
    
    <!--
     CREATE TABLE `log` (
      `Id` int(10) unsigned NOT NULL AUTO_INCREMENT,
      `Application` varchar(50) DEFAULT NULL,
      `Logged` datetime DEFAULT NULL,
      `Level` varchar(50) DEFAULT NULL,
      `Message` text DEFAULT NULL,
      `UserName` varchar(512) Default Null,
      `ServerName` text Default Null,
      `Url` text NULL,
      `RemoteAddress` nvarchar(100) NULL,
      `Logger` text DEFAULT NULL,
      `Callsite` text DEFAULT NULL,
      `Exception` text DEFAULT NULL,
      PRIMARY KEY (`Id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
    -->
        <Content Update="nlog.config">
          <CopyToOutputDirectory>Always</CopyToOutputDirectory>
        </Content>
    
  3. 修改Program.cs文件

    添加引用 NLog.Web 和 Microsoft.Extensions.Logging。
    在 .UseStartup() 后添加一句 .UseNLog() 

    如果要禁用默认的输出框日志,可以调用logging.ClearProviders()

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .ConfigureLogging(logging =>
            {
                logging.ClearProviders();
                logging.SetMinimumLevel(LogLevel.Trace);
            })
            .UseNLog();
    
  4. 输出到数据库

    除了把日志输出到文件之外,也可以保存到SQL Server, PostgreSQL, MySQL, Elasticsearch等。下面是保存到SQL Server的一个示例配置:

    <?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"
          internalLogLevel="info"
          internalLogFile="d:\temp\logs\internal-nlog.txt">
    
      <!-- enable asp.net core layout renderers -->
      <extensions>
        <add assembly="NLog.Web.AspNetCore"/>
      </extensions>
    
      <!-- the targets to write to -->
      <targets>
        <!-- write logs to file  -->
        <target xsi:type="File" name="allfile" fileName="d:\temp\logs\all-${shortdate}.log"
                layout="${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}" />
    
        <target name="blackhole" xsi:type="Null" />
    
        <target name="database" xsi:type="Database" dbProvider="System.Data.SqlClient">
          <connectionString>
            Server=.;Database=Log;Trusted_Connection=True
          </connectionString>
          <commandText>
                  insert into dbo.Log (
                  Application, Logged, Level, Message,
                  Logger, CallSite, Exception
                  ) values (
                  @Application, @Logged, @Level, @Message,
                  @Logger, @Callsite, @Exception
                  );
              </commandText>
     
              <parameter name="@application" layout="Application" />
              <parameter name="@logged" layout="${date}" />
              <parameter name="@level" layout="${level}" />
              <parameter name="@message" layout="url: ${aspnet-request-url} | action: ${aspnet-mvc-action} | ${message}" />
     
              <parameter name="@logger" layout="${logger}" />
              <parameter name="@callSite" layout="${callsite:filename=true}" />
              <parameter name="@exception" layout="${exception:tostring}" />
        </target>
      </targets>
    
      <!-- rules to map from logger name to target -->
      <rules>
        <!--All logs, including from Microsoft-->
        <logger name="*" minlevel="Info" writeTo="allfile" />
        
        <!--Skip non-critical Microsoft logs and so log only own logs-->
        <logger name="Microsoft.*" maxLevel="Info" final="true" />
        <!-- BlackHole without writeTo -->
        <logger name="*" minlevel="Info" writeTo="database" />
      </rules>
    </nlog>
    
  5. 配置简要说明

    targets:用于配置输出相关内容,比如 type 属性可选项为File、Mail、Console等,用于设置输出目标,layout属性用于设置输出信息的组成元素及格式。
    rules: 其实是一个“路由表”,日志是从上到下匹配的。 logger name="Microsoft." maxlevel="Info" final="true" 一句话的 final="true" 过滤掉了"Microsoft." Info级别以下的日志。

  6. 全局异常中间件

    除了输出日志外,可以写一个中间件来处理全局的异常。

    public class GlobalErrorHandlingMiddleware
    {
        private readonly RequestDelegate next;
        private readonly ILogger<GlobalErrorHandlingMiddleware> _logger;
    
        public GlobalErrorHandlingMiddleware(RequestDelegate next, ILogger<GlobalErrorHandlingMiddleware> logger)
        {
            this.next = next;
            this._logger = logger;
        }
    
        public async Task Invoke(HttpContext context)
        {
            try
            {
                await next(context);
            }
            catch (Exception ex)
            {
    
                var Request = context.Request;
                ///访问路径
                string visit_url = Request.Path;
                ///URL 请求方法
                string method = Request.Method.ToUpper();
                ///URL 请求的参数
                string url_paramters = string.Empty;
    
                if (method == "GET") url_paramters = Request.QueryString.Value;
    
    
                if (method == "POST")
                {
                    foreach (var item in Request.Form)
                        url_paramters = url_paramters + item.Key + "=" + item.Value + "&";
                }
    
                ///错识信息
                string err_msg = ex.Message;//ex.StackTrace;
    
                ///日志格式内容
                var logs_msg = $"{visit_url}#{method}#{url_paramters}#{err_msg}";
    
                _logger.LogError(logs_msg);
    
                var statusCode = context.Response.StatusCode;
    
                var msg = $"Status Code: {statusCode}, Message: {ex.Message}";
    
                await HandleExceptionAsync(context, msg);
            }
        }
    
        private static Task HandleExceptionAsync(HttpContext context, string msg)
        {
            //var data = new Result { Title = "异常中间件返回", Msg = msg };
            //var result = JsonConvert.SerializeObject(data);
            //context.Response.ContentType = "application/json;charset=utf-8";
            return context.Response.WriteAsync(msg);
        }
    }
    
    public static class GlobalErrorHandlingMiddlewareExtensions
    {
        public static IApplicationBuilder UseGlobalErrorHandlingMiddleware(
            this IApplicationBuilder builder)
        {
            return builder.UseMiddleware<GlobalErrorHandlingMiddleware>();
        }
    }
一介草民Coder
粉丝 0
博文 84
码字总数 54313
作品 0
浦东
程序员
私信 提问
加载中
请先登录后再评论。
数据库代码辅助工具--MaoCaiJun.Database

MaoCaiJun.DataBase 是一个用于 Microsoft Visual Studio 的数据库代码生成组件。它是基于 xml 文件的代码创建工具,支持sql2000,sql2005,sql2008,access, SQLite MaoCaiJun.Database 数据库...

mccj
2013/02/06
2.2K
1
Amazing Audio Engine

Amazing Audio Engine 是基于 Core Audio 的远程 IO 系统用以提供低延迟的音频连接,通过内置的混音、过滤和生效。该框架支持大多数音频格式和比特率,同时提供音频输入、录制和监控功能。 ...

匿名
2013/03/21
1.2K
0
DKPro Core

DKPro Core 是基于 Apache UIMA 框架之上的自然语言处理(NLP)的软件组件。DKPro Core 提供了这样的第三方工具以及原NLP组件的包装。 DKPro核心建立在很大程度上uimaFIT可以快速方便的开发N...

匿名
2012/10/24
1.8K
0
Ajax 文件上传组件--fineuploader

Fine Uploader 是一个采用Ajax技术实现的文件上传组件,支持拖拽文件上传。使用很简便,只需在页面中引入相应的CSS+JavaScript,剩下的就只服务器端处理逻辑。在其提供的下载包中已经有多种语...

匿名
2012/10/27
1.5W
2
LightWeb--LightWeb

使用较少的外部框架, 搭建轻型Web架构. 已经或将包含: 轻型依赖注入的实现 Front Controllerf模式实现Http Request的处理,完全摆脱Web Form和ASP.Net Repository实现持久层。 持续完善中, 希...

予沁安
2012/11/21
1.4K
0

没有更多内容

加载失败,请刷新页面

加载更多

ThingJS,3D可视化的采集与分析

物联网中最重要的是“物”,通过内置采集数据的传感器,我们实时了解设备——也就是“物”的数据,那如何利用数据做分析决策呢?这就进入到ThingJS熟悉的可视化范畴了。 3D可视化展示 物联网...

ThingJS
18分钟前
8
0
【技术博客】GPU 编程之从零开始实现 MNIST-CNN

【技术博客】GPU 编程之从零开始实现 MNIST-CNN 很多人最开始接触“ GPU ”想必都是通过游戏,一块高性能的 GPU 能带来非凡的游戏体验。而真正使GPU被越来越多人熟知是因为机器学习、深度学习...

MomodelAI
22分钟前
0
0
如何在Linux中符号链接文件? [关闭] - How can I symlink a file in Linux? [closed]

问题: I want to make a symbolic link in Linux. 我想在Linux中建立一个符号链接。 I have written this Bash command where the first path is the folder I want link into and the sec......

富含淀粉
29分钟前
10
0
好用到爆的 Java 技巧

本文不是一个吹嘘的文章,不会讲很多高深的架构,相反,会讲解很多基础的问题和写法问题,如果读者自认为基础问题和写法问题都是不是问题,那请忽略这篇文章,节省出时间去做一些有意义的事情...

码农突围
53分钟前
8
0
消息队列(MessageQueue)-分析

这里分析消息队列的原理和一般做法和其理念价值 这里还会 分析 NATS 和其可改进点 TODO

梦想游戏人
57分钟前
20
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部