Introduction
The FTP server utilizes Microsoft.Extensions.Logging
which provides an interface to many logging frameworks (e.g. NLog).
Example: Using SeriLog
Adding SeriLog to the project
Go to the quickstart project created during the Quickstart tutorial and add the following NuGet packages:
# Serilog.Extensions.Logging
dotnet add package Serilog.Extensions.Logging
# Serilog.Sinks.Console
dotnet add package Serilog.Sinks.Console
Configure serilog in Program.cs
Add the highlighted lines to your Program.cs:
using System;
using System.IO;
using FubarDev.FtpServer;
using FubarDev.FtpServer.FileSystem.DotNet;
using Microsoft.Extensions.DependencyInjection;
using Serilog;
namespace QuickStart
{
class Program
{
static async Task Main(string[] args)
{
// Configure Serilog
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Verbose()
.Enrich.FromLogContext()
.WriteTo.Console()
.CreateLogger();
// Setup dependency injection
var services = new ServiceCollection();
// Add Serilog as logger provider
services.AddLogging(lb => lb.AddSerilog());
// use %TEMP%/TestFtpServer as root folder
services.Configure<DotNetFileSystemOptions>(opt => opt
.RootPath = Path.Combine(Path.GetTempPath(), "TestFtpServer"));
// Add FTP server services
// DotNetFileSystemProvider = Use the .NET file system functionality
// AnonymousMembershipProvider = allow only anonymous logins
services.AddFtpServer(builder => builder
.UseDotNetFileSystem() // Use the .NET file system functionality
.EnableAnonymousAuthentication()); // allow anonymous logins
// Configure the FTP server
services.Configure<FtpServerOptions>(opt => opt.ServerAddress = "127.0.0.1");
// Build the service provider
using (var serviceProvider = services.BuildServiceProvider())
{
// Initialize the FTP server
var ftpServerHost = serviceProvider.GetRequiredService<IFtpServerHost>();
// Start the FTP server
await ftpServerHost.StartAsync();
Console.WriteLine("Press ENTER/RETURN to close the test application.");
Console.ReadLine();
// Stop the FTP server
await ftpServerHost.StopAsync();
}
}
}
}
Now you can see all the log messages from the FTP server.
Example: Using NLog
Adding NLog to the project
Go to the quickstart project created during the Quickstart tutorial and add the following NuGet package:
# Add NLog
dotnet add package NLog.Extensions.Logging
Add the NLog configuration
Now add a file called nlog.config
with the following contents:
<?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"
xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
autoReload="true"
throwExceptions="false">
<targets>
<target xsi:type="ColoredConsole" name="console" layout="${longdate} ${uppercase:${level}} ${mdlc:item=RemoteAddress} ${message} ${exception:format=tostring}"/>
</targets>
<rules>
<logger name="*" minlevel="Trace" writeTo="console" />
</rules>
</nlog>
Add the configuration to the project
Change the csproj
file by adding the following lines:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.2</TargetFramework>
<RootNamespace>QuickStart</RootNamespace>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\src\FubarDev.FtpServer\FubarDev.FtpServer.csproj" />
<ProjectReference Include="..\..\..\src\FubarDev.FtpServer.FileSystem.DotNet\FubarDev.FtpServer.FileSystem.DotNet.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="2.1.0" />
<PackageReference Include="NLog.Extensions.Logging" Version="1.1.0" />
</ItemGroup>
<ItemGroup>
<Content Include="nlog.config">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
</Project>
This ensures that the nlog.config
file gets copied into the build output folder and is available for the application.
Registering NLog in Program.cs
using System;
using System.IO;
using FubarDev.FtpServer;
using FubarDev.FtpServer.FileSystem.DotNet;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using NLog.Extensions.Logging;
namespace QuickStart
{
class Program
{
static void Main(string[] args)
{
// Setup dependency injection
var services = new ServiceCollection();
// Add logging
services.AddLogging(lb => lb.SetMinimumLevel(LogLevel.Trace));
// use %TEMP%/TestFtpServer as root folder
services.Configure<DotNetFileSystemOptions>(opt => opt
.RootPath = Path.Combine(Path.GetTempPath(), "TestFtpServer"));
// Add FTP server services
// DotNetFileSystemProvider = Use the .NET file system functionality
// AnonymousMembershipProvider = allow only anonymous logins
services.AddFtpServer(builder => builder
.UseDotNetFileSystem() // Use the .NET file system functionality
.EnableAnonymousAuthentication()); // allow anonymous logins
// Configure the FTP server
services.Configure<FtpServerOptions>(opt => opt.ServerAddress = "127.0.0.1");
// Build the service provider
using (var serviceProvider = services.BuildServiceProvider())
{
var loggerFactory = serviceProvider.GetRequiredService<ILoggerFactory>();
//configure NLog
loggerFactory.AddNLog(new NLogProviderOptions { CaptureMessageTemplates = true, CaptureMessageProperties = true });
NLog.LogManager.LoadConfiguration("nlog.config");
// Initialize the FTP server
var ftpServerHost = serviceProvider.GetRequiredService<IFtpServerHost>();
// Start the FTP server
ftpServerHost.StartAsync().Wait();
Console.WriteLine("Press ENTER/RETURN to close the test application.");
Console.ReadLine();
// Stop the FTP server
ftpServerHost.StopAsync().Wait();
}
}
}
}
Now you can see all the log messages from the FTP server.