在.NET Core中,创建了一个新的工作程序服务模板。该模板基本上可以将常规控制台应用程序转换为Windows服务。这样,我们可以利用诸如依赖项注入,日志记录和配置之类的功能来运行服务,执行一些经常发生的工作负载。
同时,将添加NLog以便记录所有异常或任何其他相关事件。
创建一个.NetCore Worker Service
打开Visual Studio,然后选择Worker Service模板,为其命名并创建项目。
添加NLog
右键单击您的项目,然后选择“管理NuGet软件包”。浏览后找到NLog并安装NLog.Web.AspNetCore扩展。
添加NLog配置文件
现在我们需要添加一个nlog.config文件。为此,请在项目上单击鼠标右键,选择“添加新文件”,搜索“ config”并添加新的配置文件。
就我而言,我将使用NLog写入SQL数据库,因此这是我的配置。
<span style="color:#929292"><span style="color:#1e1e1e"><code><?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\Logs\internal-nlog4txt"
throwConfigExceptions="true">
<extensions>
<add assembly="NLog.Web.AspNetCore"/>
</extensions>
<targets>
<target name="database" xsi:type="Database">
<connectionString>
Server=.;Database=NLogDb;Trusted_Connection=True;
</connectionString>
<commandText>
insert into dbo.NlogDBLog (
Application, Logged, Level, Message,
Logger, CallSite, Exception
) values (
@Application, @Logged, @Level, @Message,
@Logger, @Callsite, @Exception
);
</commandText>
<parameter name="@application" layout="AspNetCoreNlog" />
<parameter name="@logged" layout="${date}" />
<parameter name="@level" layout="${level}" />
<parameter name="@message" layout="${message}" />
<parameter name="@logger" layout="${logger}" />
<parameter name="@callSite" layout="${callsite:filename=true}" />
<parameter name="@exception" layout="${exception:tostring}" />
</target>
</targets>
<rules>
<logger name="*" minlevel="Trace" writeTo="database" />
</rules>
</nlog></code></span></span>
为了使NLog写入数据库,您还需要通过Manage NuGet Packages添加System.Data.SqlClient。
创建数据库和日志表
现在我们已经配置了NLog,我们需要创建一个数据库和日志表,其名称和字段与nlog.config文件中指定的名称和字段相同。
在数据库下的SSMS中,我创建了一个名为NLogDb的新数据库。在您的情况下,如果您已经有一个数据库或要调用它,则别忘了更新nlog.config文件上的名称。
这是创建日志表的sql脚本:
<span style="color:#929292"><span style="color:#1e1e1e"><code> SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
CREATE TABLE [dbo].[NlogDBLog] (
[Id] [int] IDENTITY(1,1) NOT NULL,
[Application] [nvarchar](50) NOT NULL,
[Logged] [datetime] NOT NULL,
[Level] [nvarchar](50) NOT NULL,
[Message] [nvarchar](max) NOT NULL,
[Logger] [nvarchar](250) NULL,
[Callsite] [nvarchar](max) NULL,
[Exception] [nvarchar](max) NULL,
CONSTRAINT [PK_dbo.NlogDBLog] PRIMARY KEY CLUSTERED ([Id] ASC)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]</code></span></span>
更新 Worker Service 代码
更改program.cs代码以反映以下更改:
<span style="color:#929292"><span style="color:#1e1e1e"><code>public static void Main(string[] args)
{
var logger = NLogBuilder.ConfigureNLog("nlog.config").GetCurrentClassLogger();
try
{
logger.Info("Starting up the service");
CreateHostBuilder(args).Build().Run();
}
catch (Exception ex)
{
logger.Fatal(ex, "There was a problem starting the serivce");
}
finally
{
NLog.LogManager.Shutdown();
}
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseWindowsService()
.ConfigureServices((hostContext, services) =>
{
services.AddHostedService<Worker>();
})
.ConfigureLogging(logging =>
{
logging.ClearProviders();
logging.SetMinimumLevel(LogLevel.Trace);
})
.UseNLog();</code></span></span>
您还需要通过程序包管理器添加Microsoft.Extensions.Hosting.WindowsServices程序包。
上面的代码允许代码自动登录到datatabse并作为Windows服务运行该应用程序。
现在,我们需要更改Worker.cs实际上执行代码的位置:
<span style="color:#929292"><span style="color:#1e1e1e"><code>private readonly ILogger<Worker> _logger;
public Worker(ILogger<Worker> logger)
{
_logger = logger;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
_logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
await Task.Delay(1000, stoppingToken);
}
}</code></span></span>
在ExecuteAsync内部,您可以放置任何需要执行任务并使用await Task.Delay控制运行方式的代码。