NLog帮助类

 1  public enum LogType
2 {
3 [Description("网站")]
4 Web,
5 [Description("数据库")]
6 DataBase,
7 [Description("Api接口")]
8 ApiRequest,
9 [Description("中间件")]
10 Middleware
11 }
12 public static class NLogUtil
13 {
14 public static Logger dbLogger = LogManager.GetLogger("logdb");
15 public static Logger fileLogger = LogManager.GetLogger("logfile");
16
17 /// <summary>
18 /// 写日志到数据库
19 /// </summary>
20 /// <param name="logLevel">日志等级</param>
21 /// <param name="logType">日志类型</param>
22 /// <param name="message">信息</param>
23 /// <param name="exception">异常</param>
24 public static void WriteDBLog(LogLevel logLevel, LogType logType, string message, Exception exception = null, HttpContext httpcontext = null)
25 {
26 LogEventInfo theEvent = new LogEventInfo(logLevel, dbLogger.Name, message);
27 theEvent.Properties["LogType"] = logType.ToString();
28 if (httpcontext != null)
29 {
30 theEvent.Properties["MachineIp"] = httpcontext.Request.UserHostAddress.ToString();
31 theEvent.Properties["NetRequestMethod"] = httpcontext.Request.HttpMethod.ToString();
32 theEvent.Properties["NetRequestUrl"] = httpcontext.Request.Url.ToString();
33 }
34 theEvent.Exception = exception;
35 dbLogger.Log(theEvent);
36 }
37
38 /// <summary>
39 /// 写日志到文件
40 /// </summary>
41 /// <param name="logLevel">日志等级</param>
42 /// <param name="logType">日志类型</param>
43 /// <param name="message">信息</param>
44 /// <param name="exception">异常</param>
45 public static void WriteFileLog(LogLevel logLevel, LogType logType, string message, Exception exception = null, HttpContext httpcontext = null)
46 {
47 LogEventInfo theEvent = new LogEventInfo(logLevel, fileLogger.Name, message);
48 theEvent.Properties["LogType"] = logType.ToString();
49 if (httpcontext != null)
50 {
51 theEvent.Properties["MachineIp"] = httpcontext.Request.UserHostAddress.ToString();
52 theEvent.Properties["NetRequestMethod"] = httpcontext.Request.HttpMethod.ToString();
53 theEvent.Properties["NetRequestUrl"] = httpcontext.Request.Url.ToString();
54 }
55 theEvent.Exception = exception;
56 fileLogger.Log(theEvent);
57 }
58 /// <summary>
59 /// 确保NLog配置文件sql连接字符串正确
60 /// </summary>
61 /// <param name="nlogPath"></param>
62 /// <param name="sqlConnectionStr"></param>
63 public static void EnsureNlogConfig(string nlogPath, string sqlConnectionStr)
64 {
65 XDocument xd = XDocument.Load(nlogPath);
66 if (xd.Root.Elements().FirstOrDefault(a => a.Name.LocalName == "targets")
67 is XElement targetsNode && targetsNode != null &&
68 targetsNode.Elements().FirstOrDefault(a => a.Name.LocalName == "target" && a.Attribute("name").Value == "log_database")
69 is XElement targetNode && targetNode != null)
70 {
71 if (!targetNode.Attribute("connectionString").Value.Equals(sqlConnectionStr))//不一致则修改
72 {
73 //这里暂时没有考虑dbProvider的变动
74 targetNode.Attribute("connectionString").Value = sqlConnectionStr;
75 xd.Save(nlogPath);
76 //编辑后重新载入配置文件(不依靠NLog自己的autoReload,有延迟)
77 LogManager.Configuration = new XmlLoggingConfiguration(nlogPath);
78 }
79 }
80 }
81 }

nlog.config配置文件

 1 <?xml version="1.0" encoding="utf-8"?>
