• ASP.NET Core 2.0 使用NLog实现日志记录


    1、安装NuGet包

    运行:Install-Package NLog.Web.AspNetCore

    运行:Install-Package NLog

    在csproj中编辑:

    <PackageReference Include="NLog" Version="4.5.3" />
    <PackageReference Include="NLog.Web.AspNetCore" Version="4.5.3" />

    Github源码示例

    2、创建一个nlog.config文件。

    <?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"
          throwConfigExceptions="true"
          internalLogLevel="info"
          internalLogFile="D:	empinternal-nlog.txt">
      <!-- 要写的目标-->
      <targets>
        <!--将日志写入文件  -->
        <target xsi:type="File" name="allfile" fileName="D:	emp
    log-all-${shortdate}.log"
                layout="${longdate}|${event-properties:item=EventId_Id:whenEmpty=0}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}" />
    
        <!-- 启用asp.net核心布局渲染器 -->
        <target xsi:type="File" name="ownFile-web" fileName="D:	emp
    log-own-${shortdate}.log"
                layout="${longdate}|${event-properties:item=EventId_Id:whenEmpty=0}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}|${callsite}" />
      </targets>
    
      <!-- 从记录器名称映射到目标的规则 -->
      <rules>
        <!--所有的记录,包括从微软-->
        <logger name="*" minlevel="Trace" writeTo="allfile" />
    
        <!--跳过非关键微软日志,因此只记录自己的日志-->
        <logger name="Microsoft.*" maxlevel="Info" final="true" />
        <!-- BlackHole -->
        <logger name="*" minlevel="Trace" writeTo="ownFile-web" />
      </rules>
    </nlog>
    View Code

    布局渲染器是在布局中使用的模板宏,例如${message}${level}等等

    NLog支持创建自定义布局渲染器。有关更多信息,请参阅:扩展NLog

     

    NLog软件包 
    $ {activityid} - 将一个System.Diagnostics跟踪关联ID放入日志中。
    $ {all-event-properties} - 记录所有事件上下文数据。
    $ {appdomain} - 当前的应用程序域。
    $ {assembly-version} - 默认应用程序域中可执行文件的版本。
    $ {basedir} - 当前应用程序域的基本目录。
    $ {callsite} - 呼叫站点(类名称,方法名称和源信息)。
    $ {callsite-linenumber} - 呼叫站点源行号。
    $ {counter} - 一个计数器值(每个布局渲染都会增加)。
    $ {currentdir} - 应用程序的当前工作目录。
    $ {date} - 当前日期和时间。
    $ {document-uri} - 托管当前Silverlight应用程序的HTML页面的URI。
    $ {environment} - 环境变量。
    $ {event-properties} - 记录事件属性数据 - 重命名$ {event-context}。
    $ {exception} - 通过调用其中一个Logger * Exception()方法提供的异常信息。
    $ {file-contents} - 渲染指定文件的内容。
    $ {gc} - 关于垃圾收集器的信息。
    $ {gdc} - 全局诊断上下文项目。字典结构来保存每个应用程序实例值。
    $ {guid} - 全局唯一标识符(GUID)。
    $ {identity} - 线程标识信息(名称和认证信息)。
    $ {install-context} - 安装参数(传递给InstallNLogConfig)。
    $ {level} - 日志级别。
    $ {literal} - 一个字符串文字。
    $ {log4jxmlevent} - 与log4j,Chainsaw和NLogViewer兼容的XML事件描述。
    $ {logger} - 记录器名称。
    $ {longdate} - 日期和时间格式很长,可排序yyyy-MM-dd HH:mm:ss.ffff。
    $ {machinename} - 进程正在运行的机器名称。
    $ {mdc} - 映射的诊断上下文 - 一个线程局部结构。
    $ {mdlc} - 异步映射的诊断上下文 - 一个线程局部结构。
    $ {message} - 格式化的日志消息。
    $ {ndc} - 嵌套的诊断上下文 - 一个线程局部结构。
    $ {ndlc} - 异步嵌套诊断上下文 - 一个线程局部结构。
    $ {newline} - 换行符。
    $ {nlogdir} - NLog.dll所在的目录。
    $ {performancecounter} - 性能计数器。
    $ {processid} - 当前进程的标识符。
    $ {processinfo} - 关于正在运行的进程的信息。
    $ {processname} - 当前进程的名称。
    $ {processtime} - 格式为HH:mm:ss.mmm的处理时间。
    $ {qpc} - 高精度计时器,基于从QueryPerformanceCounter()返回的值(可选地转换为秒)。
    $ {registry} - 来自注册表的值。
    $ {sequenceid} - 日志序列标识
    $ {shortdate} - 可排序格式的短日期yyyy-MM-dd。
    $ {sl-appinfo} - 有关Silverlight应用程序的信息。
    $ {specialfolder} - 系统特殊文件夹路径(包括我的文档,我的音乐,程序文件,桌面等)。
    $ {stacktrace} - 堆栈跟踪渲染器。
    $ {tempdir} - 一个临时目录。
    $ {threadid} - 当前线程的标识符。
    $ {threadname} - 当前线程的名称。
    $ {ticks} - 当前日期和时间的Ticks值。
    $ {time} - 以24小时可排序格式HH:mm:ss.mmm的时间。
    $ {var} - 渲染变量(4.1中新增)
    $ {windows-identity} - 线程Windows身份信息(用户名)。
    包装
    $ {cached} - 将缓存应用于另一个布局输出。
    $ {filesystem-normalize} - 通过用安全字符替换文件名中不允许的字符。
    $ {json-encode} - 使用JSON规则转义另一个布局的输出。
    $ {lowercase} - 将另一个布局输出的结果转换为小写。
    $ {onexception} - 仅在为日志消息定义异常时才输出内部布局。
    $ {pad} - 将填充应用于另一个布局输出。
    $ {replace} - 用另一个字符串替换另一个布局输出中的字符串。
    $ {replace-newlines} - 用另一个字符串替换换行符。
    $ {rot13} - 用ROT-13解码“encrypted”文本。
    $ {trim-whitespace} - 修剪另一个布局渲染器的结果中的空白。
    $ {uppercase} - 将另一个布局输出的结果转换为大写。
    $ {url-encode} - 编码另一个布局输出的结果以用于URL。
    $ {when} - 只有在满足指定条件时才输出内部布局。
    $ {whenEmpty} - 当内部布局产生空结果时输出替代布局。
    $ {WrapLine} - 在指定的行长度处包装另一个布局输出的结果。
    $ {xml-encode} - 将另一个布局输出的结果转换为XML兼容。
    NLog.Extended软件包 
    $ {appsetting} - 应用程序配置设置。
    NLog.Web包 
    $ {aspnet-MVC-Action} - ASP.NET MVC动作名称
    $ {aspnet-MVC-Controller} - ASP.NET MVC控制器名称
    $ {aspnet-Application} - ASP.NET应用程序变量。
    $ {aspnet-Item} - ASP.NET HttpContext项目变量。
    $ {aspnet-TraceIdentifier} - ASP.NET跟踪标识符
    $ {aspnet-Request} - ASP.NET请求变量。
    $ {aspnet-Request-Cookie} - ASP.NET请求cookie内容。
    $ {aspnet-Request-Host} - ASP.NET请求主机。
    $ {aspnet-Request-Method} - ASP.NET请求方法(GET,POST等)。
    $ {aspnet-Request-IP} - 客户端IP。
    $ {aspnet-Request-QueryString} - ASP.NET请求查询字符串。
    $ {aspnet-Request-Referrer} - ASP.NET请求引用者。
    $ {aspnet-Request-UserAgent} - ASP.NET请求useragent。
    $ {aspnet-Request-Url} - ASP.NET请求URL。
    $ {aspnet-Session} - ASP.NET Session变量。
    $ {aspnet-SessionId} - ASP.NET会话ID变量。
    $ {aspnet-User-isAuthenticated} - ASP.NET用户身份验证?
    $ {aspnet-User-AuthType} - ASP.NET用户身份验证。
    $ {aspnet-User-Identity} - ASP.NET用户变量。
    $ {iis-site-name} - IIS站点名称。
    外包装
    外部软件包,不由NLog团队维护。
    
    $ {xml} - 转换为XML格式
    
    $ {gelf} - 将日志转换为GELF格式。
    View Code

    将自定义值传递给布局

    即使布局渲染器提供了许多预定义的值,但您可能需要将特定于应用程序的值传递给布局您可以通过向事件添加自定义属性来在代码中传递自己的值。然后使用$ {event-properties}渲染器检索值

    3、在csproj手动编辑文件并添加

      <ItemGroup>
        <Content Update="nlog.config" CopyToOutputDirectory="Always" />
      </ItemGroup>

    4、更新program.cs

            public static void Main(string[] args)
            {
                // NLog:首先设置记录器以捕获所有错误
                var logger = NLog.Web.NLogBuilder.ConfigureNLog("nlog.config").GetCurrentClassLogger();
                try
                {
                    logger.Debug("init main");
                    BuildWebHost(args).Run();
                }
                catch (Exception exception)
                {
                    // NLog:catch安装错误 
                    logger.Error(exception, "Stopped program because of exception");
                    throw;
                }
                finally
                {
                    //确保在退出应用程序之前刷新并停止内部定时器/线程(避免Linux上的分段错误)
                    NLog.LogManager.Shutdown();
                }
            }
    
            public static IWebHost BuildWebHost(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                    .UseStartup<Startup>()
                    .ConfigureLogging(logging =>
                    {
                        logging.ClearProviders();
                        logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace);
                    })
                    .UseNLog()   // NLog:setup NLog用于依赖注入 
                    .Build();
    View Code

    5、配置appsettings.json

    {
      "Logging": {
        "IncludeScopes": false,
        "LogLevel": {
          "Default": "Warning",
          "Microsoft": "Information"
        }
      }
    }
    View Code

    6、写日志

            private readonly ILogger _logger;
    
            public HomeController(ILogger<HomeController> logger)
            {
                _logger = logger;
                _logger.LogDebug(1, "NLog injected into HomeController");
            }
            public IActionResult Index()
            {
                _logger.LogInformation("Hello, this is the index!");        
                return View();
            }
    View Code

    7、输出示例

    
    
  • 相关阅读:
    Codeforces Round #518 Div. 1没翻车记
    BZOJ4310 跳蚤(后缀数组+二分答案)
    后缀数组备忘
    洛谷 P3573 [POI2014]RAJ-Rally 解题报告
    洛谷 P1503 鬼子进村 解题报告
    洛谷 P2375 [NOI2014]动物园 解题报告
    洛谷 P2797 Facer的魔法 解题报告
    【模板】三分法
    那些神奇的DP建模
    洛谷 P1136 迎接仪式 解题报告
  • 原文地址:https://www.cnblogs.com/lwc1st/p/8979942.html
Copyright © 2020-2023  润新知