NLog在asp.net core中的应用

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介:

Asp.net core中,自带的Log是在当selfhost运行时,在控制台中输出,不便于查阅,如果用一个log架框,把日志持久化,便于查询.

NLog是一个免费的日志记录框架,专门为.net平台下的框架提供日志功能,本文主要说明asp.net core下怎么使用NLog。

首先用Nuget安装NLog.Extensions.Logging和NLog.Web.AspNetCore两个类库。

修改project.json,在publishOptions中添加”nlog.config节点”

"publishOptions": {

  "include": [

    "wwwroot",

    "**/*.cshtml",

    "appsettings.json",

    "web.config",

    "nlog.config"

  ]

}

在StartUp.cs中添加

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public  void  ConfigureServices(IServiceCollection services)
       {
           // Add framework services.
           services.AddMvc();
  
           //为NLog.web注入HttpContextAccessor
           services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
……
}
public  void  Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
        {
            //添加NLog到.net core框架中
            loggerFactory.AddNLog();
            //添加NLog的中间件
            app.AddNLogWeb();
            //指定NLog的配置文件
            env.ConfigureNLog( "nlog.config" );
……
}


HomeController.cs中是自定义日志

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
static  Logger Logger = LogManager.GetCurrentClassLogger();
public  IActionResult Index()
{
     Logger.Info( "普通信息日志" );
     Logger.Debug( "调试日志" );
     Logger.Error( "错误日志" );
     Logger.Fatal( "异常日志" );
     Logger.Warn( "警告日志" );
     Logger.Trace( "跟踪日志" );
     Logger.Log(NLog.LogLevel.Warn,  "Log日志" );
     try
     {
         int  i = 0;
         var  a = 10 / i;
     }
     catch  (Exception exc)
     {
         //异常日志
         Logger.Fatal(exc, exc.Message);
     }
     return  View();
}


NLog.config,有两种日志,记录在C:\temp下,一种是全部日志,一种是自己通过NLog函数记录的日志。如果日志库异常,会产生在c:\temp\internal-nlog.txt下,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<? 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"
       internalLogLevel = "Warn"
       internalLogFile = "c:\temp\internal-nlog.txt" >
   <!--  ASP.NET Core 使用 -->
   < extensions >
     < add  assembly = "NLog.Web.AspNetCore" />
   </ extensions
   < targets >
     <!-- 全部日志文件 -->
     < target  xsi:type = "File"  name = "allfile"  fileName = "c:\temp\nlog-all-${shortdate}.log"
                 layout = "${longdate}|${event-properties:item=EventId.Id}|${logger}|${uppercase:${level}}|${message} ${exception}"  />
     <!-- 自定义记录的日志文件 -->
     < target  xsi:type = "File"  name = "ownFile-web"  fileName = "c:\temp\nlog-own-${shortdate}.log"
             layout = "${longdate}|${event-properties:item=EventId.Id}|${logger}|${uppercase:${level}}|  ${message} ${exception}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}"  />
     < target  xsi:type = "Null"  name = "blackhole"  />
   </ targets >
   < rules >
     <!--所括asp.net core下的全部日志-->
     < logger  name = "*"  minlevel = "Trace"  writeTo = "allfile"  />
     <!--仅自定义记录的日志文件-->
     < logger  name = "Microsoft.*"  minlevel = "Trace"  writeTo = "blackhole"  final = "true"  />
     < logger  name = "*"  minlevel = "Trace"  writeTo = "ownFile-web"  />
   </ rules >
</ nlog >


Layout中$后的数据就是要写日志的内容,关于这些数据可参考https://github.com/nlog/nlog/wiki/Layout-Renderers,可以根据自己的需要,选择要保存的日志数据,如下图是web中的日志数据:

 wKiom1iTJnagAKoAAAC_kDHd2Dw729.png-wh_50