2 <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" autoReload="true">
3 <targets>
4 <target name="log_database" xsi:type="Database" dbProvider="MySql.Data.MySqlClient.MySqlConnection,MySql.Data" connectionString="Server=192.168.3.209;Port=3306; Database=ismartecab_asrs; Connection Timeout=60; uid=ist;pwd=123456;">
5 <commandText>
6 INSERT INTO syslog_t
7 (LogDate
8 ,LogLevel
9 ,LogType
10 ,Logger
11 ,Message
12 ,MachineName
13 ,MachineIp
14 ,NetRequestMethod
15 ,NetRequestUrl
16 ,NetUserIsauthenticated
17 ,NetUserAuthtype
18 ,NetUserIdentity
19 ,Exception)
20 VALUES
21 (@LogDate
22 ,@LogLevel
23 ,@LogType
24 ,@Logger
25 ,@Message
26 ,@MachineName
27 ,@MachineIp
28 ,@NetRequestMethod
29 ,@NetRequestUrl
30 ,@NetUserIsauthenticated
31 ,@NetUserAuthtype
32 ,@NetUserIdentity
33 ,@EXCEPTION);
34 </commandText>
35 <parameter name="@LogDate" layout="${date}" />
36 <parameter name="@LogLevel" layout="${level}" />
37 <parameter name="@LogType" layout="${event-properties:item=LogType}" />
38 <parameter name="@Logger" layout="${logger}" />
39 <parameter name="@Message" layout="${message}" />
40 <parameter name="@MachineName" layout="${machinename}" />
41 <parameter name="@MachineIp" layout="${event-properties:item=MachineIp}" />
42 <parameter name="@NetRequestMethod" layout="${event-properties:item=NetRequestMethod}" />
43 <parameter name="@NetRequestUrl" layout="${event-properties:item=NetRequestUrl}" />
44 <parameter name="@NetUserIsauthenticated" layout="${aspnet-user-isauthenticated}" />
45 <parameter name="@NetUserAuthtype" layout="${aspnet-user-authtype}" />
46 <parameter name="@NetUserIdentity" layout="${aspnet-user-identity}" />
47 <parameter name="@Exception" layout="${exception:tostring}" />
48 </target>
49 <target name="log_file" xsi:type="File" fileName="${basedir}/logs/${shortdate}.log" layout="====================================================================================================== ${newline}日期:${longdate} ${newline}日志类型: ${level:uppercase=false} ${newline}客户端IP: ${event-properties:item=MachineIp} ${newline}请求方式: ${event-properties:item=NetRequestMethod} ${newline}请求地址: ${event-properties:item=NetRequestUrl} ${newline}错误消息: ${message} ${onexception:${exception:format=tostring} ${newline}堆栈信息: ${stacktrace}" />
50 </targets>
51 <rules>
52 <!--跳过所有级别的Microsoft组件的日志记录-->
53 <logger name="Microsoft.*" final="true" />
54 <!-- BlackHole without writeTo -->
55 <!--只通过数据库记录日志,如果给了name名字,cs里用日志记录的时候,取logger需要把name当做参数-->
56 <logger name="logdb" writeTo="log_database" />
57 <logger name="logfile" writeTo="log_file" />
58 </rules>
59 </nlog>

使用示例

 NLogUtil.WriteDBLog(NLog.LogLevel.Info, LogType.ApiRequest, "API started successfully!", null, null);

全局异常

    public class ApiExceptionHandlingAttribute : ExceptionFilterAttribute
{
/// <summary>
/// 统一对调用异常信息进行处理,返回自定义的异常信息
/// </summary>
/// <param name="context">HTTP上下文对象</param>
public override void OnException(HttpActionExecutedContext context)
{
NLogUtil.WriteDBLog(NLog.LogLevel.Error, LogType.ApiRequest, context.Exception.Message, context.Exception, HttpContext.Current);
base.OnException(context);
}
}

