Skip to content

Getting started with ASP.NET Core (csproj vs2017)

Rolf Kristensen edited this page Feb 5, 2022 · 20 revisions

How to use for ASP.NET Core 1 with csproj (VS2017 only)

This tutorial is for ASP.NET Core 1 (only .NET Standard 1 and .NET 4.5.x are supported)

Looking for project.json (note, deprecated by Microsoft), check project.json version of this tutorial

0. Create a new ASP.NET Core project

In Visual Studio 2017.

1. Add dependency in csproj manually or using NuGet

Install the latest:

NB: Update the NLog package if possible

2. Create a nlog.config file.

Create nlog.config (lowercase all) file in the root of your project.

We use this example:

<?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">

  <!-- Load the ASP.NET Core plugin -->
  <extensions>
    <add assembly="NLog.Web.AspNetCore"/>
  </extensions>

  <!-- the targets to write to -->
  <targets>
     <!-- write logs to file -->
     <target xsi:type="File" name="allfile" fileName="c:\temp\nlog-all-${shortdate}.log"
                 layout="${longdate}|${event-properties:item=EventId_Id}|${logger}|${level:uppercase=true}|${message} ${exception:format=tostring}" />

   <!-- another file log, only own logs. Uses some ASP.NET core renderers -->
     <target xsi:type="File" name="ownFile-web" fileName="c:\temp\nlog-own-${shortdate}.log"
             layout="${longdate}|${event-properties:item=EventId_Id}|${logger}|${level:uppercase=true}|  ${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}" />

  </targets>

  <!-- rules to map from logger name to target -->
  <rules>
    <!--All logs, including from Microsoft-->
    <logger name="*" minlevel="Trace" writeTo="allfile" />

    <!--Skip non-critical Microsoft logs and so log only own logs-->
    <logger name="Microsoft.*" maxLevel="Info" final="true" /> <!-- BlackHole without writeTo -->
    <logger name="*" minlevel="Trace" writeTo="ownFile-web" />
  </rules>
</nlog>

More details of the config file are here.

If you like to include other targets or layout renderers, check the Platform support table, as there is a limited set implemented. Check the column NetStandard. To read more about NetStandard, see the docs from Microsoft

3. Enable copy to bin folder

Enable copy to bin folder for nlog.config

image

4. Update startup.cs

Add to your startup.cs

using NLog.Extensions.Logging;
using NLog.Web;

public Startup(IHostingEnvironment env)
{
    env.ConfigureNLog("nlog.config");
}

public void ConfigureServices(IServiceCollection Services)
{
    //call this in case you need aspnet-user-authtype/aspnet-user-identity
    services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
}

// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{

    //add NLog to ASP.NET Core
    loggerFactory.AddNLog();

    //add NLog.Web
    app.AddNLogWeb();

   //note: remove the old loggerFactory, like loggerFactory.AddConsole and  loggerFactory.AddDebug

5. Write logs

