ABP .Net Core 日志组件集成使用NLog_weixin_30778805的博客-程序员宅基地

技术标签: runtime  

一、说明

  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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30778805/article/details/99297822

智能推荐

学习笔记-概率问题_ymyss4的博客-程序员宅基地

这几天在看面试题时遇到一些非常恶心的概率问题, 加之因为之前数学大多忘记的一干二净了,就更是头疼。所以把一些基本概念和常见的解法做一些总结,但愿能让思路清晰一些。基本概念贝叶斯定理 Pr{A | B} = Pr{A}Pr{B|A} / Pr{B} 伯努利试验:每次试验相互独立,每次试验可能有两种结果 :成功(概率为p)、失败(概率为q)问题1, 试验取得一次成功

R.XXX和Resource的区别_andy76123的博客-程序员宅基地

R.XXX:是对资源表中对应资源位置的引用Resource:可以通过getResources()获取Resource实例,并通过getResources().getText(R.string.XXX)等方法获取相应的资源对象;逐帧动画资源要通过AnimationResources获取例如:AnimationDrawable rocket=(AnimationDrawable)get...

html5 按钮css样式修改,如何使用HTML5+css3制作出12种常用的按钮开关样式_weixin_26849971的博客-程序员宅基地

使用HTML5+css3制作按钮开关的原理根据设计的要求填充各种颜色。按钮开关的形状需要具体问题具体分析,如圆形按钮开关需要用到border-radius语句,方形可以直接使用div设置等。鼠标悬停的时候光标样式的转换也是注重设计感的体现,这里我们着重介绍一下cursor的用法:cursor属性规定要显示的光标的类型,该属性定义了鼠标指针放在一个元素边界范围内时所用的光标形状,根据W3C标准,现在...

mybatis映射文件使用Map_学吧太深了的博客-程序员宅基地_mybatis映射到map

映射文件对应的接口中,map 参数添加 @Param(“map”) 注解;void addZdConfig(@Param("map") Map&lt;String, String&gt; rowMap, @Param("zdName") String zdName);映射文件中使用 map :&lt;insert id="addZdConfig" parameterType="java.util.Map"&gt; insert into ${zdName} &lt;forea.

Jetpack ---- WorkManager入门(三)_detachment_w的博客-程序员宅基地

翻译自android官网,可直接去官网观看Jetpack ---- WorkManager入门(三)四、先进概念一、自定义WorkManager配置和初始化按需初始化删除默认的初始化程序Implement Configuration.ProviderWorkManager 2.1.0之前的自定义初始化默认初始化自定义初始化(二)WorkManager中的线程总览Threading in WorkerThreading in CoroutineWorkerThreading in RxWorkerThrea

Java 类型转换 Object和String互转_dream_heheda的博客-程序员宅基地

参考http://blog.csdn.net/u012050416/article/details/51898063 1.java.lang.Object.toString() 使用范围:任何继承Object的类都具有这个方法 返回:该对象的字符串表示 但是,使用toString()的对象不能为null,否则会抛出异常java.lang.NullPointerException Intege

随便推点

Android ViewBinding使用及原理_feng海涛的博客-程序员宅基地_viewbinding原理

Android ViewBinding使用及原理一、定义ViewBinding主要是Google用来findViewById的,作用跟Butterknife差不多。只不过Butterknife是通过扫描注解生成相应代码,而ViewBinding是通过扫描layout布局文件生成相应代码。而且ViewBinding是Google开发,深度集成在idea上。二、使用在模块build.gradle文件中添加配置:android { ... viewBinding{ ena

springboot+bootstrap实现分页_二十六桥明月夜的博客-程序员宅基地_springboot+bootstrap分页

  首先我们先说一下分页。分页有物理分页和逻辑分页之分。物理分页是使用数据库本身提供的分页操作来完成数据查询,查询到的就是当前页的信息。例如

html左侧菜单展开与收起,CSS3 实现侧边栏展开收起动画_weixin_39627661的博客-程序员宅基地

@keyframes规则用于创建动画。@keyframes 中规定某项 CSS 样式,就能创建由当前样式逐渐改为新样式的动画效果@keyframes 中创建动画时,请把它捆绑到某个选择器,否则不会产生动画效果。通过规定至少以下两项 CSS3 动画属性,即可将动画绑定到选择器:规定动画的名称规定动画的时长animationanimation 属性是一个简写属性,用于设置动画属性:animation-...

不得不看的字符串函数细节(strlen、strcpy、strtok)_燕麦冲冲冲的博客-程序员宅基地

首先接受挑战输入结果应该是多少呢?int main(){ char* str1 = "abcdef"; char* str2 = "abc"; if ((strlen(str2) - strlen(str1)) &gt; 0) { printf("hehe\n"); } else { printf("haha\n"); } return 0;}答案是:hehe因为strlen函数的返回值类型是无符号整形,所以两个数相减得到的-3又因为类型转换变成了无符号整型,是一

服务器硬盘raid5扩容,超实用,物理服务器RAID扩容详解_weixin_39705931的博客-程序员宅基地

服务器RAID卡,也称阵列卡,用于将多块物理硬盘组建成逻辑的卷,RAID卡是一个硬件,上面通常会配置Cache和电池,用于提升RAID性能和保护在断电情况下避免未落盘的数据丢失。配置RAID卡,通常有二种方式,第一种是在服务器启动的时候进入RAID卡图形配置界面;第二种是通过服务器远程控制卡。对RAID的一些普通操作,使用图形和web,比如新建raid,删除raid,添加热备盘,清除foreign...

2019-nCOV——人口统计_古杜且偲的博客-程序员宅基地

import pandas as pdimport numpy as npfrom datetime import datetimetime_format = "%d%b%Y %H:%M"datetime.now().strftime(time_format)'02Apr2020 09:13'import osfor dirname, _, filenames in os.wa...

推荐文章

热门文章

相关标签