一、说明

  1. NLog介绍和使用说明官网:http://nlog-project.org/
  2. NLog和Log4net对比:https://www.cnblogs.com/qinjin/p/5134982.html

二、NLog集成步骤

  1. 下载模板项目,下载地址:https://aspnetboilerplate.com/Templates 选择.Net Core项目
  2. 新建一个.NET Standard类库项目Abp.Castle.NLog
  3. 添加NuGet包Castle.Core, Castle.LoggingFacility, NLog
  4. 参考abp log4net(ABP源码)添加class NLogLogger继承MarshalByRefObject并实现接口Castle.Core.Logging.ILogger
      1 using System;
      2 using System.Globalization;
      3 using ILogger = Castle.Core.Logging.ILogger;
      4 using NLogCore = NLog;
      5
      6 namespace Abp.Castle.Logging.NLog
      7 {
      8     [Serializable]
      9     public class NLogLogger :
     10         MarshalByRefObject,
     11         ILogger
     12     {
     13         protected internal NLogCore.ILogger Logger { get; set; }
     14         //protected internal NLogLoggerFactory Factory { get; set; }
     15
     16         public NLogLogger(NLogCore.ILogger logger)
     17         {
     18             Logger = logger;
     19         }
     20
     21         internal NLogLogger()
     22         {
     23         }
     24
     25         public bool IsDebugEnabled => Logger.IsEnabled(NLogCore.LogLevel.Debug);
     26
     27         public bool IsErrorEnabled => Logger.IsEnabled(NLogCore.LogLevel.Error);
     28
     29         public bool IsFatalEnabled => Logger.IsEnabled(NLogCore.LogLevel.Fatal);
     30
     31         public bool IsInfoEnabled => Logger.IsEnabled(NLogCore.LogLevel.Info);
     32
     33         public bool IsWarnEnabled => Logger.IsEnabled(NLogCore.LogLevel.Warn);
     34
     35         public ILogger CreateChildLogger(string loggerName)
     36         {
     37             return new NLogLogger(NLogCore.LogManager.GetLogger(Logger.Name + "." + loggerName));
     38         }
     39
     40         public void Debug(string message)
     41         {
     42             Logger.Debug(message);
     43         }
     44
     45         public void Debug(Func<string> messageFactory)
     46         {
     47             Logger.Debug(messageFactory);
     48         }
     49
     50         public void Debug(string message, Exception exception)
     51         {
     52             Logger.Debug(exception, message);
     53         }
     54
     55         public void DebugFormat(string format, params object[] args)
     56         {
     57             Logger.Debug(CultureInfo.InvariantCulture, format, args);
     58         }
     59
     60         public void DebugFormat(Exception exception, string format, params object[] args)
     61         {
     62             Logger.Debug(exception, CultureInfo.InvariantCulture, format, args);
     63         }
     64
     65         public void DebugFormat(IFormatProvider formatProvider, string format, params object[] args)
     66         {
     67             Logger.Debug(formatProvider, format, args);
     68         }
     69
     70         public void DebugFormat(Exception exception, IFormatProvider formatProvider, string format, params object[] args)
     71         {
     72             Logger.Debug(exception, formatProvider, format, args);
     73         }
     74
     75         public void Error(string message)
     76         {
     77             Logger.Error(message);
     78         }
     79
     80         public void Error(Func<string> messageFactory)
     81         {
     82             Logger.Error(messageFactory);
     83         }
     84
     85         public void Error(string message, Exception exception)
     86         {
     87             Logger.Error(exception, message);
     88         }
     89
     90         public void ErrorFormat(string format, params object[] args)
     91         {
     92             Logger.Error(CultureInfo.InvariantCulture, format, args);
     93         }
     94
     95         public void ErrorFormat(Exception exception, string format, params object[] args)
     96         {
     97             Logger.Error(exception, CultureInfo.InvariantCulture, format, args);
     98         }
     99
    100         public void ErrorFormat(IFormatProvider formatProvider, string format, params object[] args)
    101         {
    102             Logger.Error(formatProvider, format, args);
    103         }
    104
    105         public void ErrorFormat(Exception exception, IFormatProvider formatProvider, string format, params object[] args)
    106         {
    107             Logger.Error(exception, formatProvider, format, args);
    108         }
    109
    110         public void Fatal(string message)
    111         {
    112             Logger.Fatal(message);
    113         }
    114
    115         public void Fatal(Func<string> messageFactory)
    116         {
    117             Logger.Fatal(messageFactory);
    118         }
    119
    120         public void Fatal(string message, Exception exception)
    121         {
    122             Logger.Fatal(exception, message);
    123         }
    124
    125         public void FatalFormat(string format, params object[] args)
    126         {
    127             Logger.Fatal(CultureInfo.InvariantCulture, format, args);
    128         }
    129
    130         public void FatalFormat(Exception exception, string format, params object[] args)
    131         {
    132             Logger.Fatal(exception, CultureInfo.InvariantCulture, format, args);
    133         }
    134
    135         public void FatalFormat(IFormatProvider formatProvider, string format, params object[] args)
    136         {
    137             Logger.Fatal(formatProvider, format, args);
    138         }
    139
    140         public void FatalFormat(Exception exception, IFormatProvider formatProvider, string format, params object[] args)
    141         {
    142             Logger.Fatal(exception, formatProvider, format, args);
    143         }
    144
    145         public void Info(string message)
    146         {
    147             Logger.Info(message);
    148         }
    149
    150         public void Info(Func<string> messageFactory)
    151         {
    152             Logger.Info(messageFactory);
    153         }
    154
    155         public void Info(string message, Exception exception)
    156         {
    157             Logger.Info(exception, message);
    158         }
    159
    160         public void InfoFormat(string format, params object[] args)
    161         {
    162             Logger.Info(CultureInfo.InvariantCulture, format, args);
    163         }
    164
    165         public void InfoFormat(Exception exception, string format, params object[] args)
    166         {
    167             Logger.Info(exception, CultureInfo.InvariantCulture, format, args);
    168         }
    169
    170         public void InfoFormat(IFormatProvider formatProvider, string format, params object[] args)
    171         {
    172             Logger.Info(formatProvider, format, args);
    173         }
    174
    175         public void InfoFormat(Exception exception, IFormatProvider formatProvider, string format, params object[] args)
    176         {
    177             Logger.Info(exception, formatProvider, format, args);
    178         }
    179
    180         public void Warn(string message)
    181         {
    182             Logger.Warn(message);
    183         }
    184
    185         public void Warn(Func<string> messageFactory)
    186         {
    187             Logger.Warn(messageFactory);
    188         }
    189
    190         public void Warn(string message, Exception exception)
    191         {
    192             Logger.Warn(exception, message);
    193         }
    194
    195         public void WarnFormat(string format, params object[] args)
    196         {
    197             Logger.Warn(CultureInfo.InvariantCulture, format, args);
    198         }
    199
    200         public void WarnFormat(Exception exception, string format, params object[] args)
    201         {
    202             Logger.Warn(exception, CultureInfo.InvariantCulture, format, args);
    203         }
    204
    205         public void WarnFormat(IFormatProvider formatProvider, string format, params object[] args)
    206         {
    207             Logger.Warn(formatProvider, format, args);
    208         }
    209
    210         public void WarnFormat(Exception exception, IFormatProvider formatProvider, string format, params object[] args)
    211         {
    212             Logger.Warn(exception, formatProvider, format, args);
    213         }
    214     }
    215 }

  5. 添加工厂类NLogLoggerFactory并实现抽象类Castle.Core.Logging.AbstractLoggerFactory
     1 using Castle.Core.Logging;
     2 using System;
     3 using System.IO;
     4 using NLogCore = NLog;
     5
     6 namespace Abp.Castle.Logging.NLog
     7 {
     8
     9     public class NLogLoggerFactory : AbstractLoggerFactory
    10     {
    11         internal const string DefaultConfigFileName = "nlog.config";
    12         //private readonly ILoggerRepository _loggerRepository;
    13
    14         public NLogLoggerFactory()
    15        : this(DefaultConfigFileName)
    16         {
    17
    18         }
    19
    20         public NLogLoggerFactory(string configFileName)
    21         {
    22             if (!File.Exists(configFileName))
    23             {
    24                 throw new FileNotFoundException(configFileName);
    25             }
    26             NLogCore.LogManager.Configuration = new NLogCore.Config.XmlLoggingConfiguration(configFileName);
    27         }
    28
    29         public override ILogger Create(string name)
    30         {
    31             if (name == null)
    32             {
    33                 throw new ArgumentNullException(nameof(name));
    34             }
    35             return new NLogLogger(NLogCore.LogManager.GetLogger(name));
    36         }
    37
    38         public override ILogger Create(string name, LoggerLevel level)
    39         {
    40             throw new NotSupportedException("Logger levels cannot be set at runtime. Please review your configuration file.");
    41         }
    42     }
    43 }

  6. 添加LoggingFacility的扩展方法UseAbpNLog
     1 using Castle.Facilities.Logging;
     2
     3 namespace Abp.Castle.Logging.NLog
     4 {
     5     public static class LoggingFacilityExtensions
     6     {
     7         public static LoggingFacility UseAbpNLog(this LoggingFacility loggingFacility)
     8         {
     9             return loggingFacility.LogUsing<NLogLoggerFactory>();
    10         }
    11     }
    12 }

  7. 移除Abp.Castle.Log4Net包,添加Abp.Castle.NLog到Host项目
  8. 添加配置文件nlog.config
     1 <?xml version="1.0" encoding="utf-8" ?>
     2 <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
     3       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     4       autoReload="true"
     5       internalLogLevel="Warn"
     6       internalLogFile="App_Data\Logs\nlogs.txt">
     7
     8   <variable name="logDirectory" value="${basedir}\log\"/>
     9
    10   <!--define various log targets-->
    11   <targets>
    12
    13     <!--write logs to file-->
    14     <target xsi:type="File" name="allfile" fileName="${logDirectory}\nlog-all-${shortdate}.log"
    15                  layout="${longdate}|${logger}|${uppercase:${level}}|${message} ${exception}" />
    16
    17     <target xsi:type="File" name="ownFile-web" fileName="nlog-my-${shortdate}.log"
    18                  layout="${longdate}|${logger}|${uppercase:${level}}|${message} ${exception}" />
    19
    20     <target xsi:type="Null" name="blackhole" />
    21
    22   </targets>
    23
    24   <rules>
    25     <!--All logs, including from Microsoft-->
    26     <logger name="*" minlevel="Trace" writeTo="allfile" />
    27
    28     <!--Skip Microsoft logs and so log only own logs-->
    29     <logger name="Microsoft.*" minlevel="Trace" writeTo="blackhole" final="true" />
    30     <logger name="*" minlevel="Trace" writeTo="ownFile-web" />
    31   </rules>
    32 </nlog>

  9. 修改Startup, 将原来的日志组件log4net替换为nlog

    注释using Abp.Castle.Logging.Log4Net; 添加using Abp.Castle.Logging.NLog;

    1 //using Abp.Castle.Logging.Log4Net;
    2 using Abp.Castle.Logging.NLog;

    修改ConfigureServices方法

     1  // Configure Abp and Dependency Injection
     2  return services.AddAbp<AbpBasicWebHostModule>(
     3      // Configure Log4Net logging
     4      //options => options.IocManager.IocContainer.AddFacility<LoggingFacility>(
     5      //    f => f.UseAbpLog4Net().WithConfig("log4net.config")
     6      //)
     7
     8      // Configure Nlog Logging
     9       options => options.IocManager.IocContainer.AddFacility<LoggingFacility>(
    10       f => f.UseAbpNLog().WithConfig("nlog.config")
    11       )
    12   );

  10. 测试
     1 public IActionResult Index()
     2 {
     3       //nlog test
     4        Logger.Info("信息日志");
     5        Logger.Debug("调试日志");
     6        Logger.Error("错误日志");
     7        Logger.Fatal("异常日志");
     8        Logger.Warn("警告日志");
     9        return Redirect("/swagger");
    10 }

    测试结果

