zoukankan      html  css  js  c++  java
  • .Net快速上手Nlog日志组件


    一、NLog 简介

    NLog是适用于各种.NET平台的灵活,免费的日志记录平台。NLog使写入多个目标变得容易 。(数据库,文件,控制台)并即时更改日志记录配置。(本文主要介绍写日志到文件中)

    注:以下操作为 asp.net core web项目,编辑器为VS2019

    二、NLog 安装

    2.1 使用程序包管理控制台(Package Manager)

    PM> Install-Package NLog
    

    2.2 .Net CLI

    dotnet add package NLog
    

    在项目的根目录下,在cmd窗口中输入上面的命令即可安装。
    在这里插入图片描述
    在这里插入图片描述

    三. NLog 配置

    3.1 Nlog配置方式

    • 通过配置文件;
    • 通过程序代码;

    3.2 通过配置文件配置Nlog

    • 在项目的根目录创建Nlog.config文件,并设置文件属性:
      在这里插入图片描述
    • 具体配置

    下面的配置,就是一个简单的配置Nlog.config的demo,将下面的配置复制到Nlog.config中,即可将日志写入到PsTest.log文件中。

    <?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">
    
      <targets>
        <target name="file" xsi:type="File" 
            fileName="${basedir}PsTest.log"
            layout="${longdate} | ${level:uppercase=true}: ${message} | ${stacktrace}" 
            maxArchiveFiles="3"
            archiveAboveSize="10240" 
            encoding="utf-8"/>
      </targets>
    
      <rules>
        <logger name="*" minlevel="Debug" writeTo="file"></logger>
      </rules>
    </nlog>
    
    

    下面简单介绍下各配置项的意思:
    targets 节点中定义了一系列日志输出目标,每一个输出目标是一个 target 元素。
    target标签:

    • fileName 属性:指日志写入的文件的路径及文件名。${basedir}指应用的当前路径。
    • layout 属性:设置每条日志的输出内容及格式。${longdate} 指写入日志的时间,${level}指日志等级, ${stacktrace}指堆栈信息。
    • archiveAboveSize 属性:设置日志文件的大小的最大值,单位为byte,如果下条日志写入的话要超出这个值,就会新建个日志文件,继续写入。
    • maxArchiveFiles 属性:指该target的日志文件最多允许产生的个数,通常与archiveAboveSize 属性配合使用。

    rules 节点是日志路由规则的集合,由一个或多个 logger 元素组成。每个 logger 元素记录了 logger 的名字、目标输出以及要处理的日志等级。
    logger标签:

    • name 属性:设置命名空间和类,如果为*,代表针对所有程序集。
    • minlevel 属性:指只有当日志等级大于"Debug"时,才会写入。
    • writeTo 属性:指输出目标,与target的name对应。

    四、程序代码中写日志

    public static void Main(string[] args)
    {
        var i = 100;
        while (i > 1)
        { 
            NlogTest();
            i--;
        }
    }
    public static void NlogTest()
    {
    	//通过NLog.LogManager.GetCurrentClassLogger方法可以创建一个与所在类同名(包括 namespace)的 NLog.Logger 的实例。
        var logger = LogManager.GetCurrentClassLogger();
        logger.Error("something Error!");
        logger.Info("something Info!");
        logger.Debug("something Debug!");
        try
        {
            List<int> ls = null;
            var c = ls.Count;
        }
        catch (Exception ex)
        {
            logger.Error(ex.Message);
        }
    }
    

    来到应用的生成目录下面即可看到PsTest.log日志文件。
    在这里插入图片描述
    可以看到生成了多个log文件,因为配置文件设置的log文件最大为10k。
    打开PsTest.0.log文件:
    在这里插入图片描述
    日志已经按照配置的格式写入到文件中!


    但这样写有个问题,就是每次写日志都要先创建一个NLog.Logger 的实例,这样的话,如果程序集较多,就造成了代码冗余,所以,还是封装一个Nlog的帮助类比较好,每次都调用这个类去写日志

    • 封装的nlog帮助类:
    	public class PsLog
        {
            public static void Error(Exception ex)
            {
                Exception iex = GetInnerException(ex);
                Error(iex.ToString());
            }
    
            public static void Error(string msg)
            {
                WriteLog(msg, LogLevel.Error);
            }
    
            private static void WriteLog(string msg, LogLevel level)
            {
                try
                {
                    if (LogLevel.Debug == level)
                    {
                        LogManager.GetCurrentClassLogger().Debug(msg);
                    }
                    else if (LogLevel.Error == level)
                    {
                        LogManager.GetCurrentClassLogger().Error(msg);
                    }
                    else if (LogLevel.Fatal == level)
                    {
                        LogManager.GetCurrentClassLogger().Fatal(msg);
                    }
                    else if (LogLevel.Info == level)
                    {
                        LogManager.GetCurrentClassLogger().Info(msg);
                    }
                    else if (LogLevel.Trace == level)
                    {
                        LogManager.GetCurrentClassLogger().Trace(msg);
                    }
                    else if (LogLevel.Warn == level)
                    {
                        LogManager.GetCurrentClassLogger().Warn(msg);
                    }
                    else
                    {
                        LogManager.GetCurrentClassLogger().Info(msg);
                    }
                }
                catch (System.Exception e)
                {
                    try
                    {
                        string strPath = Directory.GetCurrentDirectory();
                        using (FileStream fs = File.Open(strPath + @"fatal.txt", FileMode.OpenOrCreate))
                        using (StreamWriter sw = new StreamWriter(fs))
                            sw.WriteLine(DateTime.Now.ToString() + ": Can not write the nlog, " + e.Message);
                    }
                    catch(Exception ex)
                    {
                        Console.WriteLine(ex.ToString());
                    }
                }
            }
    
            public static void Info(string msg)
            {
                WriteLog(msg, LogLevel.Info);
            }
    
            private static Exception GetInnerException(Exception ex)
            {
                if (ex.InnerException == null)
                {
                    return ex;
                }
                return GetInnerException(ex.InnerException);
            }
        }
    
    • 调用帮助类:
       public static void NlogTest()
       {
           PsLog.Error("something Error!");
           PsLog.Info("something Info!");
           PsLog.Debug("something Debug!");
           try
           {
               List<int> ls = null;
               var c = ls.Count;
           }
           catch (Exception ex)
           {
               PsLog.Error(ex);
           }
       }
    
    

    五、参考


  • 相关阅读:
    ogre terrain
    error list
    Basic Turtorial 3( Ogre wiki)
    操作 Wave 文件(3): 接触 mmio 系列函数
    操作 Wave 文件(5): 获取 Wave 文件的格式信息
    操作 Wave 文件(6): 获取 Wave 文件的波形数据
    关于动态数组指针操作的两个例子
    操作 Wave 文件(7): 建立一个空的 Wave 文件(三种方法)
    操作 Wave 文件(8): 使用 TMediaPlayer 录制 wav 文件
    操作 Wave 文件(10): 输入输出设备与格式支持
  • 原文地址:https://www.cnblogs.com/willingtolove/p/12129828.html
Copyright © 2011-2022 走看看