.NETCORE 下使用 NLog的更多相关文章

  1. .Net Core Web/Console 下使用Nlog

    .Net Core Console 下使用Nlog 官方介绍: https://github.com/NLog/NLog.Web/wiki/Getting-started-with-ASP.NET-C ...

  2. .NetCore 下开发独立的(RPL)含有界面的组件包 (六)实现业务功能

    .NetCore 下开发独立的(RPL)含有界面的组件包 (一)准备工作 .NetCore 下开发独立的(RPL)含有界面的组件包 (二)扩展中间件及服 务 .NetCore 下开发独立的(RPL)含 ...

  3. .NetCore 下开发独立的(RPL)含有界面的组件包 (五)授权过滤参数处理

    .NetCore 下开发独立的(RPL)含有界面的组件包 (一)准备工作 .NetCore 下开发独立的(RPL)含有界面的组件包 (二)扩展中间件及服 务 .NetCore 下开发独立的(RPL)含 ...

  4. .NetCore 下开发独立的(RPL)含有界面的组件包 (四)授权过滤

    .NetCore 下开发独立的(RPL)含有界面的组件包 (一)准备工作 .NetCore 下开发独立的(RPL)含有界面的组件包 (二)扩展中间件及服 务 .NetCore 下开发独立的(RPL)含 ...

  5. .NetCore 下开发独立的(RPL)含有界面的组件包 (三)构建界面

    .NetCore 下开发独立的(RPL)含有界面的组件包 (一)准备工作 .NetCore 下开发独立的(RPL)含有界面的组件包 (二)扩展中间件及服 务 .NetCore 下开发独立的(RPL)含 ...

  6. .NetCore 下开发独立的(RPL)含有界面的组件包 (二)扩展中间件及服务

    .NetCore 下开发独立的(RPL)含有界面的组件包 (一)准备工作 .NetCore 下开发独立的(RPL)含有界面的组件包 (二)扩展中间件及服 务 .NetCore 下开发独立的(RPL)含 ...

  7. .NetCore 下开发独立的(RPL)含有界面的组件包 (一)准备工作

    .NetCore 下开发独立的(RPL)含有界面的组件包 (一)准备工作 .NetCore 下开发独立的(RPL)含有界面的组件包 (二)扩展中间件及服 务 .NetCore 下开发独立的(RPL)含 ...

  8. NetCore下模拟和使用Modbus工业通信协议

    Tips: 1.目前NetCore下与Modbus通信的框架主要选择了 Modbus.Net  https://github.com/parallelbgls/Modbus.Net 2.modbus是 ...

  9. .netcore下的微服务、容器、运维、自动化发布

    原文:.netcore下的微服务.容器.运维.自动化发布 微服务 1.1     基本概念 1.1.1       什么是微服务? 微服务架构是SOA思想某一种具体实现.是一种将单应用程序作为一套小型 ...

  10. QQ浏览器、搜狗浏览器等兼容模式下,Asp.NetCore下,Cookie、Session失效问题

    原文:QQ浏览器.搜狗浏览器等兼容模式下,Asp.NetCore下,Cookie.Session失效问题 这些狗日的浏览器在兼容模式下,保存Cookie会失败,是因为SameSiteMode默认为La ...

随机推荐

  1. BST-Treap名次树数组&指针实现板子 Ver1.0

    这里只有板子没有原理QWQ 可实现 1.插入 x 数 2.删除 x 数(若有多个相同的数,只删除一个) 3.查询 x 数的排名(排名定义为比当前数小的数的个数 +1) 4.查询排名为 x 的数 5.求 ...

  2. C#使用RegNotifyChangeKeyValue监听注册表更改的几种方式

    养成一个好习惯,调用 Windows API 之前一定要先看文档 RegNotifyChangeKeyValue 函数 (winreg.h) - Win32 apps | Microsoft Lear ...

  3. FM20S用户手册-Linux开发环境搭建

  4. 【全球首发】双核Cortex-A7@1.2GHz,仅99元起?含税?哇!!

  5. 【ClickHouse】0:clickhouse学习3之时间日期函数

    官方文档: https://clickhouse.tech/docs/zh/sql-reference/functions/date-time-functions/ 常用的clickhouse时间函数 ...

  6. Webpack5

    Webpack是一款模块打包工具,可以把多个文件打包成一个或几个文件,它不仅能打包JS文件, 还能打包css, image等静态资源.当然,在默认情况下,它只打包JS文件和JSON文件,因为它只认识J ...

  7. Nginx性能调优5招35式不可不知的策略实战

    Nginx是一个高性能的HTTP和反向代理服务器,它在全球范围内被广泛使用,因其高性能.稳定性.丰富的功能以及低资源消耗而受到青睐.今天V哥从5个方面来介绍 Nginx 性能调优的具体策略,希望对兄弟 ...

  8. 7.条件渲染if

    v-if v-if 指令用于条件性地渲染一块内容.这块内容只会在指令的表达式返回 truthy 值的时候被渲染. <h1 v-if="awesome">Vue is a ...

  9. 动手学深度学习——CNN应用demo

    CNN应用demo CNN实现简单的手写数字识别 import torch import torch.nn.functional as F from torchvision import datase ...

  10. python爬取网站图片保存到本地文件夹

    爬取的网站 https://wallpaperscraft.com/catalog/anime 爬取代码 # 导包 import os import requests import parsel fr ...