转载于:https://www.cnblogs.com/donaldtdz/p/8213440.html

ABP .Net Core 日志组件集成使用NLog相关推荐

  1. . NET6 Core 日志组件Log4net和Nlog

    Log4net 本项目用的Core (控制器-视图-模型) 引包 log4net 新建 log4net.config 文件中如下代码 <?xml version="1.0" ...

  2. .Net Core 日志组件log4net的Log4NetHelper类

    之前介绍了log4net的在.net core下的使用方法,但是每次调用起来都比较麻烦 private ITestService _TestService;private IUserInfo _Use ...

  3. Entity Framework Core系列教程-25-Entity Framework Core日志

    Entity Framework Core日志 我们经常需要在EF Core中记录SQL并更改跟踪信息以进行调试. EF Core日志记录自动与.NET Core的日志记录机制集成.因此,在隐含使用E ...

  4. ASP.NET Core 2.0 配置NLog日志组件

    2019独角兽企业重金招聘Python工程师标准>>> 1).添加nlog.config配置文件 <?xml version="1.0" encoding= ...

  5. SpringBoot笔记:SpringBoot2.3集成Logback日志组件配置

    文章目录 Logback简介 简介 日志级别 日志分类 Logback使用 添加依赖 配置Logback Logback参数解释 1.根节点configuration包含属性 2.根节点configu ...

  6. .Net Core中的日志组件(Logging)

    1.介绍 Logging组件是微软实现的日志记录组件包括控制台(Console).调试(Debug).事件日志(EventLog)和TraceSource,但是没有实现最常用用的文件记录日志功能(可以 ...

  7. KSO-netcore 中使用日志组件Nlog

    简介 在所有的应用程序中,日志功能是不可或缺的模块,我们可以根据日志信息进行调试.查看产生的错误信息,在ASP.NET Core中我们可以使用log4net或者NLog日志组件来实现记录日志的功能,这 ...

  8. nlog轻量级日志组件

    一.NLog简要介绍: 1.NLog是一个简单灵活的.NET日志记录类库.通过使用NLog,我们可以在任何一种.NET语言中输出带有上下文的(contextual information)调试诊断信息 ...

  9. .NET Core开发实战(第15课:选项框架:服务组件集成配置的最佳实践)--学习笔记...

    15 | 选项框架:服务组件集成配置的最佳实践 这一节讲解如何使用选项框架来处理服务和配置的关系 选项框架的特性: 1.支持单例模式读取配置 2.支持快照 3.支持配置变更通知 4.支持运行时动态修改 ...

  10. 我心中的核心组件(可插拔的AOP)~第十五回 我的日志组件Logger.Core(策略,模版方法,工厂,单例等模式的使用)...

    回到目录 之前的讲过两篇关于日志组件的文章,分别是<第一回  日志记录组件之自主的Vlog>和<第三回  日志记录组件之log4net>,而今天主要说一下我自己开发的另一种日志 ...

最新文章

  1. 制造业采购审批流程设计示例
  2. ip代理服务器软件25探索云速捷_IP代理在实际使用过程中会面临的问题,如何准确挑选和使用代理IP...
  3. 【JavaSE02】Java基本语法-概念
  4. js小笔记 -- let const的理解
  5. java中,剩下的这两个内部类不太好理解!
  6. linux 分卷解压
  7. Java 算法 学做菜
  8. HDU 6165 FFF at Valentine
  9. BZOJ2440 [中山市选2011]完全平方数
  10. Unity点击播放卡死问题的解决
  11. Spring 框架学习 —— 容器
  12. c语言如何做一个打卡的程序,C语言实现学生打卡系统
  13. assert:python断言报错语句
  14. OpenWrt之DNS 测试工具(nslookup、dig)
  15. 首位华人女数学家获拉马努金奖!北大数院校友,陶哲轩恽之玮曾得过此奖
  16. matlab脚本文件求梯度,转:用MATLAB求梯度的二个实例
  17. MySQL保存特殊字符及表情符
  18. 用户运营中,怎么做好用户增长?
  19. totolink路由器虚拟服务器,不怕没信号 TOTOLINK-N350R路由器任你用
  20. 使用NSIS制作安装文件

热门文章

  1. java 邮件批量发送邮件_利用Java实现电子邮件的批量发送[转载]
  2. 智能语音交互社交APP-导声
  3. iOS开发中使用代码控制横竖屏的切换
  4. 记一次阿里云配置二级域名经历,及申请免费非工作用途SSL证书
  5. 如何用开源软件办一场技术大会?
  6. hanlp 如何快速从分词仅取出人名
  7. (C++)输入两个正整数m和n,求其最大公约数和最小公倍数(辗转相除法)
  8. Linux 创建用户角色并添加ssh登录权限
  9. 做站源码下载地址及各类资源站点
  10. 挠场的科学丨五、二十一世纪的挠力文明