Nlog日志组件简介
NLog简介
1.NLog简介
2.标签介绍
<nlog>标签
<targets>标签
<rules>标签
<logger/>定义日志的记录规则,记录范围
name 记录者的名字
minlevel 最低级别
maxlevel 最高级别
level 单一日志级别
levels 一系列日志级别,由逗号分隔。
<variable>标签
变量定义
<!-- 定义变量var1-->
<variable name="var1" value="${basedir}/logs"/>
<targets>
<!-- 使用变量var1-->
<target name="File" xsi:type="File" fileName="${var1}/${shortdate}.txt"/>
</targets>
3.一个简单的栗子
把日志记录到彩色控制台,log文本文件和mysql数据库。首先添加Nlog.config文件如下,放在控制台项目的bin/debug目录下
<?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 name="console" xsi:type="ColoredConsole" useDefaultRowHighlightingRules="false" layout="${longdate}|${pad:padding=5:inner=${level:uppercase=true}}|${message}" >
<highlight-row condition="level == LogLevel.Debug" foregroundColor="DarkGray" />
<highlight-row condition="level == LogLevel.Info" foregroundColor="Gray" />
<highlight-row condition="level == LogLevel.Warn" foregroundColor="Yellow" />
<highlight-row condition="level == LogLevel.Error" foregroundColor="Red" />
<highlight-row condition="level == LogLevel.Fatal" foregroundColor="Red" backgroundColor="White" />
</target> <!--写入log文本文件-->
<target name="file" xsi:type="AsyncWrapper" queueLimit="5000" overflowAction="Discard">
<target xsi:type="File" fileName="${basedir}/logs/nlog/AT___${shortdate}.log" layout="----------------日志记录开始----------------${newline}【日志时间】:${longdate} ${newline}【日志级别】:${level:uppercase=true}${newline}【异常相关信息】${newline}${message}${newline}${newline}${newline}" />
</target> <!--写入mysql数据库-->
<target name="db" xsi:type="AsyncWrapper" queueLimit="5000" overflowAction="Discard">
<target type="Database" dbProvider="MySql.Data.MySqlClient" connectionString="server=10.0.10.66;port=3306;database=logedemo;uid=root;pwd=123321;SslMode=none">
<commandText>
INSERT INTO tbLog(Timestamp,Level,Message,StackTrace) VALUES(@time_stamp, @level, @message, @stacktrace);
</commandText>
<!--database connection parameters-->
<parameter name="@time_stamp" layout="${date}" />
<parameter name="@level" layout="${level:uppercase=true}" />
<parameter name="@message" layout="${message}" />
<parameter name="@stacktrace" layout="${stacktrace}" />
</target>
</target>
</targets>
<rules>
<logger name="*" minlevel="Debug" writeTo="console" />
<logger name="*" minlevel="Info" writeTo="db" />
<logger name="*" minlevel="Debug" writeTo="file" />
</rules>
</nlog>
LogHelper是通过拓展String实现的一个简单的helper,调用代码如下:
class Program
{
static void Main(string[] args)
{
Console.WriteLine("---------------------------begin");
"helper logs debug".Debug();
"helper logs info".Info();
"helper logs warn".Warn();
"helper logs error".Error();
"helper logs fatal".Fatal();
Console.WriteLine("---------------------------end");
Console.ReadKey();
}
}
public static class LogHelper
{
private static ILogger logger = GetLogger();
private static ILogger GetLogger()
{
LogManager.Configuration = new XmlLoggingConfiguration(Path.Combine(AppDomain.CurrentDomain.BaseDirectory + @"\Nlog.config"));
return LogManager.GetCurrentClassLogger();
} /// <summary>
/// 调试
/// </summary>
/// <param name="debug"></param>
public static void Debug(this string debug)
{
logger.Debug(debug);
}
/// <summary>
/// 信息
/// </summary>
/// <param name="info"></param>
public static void Info(this string info)
{
logger.Info(info);
} /// <summary>
/// 警告
/// </summary>
/// <param name="warn"></param>
public static void Warn(this string warn)
{
logger.Warn(warn);
} /// <summary>
/// 错误
/// </summary>
/// <param name="error"></param>
public static void Error(this string error)
{
logger.Error(error);
}
/// <summary>
/// 严重错误
/// </summary>
/// <param name="fatale"></param>
public static void Fatal(this string fatal)
{
logger.Fatal(fatal);
} /// <summary>
/// 跟踪
/// </summary>
/// <param name="trace"></param>
public static void Trace(this string trace)
{
logger.Trace(trace);
}
}
记录效果如下:
控制台中使用彩色高亮展示日志信息

