zoukankan      html  css  js  c++  java
  • Nlog日志组件简介

    NLog简介

      NLog是一个简单灵活的.NET日志记录类库,NLog的API非常类似于log4net,配置方式非常简单。支持多种形式输出日志:文本文件、系统日志、数据库、控制台、邮箱等

    1.NLog简介

    在nuget控制台输入安装nlog命令: Install-Package NLog.Config
    Nlog配置的方式常用的有两种
      1.直接在使用应用程序配置文件或者web的配置文件(app.config / web.config)
      2.NLog.config 这个是比较好的一个形式(推荐)
    配置文件中的主要标签是:targets和rules
      <targets /> - 定义日志的目标/输出,下级是<target>
      <rules /> - 定义日志的路由规则,下级是<logger>

    2.标签介绍

    <nlog>标签

      autoReload            修改配置文件后是否允许自动加载无须重启程序
      throwExceptions     内部日志系统抛出异常(建议throwExceptions的值设为“false”,这样由于日志引发的问题不至于导致应用程序的崩溃。)
      internalLogLevel    可选Trace|Debug|Info|Warn|Error|Fatal决定内部日志的级别 Off 关闭
      internalLogFile       把内部的调试和异常信息都写入指定文件里

    <targets>标签

    <target />定义了日志的输出,可以设置文件名称和格式,输出方式。
      name                      自定义该target的名字,可供rule规则里使用
      type                        定义类型,官方提供了很多可选类型,常用的还是 File Database Colored Console Mail
      layouts                   用来规定布局样式,语法“${属性}”,可以把上下文信息插入到日志中,官方提供的可以用的属性见文末附录

    <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>
    View Code

    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);
            }
        }
    View Code

    记录效果如下:

    控制台中使用彩色高亮展示日志信息

    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[] { "
    " }, 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(',')[0].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]?dd?).){3}(2[0-4]d|25[0-5]|[01]?dd?)$");
            }
        }
    View Code

    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>
    View Code

    参考文献:

    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

    4.https://blog.csdn.net/u013667895/article/details/79016059

    5.https://blog.csdn.net/ao123056/article/details/81011888

  • 相关阅读:
    git 使用 VisualStudio 比较分支更改
    Java实现 LeetCode 264 丑数 II(二)
    PHP error_log() 函数
    PHP error_get_last() 函数
    PHP debug_print_backtrace() 函数
    PHP debug_backtrace() 函数
    PHP scandir() 函数
    复制相关参数学习笔记--master上的参数
    OI生涯回忆录 2018.11.12~2019.4.15
    C# 金额转中文大写
  • 原文地址:https://www.cnblogs.com/wyy1234/p/9561707.html
Copyright © 2011-2022 走看看