如果想把日志保存到数据库中,可以把NLog.config修改如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
<? 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"
       internalLogLevel = "Warn"
       internalLogFile = "c:\temp\internal-nlog.txt" >
  
   <!-- ASP.NET Core 使用  -->
   < extensions >
     < add  assembly = "NLog.Web.AspNetCore" />
   </ extensions >
  
   <!-- 注意配置连接字符串 -->
   < targets >
     < target  name = "database"  xsi:type = "Database"  connectionString = "server=.;database=nglogdb;uid=SQL用户名;pwd=SQL密码;" >
       < commandText >
         INSERT INTO [dbo].[NLog] (
         [MachineName],
         [SiteName],
         [Logged],
         [Level],
         [UserName],
         [Message],
         [Logger],
         [Properties],
         [Host],
         [Controller],
         [Action],
         [Url],
         [CallSite],
         [Exception]
         ) VALUES (
         @machineName,
         @siteName,
         @logged,
         @level,
         @userName,
         @message,
         @logger,
         @properties,
         @host,
         @controller,
         @action,
         @url,
         @callSite,
         @exception
         );
       </ commandText >
       < parameter  name = "@machineName"     layout = "${machinename}"  />
       < parameter  name = "@siteName"        layout = "${iis-site-name}"  />
       < parameter  name = "@logged"          layout = "${date}"  />
       < parameter  name = "@level"           layout = "${level}"  />
       < parameter  name = "@username"        layout = "${aspnet-user-identity}"  />
       < parameter  name = "@message"         layout = "${message}"  />
       < parameter  name = "@logger"          layout = "${logger}"  />
       < parameter  name = "@properties"      layout = "${all-event-properties:separator=|}"  />
       < parameter  name = "@host"            layout = "${aspnet-request-host}"  />
       < parameter  name = "@controller"      layout = "${aspnet-MVC-Controller}"  />
       < parameter  name = "@action"          layout = "${aspnet-MVC-Action}"  />
       < parameter  name = "@url"             layout = "${aspnet-request-url}"  />
       < parameter  name = "@callSite"        layout = "${callsite}"  />
       < parameter  name = "@exception"       layout = "${exception:tostring}"  />
     </ target >
   </ targets >
   < rules >
     < logger  name = "*"  minlevel = "Trace"  writeTo = "database" />
   </ rules >
</ nlog >


数据库数据如下:

wKiom1iTJxWSduw_AAXRGAbx4Ac008.png-wh_50




















本文转自桂素伟51CTO博客,原文链接: http://blog.51cto.com/axzxs/1894584,如需转载请自行联系原作者