Inject the ILogger in your controller:

    public class HomeController : Controller
    {
        private readonly ILogger<HomeController> _logger;

        public HomeController(ILogger<HomeController> logger)
        {
            _logger = logger;
        }

        public IActionResult Index()
        {
            _logger.LogInformation("Index page says hello");
            return View();
        }

6. Example Output

When starting the ASP.NET Core website, we get two files:

nlog-own-2017-04-28.log

2017-04-28 22:00:20.6239|0|aspnet_core_example_vs2017.Controllers.HomeController|INFO|  Index page says hello |url: http://localhost/|action: Index

nlog-all-2017-04-28.log

2017-04-28 22:00:18.8092|3|Microsoft.AspNetCore.Hosting.Internal.WebHost|DEBUG|Hosting starting 
2017-04-28 22:00:19.0692|4|Microsoft.AspNetCore.Hosting.Internal.WebHost|DEBUG|Hosting started 
2017-04-28 22:00:19.1842|1|Microsoft.AspNetCore.Server.Kestrel|DEBUG|Connection id "0HL4EE4P3ORH2" started. 
2017-04-28 22:00:19.1842|1|Microsoft.AspNetCore.Server.Kestrel|DEBUG|Connection id "0HL4EE4P3ORH1" started. 
2017-04-28 22:00:19.4112|1|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request starting HTTP/1.1 DEBUG http://localhost:54918/  0 
2017-04-28 22:00:19.4112|1|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request starting HTTP/1.1 GET http://localhost:54918/   
2017-04-28 22:00:19.9028|4|Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware|DEBUG|The request path / does not match a supported file type 
2017-04-28 22:00:19.9249|9|Microsoft.AspNetCore.Server.Kestrel|DEBUG|Connection id "0HL4EE4P3ORH2" completed keep alive response. 
2017-04-28 22:00:19.9909|2|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request finished in 619.9536ms 200  
2017-04-28 22:00:20.3439|1|Microsoft.AspNetCore.Routing.RouteBase|DEBUG|Request successfully matched the route with name 'default' and template '{controller=Home}/{action=Index}/{id?}'. 
2017-04-28 22:00:20.5209|1|Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker|DEBUG|Executing action aspnet_core_example_vs2017.Controllers.HomeController.Index (aspnet-core-example-vs2017) 
2017-04-28 22:00:20.6129|1|Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker|INFO|Executing action method aspnet_core_example_vs2017.Controllers.HomeController.Index (aspnet-core-example-vs2017) with arguments ((null)) - ModelState is Valid 
2017-04-28 22:00:20.6239|0|aspnet_core_example_vs2017.Controllers.HomeController|INFO|Index page says hello 
2017-04-28 22:00:20.6559|2|Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker|DEBUG|Executed action method aspnet_core_example_vs2017.Controllers.HomeController.Index (aspnet-core-example-vs2017), returned result Microsoft.AspNetCore.Mvc.ViewResult. 
2017-04-28 22:00:20.8379|1|Microsoft.AspNetCore.Mvc.Razor.RazorViewEngine|DEBUG|View lookup cache miss for view 'Index' in controller 'Home'. 
2017-04-28 22:00:20.9049|1|Microsoft.AspNetCore.Mvc.Razor.Internal.RazorCompilationService|DEBUG|Code generation for the Razor file at '/Views/Home/Index.cshtml' started. 
2017-04-28 22:00:22.1469|2|Microsoft.AspNetCore.Mvc.Razor.Internal.RazorCompilationService|DEBUG|Code generation for the Razor file at '/Views/Home/Index.cshtml' completed in 1196.4305ms. 
2017-04-28 22:00:22.1739|1|Microsoft.AspNetCore.Mvc.Razor.Internal.DefaultRoslynCompilationService|DEBUG|Compilation of the generated code for the Razor file at '/Views/Home/Index.cshtml' started. 
2017-04-28 22:00:25.3189|2|Microsoft.AspNetCore.Mvc.Razor.Internal.DefaultRoslynCompilationService|DEBUG|Compilation of the generated code for the Razor file at '/Views/Home/Index.cshtml' completed in 3135.1505ms. 
2017-04-28 22:00:25.3419|1|Microsoft.AspNetCore.Mvc.Razor.Internal.RazorCompilationService|DEBUG|Code generation for the Razor file at '/Views/_ViewStart.cshtml' started. 
2017-04-28 22:00:25.3699|2|Microsoft.AspNetCore.Mvc.Razor.Internal.RazorCompilationService|DEBUG|Code generation for the Razor file at '/Views/_ViewStart.cshtml' completed in 11.4153ms. 
2017-04-28 22:00:25.3699|1|Microsoft.AspNetCore.Mvc.Razor.Internal.DefaultRoslynCompilationService|DEBUG|Compilation of the generated code for the Razor file at '/Views/_ViewStart.cshtml' started. 
2017-04-28 22:00:25.4709|2|Microsoft.AspNetCore.Mvc.Razor.Internal.DefaultRoslynCompilationService|DEBUG|Compilation of the generated code for the Razor file at '/Views/_ViewStart.cshtml' completed in 80.4722ms. 
2017-04-28 22:00:25.4879|2|Microsoft.AspNetCore.Mvc.ViewFeatures.Internal.ViewResultExecutor|DEBUG|The view 'Index' was found. 
2017-04-28 22:00:25.5029|1|Microsoft.AspNetCore.Mvc.ViewFeatures.Internal.ViewResultExecutor|INFO|Executing ViewResult, running view at path /Views/Home/Index.cshtml. 
2017-04-28 22:00:25.6519|0|Microsoft.Extensions.DependencyInjection.DataProtectionServices|INFO|User profile is available. Using 'C:\Users\j.verdurmen\AppData\Local\ASP.NET\DataProtection-Keys' as key repository and Windows DPAPI to encrypt keys at rest. 
2017-04-28 22:00:26.0065|1|Microsoft.AspNetCore.Mvc.Razor.RazorViewEngine|DEBUG|View lookup cache miss for view '_Layout' in controller 'Home'. 
2017-04-28 22:00:26.0845|1|Microsoft.AspNetCore.Mvc.Razor.Internal.RazorCompilationService|DEBUG|Code generation for the Razor file at '/Views/Shared/_Layout.cshtml' started. 
2017-04-28 22:00:26.3375|2|Microsoft.AspNetCore.Mvc.Razor.Internal.RazorCompilationService|DEBUG|Code generation for the Razor file at '/Views/Shared/_Layout.cshtml' completed in 208.8192ms. 
2017-04-28 22:00:26.3635|1|Microsoft.AspNetCore.Mvc.Razor.Internal.DefaultRoslynCompilationService|DEBUG|Compilation of the generated code for the Razor file at '/Views/Shared/_Layout.cshtml' started. 
2017-04-28 22:00:27.2465|2|Microsoft.AspNetCore.Mvc.Razor.Internal.DefaultRoslynCompilationService|DEBUG|Compilation of the generated code for the Razor file at '/Views/Shared/_Layout.cshtml' completed in 832.6316ms. 
2017-04-28 22:00:27.7265|2|Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker|INFO|Executed action aspnet_core_example_vs2017.Controllers.HomeController.Index (aspnet-core-example-vs2017) in 7197.8417ms 
2017-04-28 22:00:28.0845|9|Microsoft.AspNetCore.Server.Kestrel|DEBUG|Connection id "0HL4EE4P3ORH1" completed keep alive response. 
2017-04-28 22:00:28.1455|2|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request finished in 8762.0557ms 200 text/html; charset=utf-8 


Configure NLog Targets for output

Next step, see Configure NLog with nlog.config