Logging is a crucial part of any application. In this blog, I will walk through using NLog and Splunk for application logging.
Traditionally we used to use file-based logging. But with container-based application saving logs to a file is not a good strategy.
In enterprise, there is the use of log collectors, which is provided by major hosted logging solutions. These log collectors collect log from file and send them to a centralized viewing/storage system.
In the world of containers, installing a log collector is not a good idea either. Since containers can boot up and shut down at any time.
Today in thing blog, I am going to discuss how to use NLog in a containerized .NET Core application. And use Splunk as the log store and search tool.
Installing Splunk
Firstly, I will install the docker image of Splunk.
docker pull splunk/splunk:latest
Secondly, I will start the docker image, during which I will expose two ports; 8000 and 8088. The post 8000 is for the Web UI and port 8088 is for the API access.
docker run -d -p 8000:8000 -p 8088:8088 -e "SPLUNK_START_ARGS=--accept-license" -e "SPLUNK_PASSWORD=Password_Here" --name splunk splunk/splunk:latest
Configuring Splunk
For Splunk to be able to log application logs from NLog, I will configure the HTTP Event Collector.
- Firstly, I will click
Settings -> Data Inputs - Secondly, I will click
"+ Add New"in the HTTP Event Collector row - Thirdly, provide the name of the event collector as
"nlog-logger"and clickNext - Fourthly, I will select
"Search & Reporting (search)"in the"App Context"section and add all available items in the"Index"section and clickReview. - Finally I will click
Submit.




Enabling the Http Event Collector
To enable the Http Event Collector, I will click on Settings -> Data Inputs -> HTTP Event Collector.
Once I am in the HTTP Event Collector page, I will click "Global Settings" and enable the event collector clicking the "Enable" Button. I will also set the "Default Index" as main.

.NET Core Console Application
Since the Splunk configuration is complete; hence now I will create a .NET Core Console application to log into Splunk using NLog.
Once the console project is created, I will install the following Nuget packages:
Microsoft.Extensions.DependencyInjection– For dependency injectionMicrosoft.Extensions.Logging– Logging extensionNLog– Logging frameworkNLog.Extensions.Logging– To get NLog into .NET Core IoC container logging integrationNLog.Targets.Splunk– Needed for NLog to log ti Splunk
Adding NLog configuration
Once the Nuget packages are installed, I will create nlog.xml file for the NLog configuration. I will copy the initial content of the file from the NLog.Targets.Splunk‘s GitHub page : https://github.com/AlanBarber/NLog.Targets.Splunk
I will update the following values in the nlog.xml file:
- serverUrl – With my http://localhost:8088 url.
- token – With the token value from the Http Event Collector “nlog-logger” I created.
IoC Container configuration
Once the Nuget packages are installed, I will create ContainerConfiguration to register the logger to the IoC container.
In this class, firstly, I will load the NLog configuration. Secondly, add NLog as the log provider. And finally, build the service collection and return the ServiceProvider instance.
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using NLog;
using NLog.Extensions.Logging;
using System;
namespace Splunk.Demo
{
internal static class ContainerConfiguration
{
public static IServiceProvider Configure()
{
var serviceCollection = new ServiceCollection();
LogManager.LoadConfiguration("nlog.xml");
serviceCollection.AddLogging(l =>
{
l.AddNLog();
}).Configure<LoggerFilterOptions>(c => c.MinLevel = Microsoft.Extensions.Logging.LogLevel.Trace);
return serviceCollection.BuildServiceProvider();
}
}
}
Logging in Main
Finally, I will update the Main method in the Program class to get an instance of the ILogger from the IoC container; and log to Splunk.
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.DependencyInjection;
using System;
namespace Splunk.Demo
{
class Program
{
static void Main(string[] args)
{
var serviceProvider = ContainerConfiguration.Configure();
var logger = serviceProvider.GetService<ILogger<Program>>();
logger.LogInformation($"Test splunk log {DateTime.Now}");
}
}
}
Checking log in Splunk
Next, I will go to the Splunk “Search & Reporting” page. Enter the search text source=”Splunk.Demo.Program” in the search box hit enter. And this should give me the result of my log.

Conclusion
In conclusion, when running applications inside of the container, sending log to a remote location is key for crucial insights. Splunk helps us with that with few easy steps.
GitHub code location: https://github.com/choudhurynirjhar/splunk-demo
Most importantly, here is the link to the YouTube video: https://youtu.be/j4L9QDg6zas