mirror of
https://github.com/FastTunnel/FastTunnel.git
synced 2025-02-08 02:39:29 +08:00
用log4net替换nlog
This commit is contained in:
parent
6676553c82
commit
6eb52341a7
|
@ -13,8 +13,7 @@
|
||||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="6.0.0-preview.4.21253.7" />
|
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="6.0.0-preview.4.21253.7" />
|
||||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="6.0.0-preview.4.21253.7" />
|
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="6.0.0-preview.4.21253.7" />
|
||||||
<PackageReference Include="Microsoft.Extensions.Hosting" Version="6.0.0-preview.4.21253.7" />
|
<PackageReference Include="Microsoft.Extensions.Hosting" Version="6.0.0-preview.4.21253.7" />
|
||||||
<PackageReference Include="NLog" Version="4.7.10" />
|
<PackageReference Include="Microsoft.Extensions.Logging.Log4Net.AspNetCore" Version="5.0.3" />
|
||||||
<PackageReference Include="NLog.Web.AspNetCore" Version="4.13.0-readme-preview" />
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@ -25,8 +24,8 @@
|
||||||
<None Update="appsettings.json">
|
<None Update="appsettings.json">
|
||||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
</None>
|
</None>
|
||||||
<None Update="nlog.config">
|
<None Update="log4net.config">
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
</None>
|
</None>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
|
|
@ -1,14 +1,5 @@
|
||||||
using Microsoft.Extensions.Configuration;
|
using Microsoft.Extensions.Hosting;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
|
||||||
using System;
|
|
||||||
using System.IO;
|
|
||||||
using FastTunnel.Core.Services;
|
|
||||||
using Microsoft.Extensions.Hosting;
|
|
||||||
using FastTunnel.Core.Client;
|
|
||||||
using FastTunnel.Core.Config;
|
|
||||||
using FastTunnel.Core.Handlers.Client;
|
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using NLog.Web;
|
|
||||||
using FastTunnel.Core.Extensions;
|
using FastTunnel.Core.Extensions;
|
||||||
|
|
||||||
namespace FastTunnel.Client
|
namespace FastTunnel.Client
|
||||||
|
@ -17,22 +8,7 @@ namespace FastTunnel.Client
|
||||||
{
|
{
|
||||||
public static void Main(string[] args)
|
public static void Main(string[] args)
|
||||||
{
|
{
|
||||||
var logger = NLogBuilder.ConfigureNLog("nlog.config").GetCurrentClassLogger();
|
CreateHostBuilder(args).Build().Run();
|
||||||
try
|
|
||||||
{
|
|
||||||
CreateHostBuilder(args).Build().Run();
|
|
||||||
}
|
|
||||||
catch (Exception exception)
|
|
||||||
{
|
|
||||||
//NLog: catch setup errors
|
|
||||||
logger.Error(exception, "Stopped program because of exception");
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
// Ensure to flush and stop internal timers/threads before application-exit (Avoid segmentation fault on Linux)
|
|
||||||
NLog.LogManager.Shutdown();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IHostBuilder CreateHostBuilder(string[] args) =>
|
public static IHostBuilder CreateHostBuilder(string[] args) =>
|
||||||
|
@ -47,7 +23,7 @@ namespace FastTunnel.Client
|
||||||
{
|
{
|
||||||
logging.ClearProviders();
|
logging.ClearProviders();
|
||||||
logging.SetMinimumLevel(LogLevel.Trace);
|
logging.SetMinimumLevel(LogLevel.Trace);
|
||||||
})
|
logging.AddLog4Net();
|
||||||
.UseNLog(); // NLog: Setup NLog for Dependency injection
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
72
FastTunnel.Client/log4net.config
Normal file
72
FastTunnel.Client/log4net.config
Normal file
|
@ -0,0 +1,72 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
|
<log4net>
|
||||||
|
<!-- If you are looking here and want more output, first thing to do is change root/priority/@value to "INFO" or "ALL". -->
|
||||||
|
<root>
|
||||||
|
Value of priority may be ALL, DEBUG, INFO, WARN, ERROR, FATAL, OFF.
|
||||||
|
<priority value="ALL" />
|
||||||
|
<appender-ref ref="error-file" />
|
||||||
|
<appender-ref ref="debug-file" />
|
||||||
|
<appender-ref ref="info-console" />
|
||||||
|
</root>
|
||||||
|
|
||||||
|
<!-- Example of turning on the output from a component or namespace. -->
|
||||||
|
<logger name="Common">
|
||||||
|
<appender-ref ref="debugger"/>
|
||||||
|
<priority value="DEBUG" />
|
||||||
|
</logger>
|
||||||
|
|
||||||
|
<appender name="debugger" type="log4net.Appender.DebugAppender">
|
||||||
|
<!-- Sends log messages to Visual Studio if attached. -->
|
||||||
|
<immediateFlush value="true" />
|
||||||
|
<layout type="log4net.Layout.SimpleLayout" />
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<appender name="info-console" type="log4net.Appender.ConsoleAppender">
|
||||||
|
<layout type="log4net.Layout.PatternLayout">
|
||||||
|
<conversionPattern value="%date |%level%| %message%newline" />
|
||||||
|
</layout>
|
||||||
|
|
||||||
|
<filter type="log4net.Filter.LevelRangeFilter">
|
||||||
|
<param name="LevelMin" value="Info"/>
|
||||||
|
<param name="LevelMax" value="Fatal"/>
|
||||||
|
</filter>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<appender name="debug-file" type="log4net.Appender.RollingFileAppender">
|
||||||
|
<param name="Encoding" value="utf-8" />
|
||||||
|
<file value="Logs/debug" />
|
||||||
|
<appendToFile value="true" />
|
||||||
|
<!-- Immediate flush on error log, to avoid data loss with sudden termination. -->
|
||||||
|
<immediateFlush value="true" />
|
||||||
|
<staticLogFileName value="false" />
|
||||||
|
<rollingStyle value="Date" />
|
||||||
|
<datepattern value="-yyyy.MM.dd'.log'" />
|
||||||
|
<!-- Prevents Orchard.exe from displaying locking debug messages. -->
|
||||||
|
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
|
||||||
|
<layout type="log4net.Layout.PatternLayout">
|
||||||
|
<conversionPattern value="%date %level% [%thread] %logger - %P{Tenant} - %message%newline" />
|
||||||
|
</layout>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<appender name="error-file" type="log4net.Appender.RollingFileAppender">
|
||||||
|
<param name="Encoding" value="utf-8" />
|
||||||
|
<file value="Logs/error" />
|
||||||
|
<appendToFile value="true" />
|
||||||
|
<!-- Immediate flush on error log, to avoid data loss with sudden termination. -->
|
||||||
|
<immediateFlush value="true" />
|
||||||
|
<staticLogFileName value="false" />
|
||||||
|
<rollingStyle value="Date" />
|
||||||
|
<datepattern value="-yyyy.MM.dd'.log'" />
|
||||||
|
<!-- Prevents Orchard.exe from displaying locking debug messages. -->
|
||||||
|
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
|
||||||
|
<filter type="log4net.Filter.LevelRangeFilter">
|
||||||
|
<!-- Only ERROR and FATAL log messages end up in this target, even if child loggers accept lower priority. -->
|
||||||
|
<param name="LevelMin" value="Info"/>
|
||||||
|
<param name="LevelMax" value="Fatal"/>
|
||||||
|
</filter>
|
||||||
|
<layout type="log4net.Layout.PatternLayout">
|
||||||
|
<conversionPattern value="%date [%thread] %logger - %P{Tenant} - %message [%P{Url}]%newline" />
|
||||||
|
</layout>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
</log4net>
|
|
@ -1,26 +0,0 @@
|
||||||
<?xml version="1.0" ?>
|
|
||||||
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
autoReload="true"
|
|
||||||
internalLogLevel="Info">
|
|
||||||
|
|
||||||
<!-- enable asp.net core layout renderers -->
|
|
||||||
<extensions>
|
|
||||||
<add assembly="NLog.Web.AspNetCore"/>
|
|
||||||
</extensions>
|
|
||||||
<targets>
|
|
||||||
<target xsi:type="File" name="file"
|
|
||||||
layout="${longdate} ${logger} ${message}${exception:format=ToString}"
|
|
||||||
fileName="${basedir}/Logs/${shortdate}.${level}.log" />
|
|
||||||
|
|
||||||
<target xsi:type="Console" name="console"
|
|
||||||
layout="${date}|${level:uppercase=true}|${message} ${exception}" />
|
|
||||||
<!--layout="${date}|${level:uppercase=true}|${message} ${exception}|${logger}|${all-event-properties}" />-->
|
|
||||||
</targets>
|
|
||||||
|
|
||||||
<rules>
|
|
||||||
<logger name="*" minlevel="Debug" writeTo="file,console" />
|
|
||||||
<!--Skip non-critical Microsoft logs and so log only own logs-->
|
|
||||||
<logger name="Microsoft.*" maxlevel="Info" final="true" />
|
|
||||||
</rules>
|
|
||||||
</nlog>
|
|
|
@ -44,8 +44,6 @@
|
||||||
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="6.0.0-preview.4.21253.7" />
|
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="6.0.0-preview.4.21253.7" />
|
||||||
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="6.0.0-preview.4.21253.7" />
|
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="6.0.0-preview.4.21253.7" />
|
||||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
|
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
|
||||||
<PackageReference Include="NLog" Version="4.7.10" />
|
|
||||||
<PackageReference Include="NLog.Extensions.Logging" Version="1.7.2" />
|
|
||||||
<PackageReference Include="System.IO.Pipelines" Version="5.0.1" />
|
<PackageReference Include="System.IO.Pipelines" Version="5.0.1" />
|
||||||
<PackageReference Include="System.Private.ServiceModel" Version="4.8.1" />
|
<PackageReference Include="System.Private.ServiceModel" Version="4.8.1" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
|
@ -1,34 +0,0 @@
|
||||||
using NLog;
|
|
||||||
using NLog.Config;
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Text;
|
|
||||||
|
|
||||||
namespace FastTunnel.Core.Logger
|
|
||||||
{
|
|
||||||
public class NlogConfig
|
|
||||||
{
|
|
||||||
public static LoggingConfiguration getNewConfig()
|
|
||||||
{
|
|
||||||
var config = new LoggingConfiguration();
|
|
||||||
|
|
||||||
// Targets where to log to: File and Console
|
|
||||||
var logfile = new NLog.Targets.FileTarget("file")
|
|
||||||
{
|
|
||||||
FileName = "${basedir}/Logs/${shortdate}.${level}.log",
|
|
||||||
Layout = "${longdate} ${logger} ${message}${exception:format=ToString}"
|
|
||||||
};
|
|
||||||
|
|
||||||
var logconsole = new NLog.Targets.ConsoleTarget("console")
|
|
||||||
{
|
|
||||||
Layout = "${date}|${level:uppercase=true}|${message} ${exception} ${all-event-properties}"
|
|
||||||
};
|
|
||||||
|
|
||||||
// Rules for mapping loggers to targets
|
|
||||||
config.AddRule(LogLevel.Debug, LogLevel.Fatal, logconsole);
|
|
||||||
config.AddRule(LogLevel.Debug, LogLevel.Fatal, logfile);
|
|
||||||
|
|
||||||
return config;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -6,21 +6,10 @@
|
||||||
<RunAnalyzersDuringBuild>true</RunAnalyzersDuringBuild>
|
<RunAnalyzersDuringBuild>true</RunAnalyzersDuringBuild>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<Content Update="nlog.config" CopyToOutputDirectory="PreserveNewest" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<None Include="nlog.config">
|
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
|
||||||
</None>
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Microsoft.Extensions.Logging" Version="6.0.0-preview.4.21253.7" />
|
<PackageReference Include="Microsoft.Extensions.Logging" Version="6.0.0-preview.4.21253.7" />
|
||||||
<PackageReference Include="Microsoft.Extensions.Logging.Configuration" Version="6.0.0-preview.4.21253.7" />
|
<PackageReference Include="Microsoft.Extensions.Logging.Configuration" Version="6.0.0-preview.4.21253.7" />
|
||||||
<PackageReference Include="NLog" Version="4.7.10" />
|
<PackageReference Include="Microsoft.Extensions.Logging.Log4Net.AspNetCore" Version="5.0.3" />
|
||||||
<PackageReference Include="NLog.Web.AspNetCore" Version="4.13.0-readme-preview" />
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|
|
@ -5,7 +5,6 @@ using Microsoft.Extensions.Configuration;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using Microsoft.Extensions.Hosting;
|
using Microsoft.Extensions.Hosting;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using NLog.Web;
|
|
||||||
using System;
|
using System;
|
||||||
|
|
||||||
namespace FastTunnel.Server
|
namespace FastTunnel.Server
|
||||||
|
@ -14,22 +13,7 @@ namespace FastTunnel.Server
|
||||||
{
|
{
|
||||||
public static void Main(string[] args)
|
public static void Main(string[] args)
|
||||||
{
|
{
|
||||||
var logger = NLogBuilder.ConfigureNLog("nlog.config").GetCurrentClassLogger();
|
CreateHostBuilder(args).Build().Run();
|
||||||
try
|
|
||||||
{
|
|
||||||
CreateHostBuilder(args).Build().Run();
|
|
||||||
}
|
|
||||||
catch (Exception exception)
|
|
||||||
{
|
|
||||||
//NLog: catch setup errors
|
|
||||||
logger.Error(exception, "Stopped program because of exception");
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
// Ensure to flush and stop internal timers/threads before application-exit (Avoid segmentation fault on Linux)
|
|
||||||
NLog.LogManager.Shutdown();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IHostBuilder CreateHostBuilder(string[] args) =>
|
public static IHostBuilder CreateHostBuilder(string[] args) =>
|
||||||
|
@ -58,7 +42,7 @@ namespace FastTunnel.Server
|
||||||
{
|
{
|
||||||
logging.ClearProviders();
|
logging.ClearProviders();
|
||||||
logging.SetMinimumLevel(LogLevel.Trace);
|
logging.SetMinimumLevel(LogLevel.Trace);
|
||||||
})
|
logging.AddLog4Net();
|
||||||
.UseNLog(); // NLog: Setup NLog for Dependency injection
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
"BindPort": 1271,
|
"BindPort": 1271,
|
||||||
|
|
||||||
// 自定义域名web穿透必须
|
// 自定义域名web穿透必须
|
||||||
"WebDomain": "my.com",
|
"WebDomain": "test.cc",
|
||||||
|
|
||||||
// 服务监听的端口号, 访问自定义域名站点时url为 http://{SubDomain}.{Domain}:{ProxyPort_HTTP}/
|
// 服务监听的端口号, 访问自定义域名站点时url为 http://{SubDomain}.{Domain}:{ProxyPort_HTTP}/
|
||||||
// web穿透必须
|
// web穿透必须
|
||||||
|
|
72
FastTunnel.Server/log4net.config
Normal file
72
FastTunnel.Server/log4net.config
Normal file
|
@ -0,0 +1,72 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
|
<log4net>
|
||||||
|
<!-- If you are looking here and want more output, first thing to do is change root/priority/@value to "INFO" or "ALL". -->
|
||||||
|
<root>
|
||||||
|
Value of priority may be ALL, DEBUG, INFO, WARN, ERROR, FATAL, OFF.
|
||||||
|
<priority value="ALL" />
|
||||||
|
<appender-ref ref="error-file" />
|
||||||
|
<appender-ref ref="debug-file" />
|
||||||
|
<appender-ref ref="info-console" />
|
||||||
|
</root>
|
||||||
|
|
||||||
|
<!-- Example of turning on the output from a component or namespace. -->
|
||||||
|
<logger name="Common">
|
||||||
|
<appender-ref ref="debugger"/>
|
||||||
|
<priority value="DEBUG" />
|
||||||
|
</logger>
|
||||||
|
|
||||||
|
<appender name="debugger" type="log4net.Appender.DebugAppender">
|
||||||
|
<!-- Sends log messages to Visual Studio if attached. -->
|
||||||
|
<immediateFlush value="true" />
|
||||||
|
<layout type="log4net.Layout.SimpleLayout" />
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<appender name="info-console" type="log4net.Appender.ConsoleAppender">
|
||||||
|
<layout type="log4net.Layout.PatternLayout">
|
||||||
|
<conversionPattern value="%date |%level%| %message%newline" />
|
||||||
|
</layout>
|
||||||
|
|
||||||
|
<filter type="log4net.Filter.LevelRangeFilter">
|
||||||
|
<param name="LevelMin" value="Info"/>
|
||||||
|
<param name="LevelMax" value="Fatal"/>
|
||||||
|
</filter>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<appender name="debug-file" type="log4net.Appender.RollingFileAppender">
|
||||||
|
<param name="Encoding" value="utf-8" />
|
||||||
|
<file value="Logs/debug" />
|
||||||
|
<appendToFile value="true" />
|
||||||
|
<!-- Immediate flush on error log, to avoid data loss with sudden termination. -->
|
||||||
|
<immediateFlush value="true" />
|
||||||
|
<staticLogFileName value="false" />
|
||||||
|
<rollingStyle value="Date" />
|
||||||
|
<datepattern value="-yyyy.MM.dd'.log'" />
|
||||||
|
<!-- Prevents Orchard.exe from displaying locking debug messages. -->
|
||||||
|
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
|
||||||
|
<layout type="log4net.Layout.PatternLayout">
|
||||||
|
<conversionPattern value="%date %level% [%thread] %logger - %P{Tenant} - %message%newline" />
|
||||||
|
</layout>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<appender name="error-file" type="log4net.Appender.RollingFileAppender">
|
||||||
|
<param name="Encoding" value="utf-8" />
|
||||||
|
<file value="Logs/error" />
|
||||||
|
<appendToFile value="true" />
|
||||||
|
<!-- Immediate flush on error log, to avoid data loss with sudden termination. -->
|
||||||
|
<immediateFlush value="true" />
|
||||||
|
<staticLogFileName value="false" />
|
||||||
|
<rollingStyle value="Date" />
|
||||||
|
<datepattern value="-yyyy.MM.dd'.log'" />
|
||||||
|
<!-- Prevents Orchard.exe from displaying locking debug messages. -->
|
||||||
|
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
|
||||||
|
<filter type="log4net.Filter.LevelRangeFilter">
|
||||||
|
<!-- Only ERROR and FATAL log messages end up in this target, even if child loggers accept lower priority. -->
|
||||||
|
<param name="LevelMin" value="Info"/>
|
||||||
|
<param name="LevelMax" value="Fatal"/>
|
||||||
|
</filter>
|
||||||
|
<layout type="log4net.Layout.PatternLayout">
|
||||||
|
<conversionPattern value="%date [%thread] %logger - %P{Tenant} - %message [%P{Url}]%newline" />
|
||||||
|
</layout>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
</log4net>
|
|
@ -1,26 +0,0 @@
|
||||||
<?xml version="1.0" ?>
|
|
||||||
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
autoReload="true"
|
|
||||||
internalLogLevel="Info">
|
|
||||||
|
|
||||||
<!-- enable asp.net core layout renderers -->
|
|
||||||
<extensions>
|
|
||||||
<add assembly="NLog.Web.AspNetCore"/>
|
|
||||||
</extensions>
|
|
||||||
<targets>
|
|
||||||
<target xsi:type="File" name="file"
|
|
||||||
layout="${longdate} ${logger} ${message}${exception:format=ToString}"
|
|
||||||
fileName="${basedir}/Logs/${shortdate}.${level}.log" />
|
|
||||||
|
|
||||||
<target xsi:type="Console" name="console"
|
|
||||||
layout="${date}|${level:uppercase=true}|${message} ${exception}" />
|
|
||||||
<!--layout="${date}|${level:uppercase=true}|${message} ${exception}|${logger}|${all-event-properties}" />-->
|
|
||||||
</targets>
|
|
||||||
|
|
||||||
<rules>
|
|
||||||
<logger name="*" minlevel="Debug" writeTo="file,console" />
|
|
||||||
<!--Skip non-critical Microsoft logs and so log only own logs-->
|
|
||||||
<logger name="Microsoft.*" maxlevel="Info" final="true" />
|
|
||||||
</rules>
|
|
||||||
</nlog>
|
|
Loading…
Reference in New Issue
Block a user