mysql中效果如下

log文件效果如下

这里的异常信息只是简单的一句话,在实际开发中我们可以把很多内容添加到异常相关信息中,如下是一个.Net WebApi的异常日志的显示效果:

过滤器代码如下
/// <summary>
/// 异常处理过滤器
/// </summary>
public class ErrorHandleAttribute : ExceptionFilterAttribute
{
/// <summary>
/// 异常处理过滤器
/// </summary>
/// <param name="actionExecutedContext"></param> public override void OnException(HttpActionExecutedContext actionExecutedContext)
{
//获取客户端Ip
string clientIP = GetHostAddress();//主机Ip
//获取httpmethod
string strHttpMethod = actionExecutedContext.Request.Method.ToString();
//请求的url
string url = actionExecutedContext.Request.RequestUri.AbsoluteUri;
//异常信息
string exceptionMsg = actionExecutedContext.Exception.Message;
//异常定位
string exceptionPosition = actionExecutedContext.Exception.StackTrace.Split(new string[] { "\r\n" }, StringSplitOptions.None).Where(s => !string.IsNullOrWhiteSpace(s)).First().Trim();
//string stack
//记录的message
string message = $"----1.[客户端Ip]:{ clientIP} " + Environment.NewLine + $"----2.[请求方法]:{ strHttpMethod} " + Environment.NewLine + $"----3.[请求url]:{ url }" + Environment.NewLine + $"----4.[异常信息]:{exceptionMsg} " + Environment.NewLine + $"----5.[异常定位]:{exceptionPosition}";
//Log4net记录
LogHelper.WriteErrorLog("", message);
//nlog记录
NlogHelper.WriteErrorLog(message);
actionExecutedContext.Response = actionExecutedContext.Request.CreateResponse(
HttpStatusCode.InternalServerError,
new { msg = "服务器忙,请稍后再试!" });
} /// <summary>
/// 获取客户端IP地址(无视代理)
/// </summary>
/// <returns>若失败则返回回送地址</returns>
public static string GetHostAddress()
{
string userHostAddress = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
if (string.IsNullOrEmpty(userHostAddress))
{
if (System.Web.HttpContext.Current.Request.ServerVariables["HTTP_VIA"] != null)
userHostAddress = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"].ToString().Split(',')[].Trim();
if (string.IsNullOrEmpty(userHostAddress))
{
userHostAddress = HttpContext.Current.Request.UserHostAddress;
}
}
//最后判断获取是否成功,并检查IP地址的格式(检查其格式非常重要)
if (!string.IsNullOrEmpty(userHostAddress) && IsIP(userHostAddress))
{
return userHostAddress;
}
return "127.0.0.1";
} /// <summary>
/// 检查IP地址格式
/// </summary>
/// <param name="ip"></param>
/// <returns></returns>
public static bool IsIP(string ip)
{
return System.Text.RegularExpressions.Regex.IsMatch(ip, @"^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$");
}
}
4.layout参数列表
| ${appdomain} | 当前应用程序域 |
| ${assembly-version} | 应用程序 |
| ${basedir} | 应用程序域的基本目录。 |
| ${callsite} | (类名称、方法名称和相关信息的源信息)。 |
| ${counter} | 数值 |
| ${date} | 当前日期和时间。 |
| ${environment} | 环境变量 |
| ${exception} | exception信息 |
| ${guid} | GUID |
| ${identity} | 线程标识信息 |
| ${level} | 级别。 |
| ${log4jxmlevent} | XML事件描述 |
| ${logger} | 记录器的名字 |
| ${longdate} | 日期和时间的格式分类yyyy-MM-dd HH:mm:ss.ffff。 |
| ${machinename} | 名称 |
| ${message} | 消息 |
| ${newline} | 文字换行 |
| ${processid} | 当前进程标识符 |
| ${processinfo} | 运行信息 |
| ${processname} | 当前进程的名称。 |
| ${processtime} | 该时间过程中格式HH:MM:ss.mmm。 |
| ${shortdate} | 短时间 格式YYYY-MM-DD。 |
| ${threadid} | 当前线程的标识符。 |
| ${threadname} | 当前线程。 |
| ${ticks} | 当前日期和时间。 |
| ${time} | 24小时格式HH:MM:ss.mmm。 |
| ${var} | {$var}-提供新的变量(4.1) |
补充:下边是一个分级别记录的Nlog.Config,这个配置文件和上边的LogHelper可以一起使用。
<?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 name="Debug" xsi:type="file" fileName="F:/Logs/Debug/${shortdate}-Debug.log" layout="----------------日志记录开始----------------${newline}【日志时间】:${longdate} ${newline}【日志级别】:${level:uppercase=true}${newline}【相关信息】${newline}${message}${newline}${newline}${newline}" />
<target name="Warn" xsi:type="file" fileName="F:/Logs/Warn/${shortdate}-Warn.log" layout="----------------日志记录开始----------------${newline}【日志时间】:${longdate} ${newline}【日志级别】:${level:uppercase=true}${newline}【相关信息】${newline}${message}${newline}${newline}${newline}" />
<target name="Error" xsi:type="file" fileName="F:/Logs/Error/${shortdate}-Error.log" layout="----------------日志记录开始----------------${newline}【日志时间】:${longdate} ${newline}【日志级别】:${level:uppercase=true}${newline}【相关信息】${newline}${message}${newline}${newline}${newline}" />
<target name="Info" xsi:type="file" fileName="F:/Logs/Info/${shortdate}-Info.log" layout="----------------日志记录开始----------------${newline}【日志时间】:${longdate} ${newline}【日志级别】:${level:uppercase=true}${newline}【相关信息】${newline}${message}${newline}${newline}${newline}" />
<target name="Fatal" xsi:type="file" fileName="F:/Logs/Fatal/${shortdate}-Fatal.log" layout="----------------日志记录开始----------------${newline}【日志时间】:${longdate} ${newline}【日志级别】:${level:uppercase=true}${newline}【相关信息】${newline}${message}${newline}${newline}${newline}" />
<target name="Trace" xsi:type="file" fileName="F:/Logs/Trace/${shortdate}-Trace.log" layout="----------------日志记录开始----------------${newline}【日志时间】:${longdate} ${newline}【日志级别】:${level:uppercase=true}${newline}【相关信息】${newline}${message}${newline}${newline}${newline}" />
</targets>
<rules>
<logger name="*" levels="Info" writeTo="Info" />
<logger name="*" levels="Warn" writeTo="Warn" />
<logger name="*" levels="Trace" writeTo="Trace" />
<logger name="*" levels="Debug" writeTo="Debug" />
<logger name="*" levels="Error" writeTo="Error" />
<logger name="*" levels="Fatal" writeTo="Fatal" />
</rules>
</nlog>
参考文献:
1.https://www.cnblogs.com/HQFZ/p/5832613.html
2.https://blog.csdn.net/lglgsy456/article/details/36642155
3.https://www.cnblogs.com/fuchongjundream/p/3936431.html
Nlog日志组件简介的更多相关文章
- .Net快速上手Nlog日志组件
目录 一.NLog 简介 二.NLog 安装 三. NLog 配置 四.程序代码中写日志 五.参考 一.NLog 简介 NLog是适用于各种.NET平台的灵活,免费的日志记录平台.NLog使写入多个目 ...
- asp.net core 3 使用nlog日志组件,使用$ {basedir}保存位置不对,记录下怎么解决
$ {basedir}指向的是 AppDomain.CurrentDomain.BaseDirectory, Asp.Net.Core的解决方法可能如下(在Program.cs中添加两行): var ...
- .Netcore之日志组件Log4net、Nlog性能比较
转载请注明出处http://www.cnblogs.com/supernebula/p/7506993.html .Netcore之Log4net.Nlog性能比较 最近在写一个开源.netcore ...
- 【框架学习与探究之日志组件--Log4Net与NLog】
前言 本文欢迎转载,作者原创地址:http://www.cnblogs.com/DjlNet/p/7604340.html 序 近日,天气渐冷,懒惰的脑虫又开始作祟了,导致近日内功修炼迟迟未能进步,依 ...
- ABP .Net Core 日志组件集成使用NLog
一.说明 NLog介绍和使用说明官网:http://nlog-project.org/ NLog和Log4net对比:https://www.cnblogs.com/qinjin/p/5134982. ...
- net core体系-web应用程序-4net core2.0大白话带你入门-7asp.net core日志组件(Logger和Nlog)
asp.net core日志组件 日志介绍 Logging的使用 1. appsettings.json中Logging的介绍 Logging的配置信息是保存在appsettings.json配置 ...
- .Net core2.0日志组件Log4net、Nlog简单性能测试
.Net core之Log4net.Nlog简单性能测试 比较log4net.nlog的文件写入性能(.netcore环境),涉及代码和配置如有不正确的地方,还请批评指正. 原创,转载请著名出处:ht ...
- 玩转ASP.NET Core中的日志组件
简介 日志组件,作为程序员使用频率最高的组件,给程序员开发调试程序提供了必要的信息.ASP.NET Core中内置了一个通用日志接口ILogger,并实现了多种内置的日志提供器,例如 Console ...
- .NetCore中的日志(1)日志组件解析
.NetCore中的日志(1)日志组件解析 0x00 问题的产生 日志记录功能在开发中很常用,可以记录程序运行的细节,也可以记录用户的行为.在之前开发时我一般都是用自己写的小工具来记录日志,输出目标包 ...
随机推荐
- C - A Simple Problem with Integers POJ - 3468 线段树模版(区间查询区间修改)
参考qsc大佬的视频 太强惹 先膜一下 视频在b站 直接搜线段树即可 #include<cstdio> using namespace std; ; int n,a[maxn]; stru ...
- day5 模拟用户登录
_user= "yangtuo" _passwd = " # passd_authentication = False #flag 标志位 for i in range( ...
- 微信小程序原生开发简介
简介: 总结: 1. 逻辑层使用js引擎,视图层使用webview渲染 2. 微信小程序已经支持了绝大部分的 ES6 API 3. 可以自动补全css的兼容语法 文档:https://develope ...
- Centos 7.3 安装Grafana 6.0
grafana简介 Grafana是一个完全开源的度量分析与可视化平台,可对来自各种各种数据源的数据进行查询.分析.可视化处理以及配置告警. Grafana支持的数据源: 官方:Graphite,In ...
- 自学华为IoT物联网_11 物联网操作系统介绍
点击返回自学华为IoT物流网 自学华为IoT物联网_11 物联网操作系统介绍 1.1 物联网面临的困难 物联网终端发展面临的困难:开发者需要懂硬件和芯片的差异,自行适配硬件接口 物联网开发面临的困难 ...
- 【bfs】Knight Moves
[题目描述] 输入nn代表有个n×nn×n的棋盘,输入开始位置的坐标和结束位置的坐标,问一个骑士朝棋盘的八个方向走马字步,从开始坐标到结束坐标可以经过多少步. [输入] 首先输入一个nn,表示测试样例 ...
- [2017-7-28]Android Learning Day7
View动画效果 透明动画效果 旋转动画效果 移动动画效果 缩放动画效果 混合动画效果 1.透明动画效果(AlphaAnimation) 有两种方法 第一种在活动中设置,不需要xml文件 public ...
- 仓鼠找sugar(LCA)
小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而他的基友同时要从他的卧室(c)到图书馆( ...
- jsp model1
一.model1(纯jsp技术): 1.dao:data access object,数据访问对象,即专门对数据库进行操作的类,一般说dao不含业务逻辑. 2.当进行跳转时候,需要用servlet来实 ...
- 解决SecureCRT无法用非root账号登录ssh
原文: http://blog.csdn.net/zxx2403/article/details/46959047 链接失败,提示这个: --------------------------- Sec ...