相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
6天前
|
Linux C++ Windows
【Azure 应用服务】Azure App Service(Windows)环境中如何让.NET应用调用SAP NetWeaver RFC函数
【Azure 应用服务】Azure App Service(Windows)环境中如何让.NET应用调用SAP NetWeaver RFC函数
【Azure 应用服务】Azure App Service(Windows)环境中如何让.NET应用调用SAP NetWeaver RFC函数
|
3天前
|
Linux iOS开发 开发者
跨平台开发不再难:.NET Core如何让你的应用在Windows、Linux、macOS上自如游走?
【8月更文挑战第28天】本文提供了一份详尽的.NET跨平台开发指南,涵盖.NET Core简介、环境配置、项目结构、代码编写、依赖管理、构建与测试、部署及容器化等多个方面,帮助开发者掌握关键技术与最佳实践,充分利用.NET Core实现高效、便捷的跨平台应用开发与部署。
29 3
|
3天前
|
缓存 Java API
【揭秘】.NET高手不愿透露的秘密:如何让应用瞬间提速?
【8月更文挑战第28天】本文通过对比的方式,介绍了针对 .NET 应用性能瓶颈的优化方法。以一个存在响应延迟和并发处理不足的 Web API 项目为例,从性能分析入手,探讨了使用结构体减少内存分配、异步编程提高吞吐量、EF Core 惰性加载减少数据库访问以及垃圾回收机制优化等多个方面,帮助开发者全面提升 .NET 应用的性能和稳定性。通过具体示例,展示了如何在不同场景下选择最佳实践,以实现更高效的应用体验。
16 3
|
3天前
|
前端开发 JavaScript 开发工具
跨域联姻:React.NET——.NET应用与React的完美融合,解锁前后端高效协作新姿势。
【8月更文挑战第28天】探索React.NET,这是将热门前端框架React与强大的.NET后端无缝集成的创新方案。React以其组件化和虚拟DOM技术著称,能构建高性能、可维护的用户界面;.NET则擅长企业级应用开发。React.NET作为桥梁,使.NET应用轻松采用React构建前端,并优化开发流程与性能。通过直接托管React组件,.NET应用简化了部署流程,同时支持服务器端渲染(SSR),提升首屏加载速度与SEO优化。
11 1
|
3天前
|
存储 缓存 安全
.NET 在金融行业的应用:高并发交易系统的构建与优化之路
【8月更文挑战第28天】在金融行业,交易系统需具备高并发处理、低延迟及高稳定性和安全性。利用.NET构建此类系统时,可采用异步编程提升并发能力,优化数据库访问以降低延迟,使用缓存减少数据库访问频率,借助分布式事务确保数据一致性,并加强安全性措施。通过综合优化,满足金融行业的严苛要求。
13 1
|
3天前
|
大数据 开发工具 开发者
从零到英雄:.NET核心技术带你踏上编程之旅,构建首个应用,开启你的数字世界探险!
【8月更文挑战第28天】本文带领读者从零开始,使用强大的.NET平台搭建首个控制台应用。无论你是新手还是希望扩展技能的开发者,都能通过本文逐步掌握.NET的核心技术。从环境搭建到创建项目,再到编写和运行代码,详细步骤助你轻松上手。通过计算两数之和的小项目,你不仅能快速入门,还能为未来开发更复杂的应用奠定基础。希望本文为你的.NET学习之旅开启新篇章!
12 1
|
3天前
|
开发框架 监控 .NET
开发者的革新利器:ASP.NET Core实战指南,构建未来Web应用的高效之道
【8月更文挑战第28天】本文探讨了如何利用ASP.NET Core构建高效、可扩展的Web应用。ASP.NET Core是一个开源、跨平台的框架,具有依赖注入、配置管理等特性。文章详细介绍了项目结构规划、依赖注入配置、中间件使用及性能优化方法,并讨论了安全性、可扩展性以及容器化的重要性。通过这些技术要点,开发者能够快速构建出符合现代Web应用需求的应用程序。
11 0
|
3天前
|
缓存 数据库连接 API
Entity Framework Core——.NET 领域的 ORM 利器,深度剖析其最佳实践之路
【8月更文挑战第28天】在软件开发领域,高效的数据访问与管理至关重要。Entity Framework Core(EF Core)作为一款强大的对象关系映射(ORM)工具,在 .NET 开发中扮演着重要角色。本文通过在线书店应用案例,展示了 EF Core 的核心特性和优势。我们定义了 `Book` 实体类及其属性,并通过 `BookStoreContext` 数据库上下文配置了数据库连接。EF Core 提供了简洁的 API,支持数据的查询、插入、更新和删除操作。
14 0
|
3天前
|
Kubernetes Linux 开发者
【实战秘籍】从零开始:用.NET与Docker打造现代化容器化应用之旅
【8月更文挑战第28天】本文详细介绍如何使用 .NET 框架构建并部署 Docker 容器化应用程序,涵盖环境搭建、项目创建、Dockerfile 编写等关键步骤。首先安装必要软件,如 Visual Studio 2022 及 Docker Desktop。接着创建 .NET Core 控制台应用,并在项目根目录编写 Dockerfile 文件。使用 .NET 运行时基础镜像,复制二进制文件,指定入口点。运行命令构建镜像并测试容器。为实现通信,映射端口。最后,标签化镜像并推送到 Docker Hub,为生产环境部署做好准备。掌握这些步骤,即可轻松应对从小型项目到大规模应用的各种需求。
14 0
|
6天前
|
存储 Linux 网络安全
【Azure App Service】.NET代码实验App Service应用中获取TLS/SSL 证书 (App Service Linux/Linux Container)
【Azure App Service】.NET代码实验App Service应用中获取TLS/SSL 证书 (App Service Linux/Linux Container)