.NETCORE 下使用 NLog
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的更多相关文章
- .Net Core Web/Console 下使用Nlog
.Net Core Console 下使用Nlog 官方介绍: https://github.com/NLog/NLog.Web/wiki/Getting-started-with-ASP.NET-C ...
- .NetCore 下开发独立的(RPL)含有界面的组件包 (六)实现业务功能
.NetCore 下开发独立的(RPL)含有界面的组件包 (一)准备工作 .NetCore 下开发独立的(RPL)含有界面的组件包 (二)扩展中间件及服 务 .NetCore 下开发独立的(RPL)含 ...
- .NetCore 下开发独立的(RPL)含有界面的组件包 (五)授权过滤参数处理
.NetCore 下开发独立的(RPL)含有界面的组件包 (一)准备工作 .NetCore 下开发独立的(RPL)含有界面的组件包 (二)扩展中间件及服 务 .NetCore 下开发独立的(RPL)含 ...
- .NetCore 下开发独立的(RPL)含有界面的组件包 (四)授权过滤
.NetCore 下开发独立的(RPL)含有界面的组件包 (一)准备工作 .NetCore 下开发独立的(RPL)含有界面的组件包 (二)扩展中间件及服 务 .NetCore 下开发独立的(RPL)含 ...
- .NetCore 下开发独立的(RPL)含有界面的组件包 (三)构建界面
.NetCore 下开发独立的(RPL)含有界面的组件包 (一)准备工作 .NetCore 下开发独立的(RPL)含有界面的组件包 (二)扩展中间件及服 务 .NetCore 下开发独立的(RPL)含 ...
- .NetCore 下开发独立的(RPL)含有界面的组件包 (二)扩展中间件及服务
.NetCore 下开发独立的(RPL)含有界面的组件包 (一)准备工作 .NetCore 下开发独立的(RPL)含有界面的组件包 (二)扩展中间件及服 务 .NetCore 下开发独立的(RPL)含 ...
- .NetCore 下开发独立的(RPL)含有界面的组件包 (一)准备工作
.NetCore 下开发独立的(RPL)含有界面的组件包 (一)准备工作 .NetCore 下开发独立的(RPL)含有界面的组件包 (二)扩展中间件及服 务 .NetCore 下开发独立的(RPL)含 ...
- NetCore下模拟和使用Modbus工业通信协议
Tips: 1.目前NetCore下与Modbus通信的框架主要选择了 Modbus.Net https://github.com/parallelbgls/Modbus.Net 2.modbus是 ...
- .netcore下的微服务、容器、运维、自动化发布
原文:.netcore下的微服务.容器.运维.自动化发布 微服务 1.1 基本概念 1.1.1 什么是微服务? 微服务架构是SOA思想某一种具体实现.是一种将单应用程序作为一套小型 ...
- QQ浏览器、搜狗浏览器等兼容模式下,Asp.NetCore下,Cookie、Session失效问题
原文:QQ浏览器.搜狗浏览器等兼容模式下,Asp.NetCore下,Cookie.Session失效问题 这些狗日的浏览器在兼容模式下,保存Cookie会失败,是因为SameSiteMode默认为La ...
随机推荐
- 在Python中输出当前文件名和行号
在Python中输出当前文件名和行号 用 inspect 库 info = inspect.currentframe() print('DEBUG!! ',info.f_code.co_filenam ...
- IPTABLES管理
iptables 是 Linux 管理员用来设置 IPv4 数据包过滤条件和 NAT 的命令行工具.iptables 工具运行在用户态,主要是设置各种规则.而 netfilter 则运行在内核态,执行 ...
- android系统中log机制
android系统中log机制 背景 习惯了Linux开发的我,转到安卓以后,对于安卓开发的很多问题没有经验.看到同事解决问题都会看logcat,因此有必要了解一下这些东西. 介绍 Android提供 ...
- UEFI与inf文件
UEFI与inf文件 背景 学习高通UEFI中的LCD显示框架,看到有些博客对inf文件进行了介绍,因此整理了这方面的一些入门知识. 参考: https://blog.csdn.net/yunfeng ...
- 高通Android平台 电池 相关配置
背景 在新基线上移植有关的代码时,在log中发现有关的东西,请教了有关的同事以后,解决了这个问题. [ 12.775863] pmi632_charger: smblib_eval_chg_termi ...
- hynitron ts 驱动分析
# hynitron ts 驱动分析 背景 在公司项目中搞LCD移植的时候,在TP功能上,有时候频繁操作屏幕时会导致i2c总线返回-2错误. 问题描述: 1.安卓桌面起来以后,点击屏幕有响应. 2.此 ...
- python_8 拆包、内置函数和高阶函数
一.查缺补漏 1. \t 子表符,用于对其二.拆包 1. 拆包:顾名思义就是将可迭代的对象如元组,列表,字符串,集合,字典,拆分出相对应的元素 2. 形式:拆包一般分两种方式,一种是以变量的方式来接收 ...
- Linux Redis 服务设置开机自启动
@ 目录 前言 一.准备工作 二.操作步骤 2.1 修改redis.conf文件 2.2 创建启动脚本 2.3 设置redis 脚本权限 2.4 设置开机启动 2.5 验证 总结 前言 请各大网友尊重 ...
- 实时系统Preempt RT与Xenomai之争!谁更主流,谁更实时?
选择争论一直存在 大家知道EtherCAT是实时现场总线技术,当我们开发一款支持EtherCAT总线的控制器时,实时操作系统的选择不仅对于产品本身是最重要的一部分,而且对产品研发的整个过程也影响深远. ...
- 8行JS代码实现Vue穿梭框
实现效果 完整 demo 参考 <template> <div class="contain"> <ul class=""> ...