Skip to content

Commit f5fe9bd

Browse files
author
Igor Evdokimov
committed
- nlog config
1 parent 1b60b38 commit f5fe9bd

File tree

7 files changed

+172
-68
lines changed

7 files changed

+172
-68
lines changed

Botticelli.Framework/Botticelli.Framework.csproj

Lines changed: 26 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -13,35 +13,42 @@
1313
</PropertyGroup>
1414

1515
<ItemGroup>
16-
<Compile Remove="Handlers\**"/>
17-
<Compile Remove="HostedService\**"/>
18-
<EmbeddedResource Remove="Handlers\**"/>
19-
<EmbeddedResource Remove="HostedService\**"/>
20-
<None Remove="Handlers\**"/>
21-
<None Remove="HostedService\**"/>
16+
<Compile Remove="Handlers\**" />
17+
<Compile Remove="HostedService\**" />
18+
<EmbeddedResource Remove="Handlers\**" />
19+
<EmbeddedResource Remove="HostedService\**" />
20+
<None Remove="Handlers\**" />
21+
<None Remove="HostedService\**" />
2222
</ItemGroup>
2323

2424
<ItemGroup>
25-
<ProjectReference Include="..\BotDataSecureStorage\BotDataSecureStorage.csproj"/>
26-
<ProjectReference Include="..\Botticelli.Bot.Interfaces\Botticelli.Bot.Interfaces.csproj"/>
27-
<ProjectReference Include="..\Botticelli.Bot.Utils\Botticelli.Bot.Utils.csproj"/>
28-
<ProjectReference Include="..\Botticelli.Client.Analytics\Botticelli.Client.Analytics.csproj"/>
29-
<ProjectReference Include="..\Botticelli.Framework.Common\Botticelli.Framework.Events.csproj"/>
30-
<ProjectReference Include="..\Botticelli.Interfaces\Botticelli.Interfaces.csproj"/>
31-
<ProjectReference Include="..\Botticelli.Shared\Botticelli.Shared.csproj"/>
25+
<ProjectReference Include="..\BotDataSecureStorage\BotDataSecureStorage.csproj" />
26+
<ProjectReference Include="..\Botticelli.Bot.Interfaces\Botticelli.Bot.Interfaces.csproj" />
27+
<ProjectReference Include="..\Botticelli.Bot.Utils\Botticelli.Bot.Utils.csproj" />
28+
<ProjectReference Include="..\Botticelli.Client.Analytics\Botticelli.Client.Analytics.csproj" />
29+
<ProjectReference Include="..\Botticelli.Framework.Common\Botticelli.Framework.Events.csproj" />
30+
<ProjectReference Include="..\Botticelli.Interfaces\Botticelli.Interfaces.csproj" />
31+
<ProjectReference Include="..\Botticelli.Shared\Botticelli.Shared.csproj" />
3232
</ItemGroup>
3333
<ItemGroup>
34-
<PackageReference Include="MediatR" Version="12.1.1"/>
35-
<PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="7.0.0"/>
36-
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="7.0.0"/>
37-
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="7.0.0"/>
38-
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="7.0.0"/>
39-
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="7.0.1"/>
34+
<PackageReference Include="MediatR" Version="12.1.1" />
35+
<PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="7.0.0" />
36+
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="7.0.0" />
37+
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="7.0.0" />
38+
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="7.0.0" />
39+
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="7.0.1" />
4040
</ItemGroup>
4141
<ItemGroup>
4242
<None Include="..\logo.jpg">
4343
<Pack>True</Pack>
4444
<PackagePath>\</PackagePath>
4545
</None>
4646
</ItemGroup>
47+
<ItemGroup>
48+
<None Include="nlog.config">
49+
<ExcludeFromSingleFile>true</ExcludeFromSingleFile>
50+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
51+
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
52+
</None>
53+
</ItemGroup>
4754
</Project>

Botticelli.Framework/nlog.config

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
<?xml version="1.0" encoding="utf-8" ?>
2+
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
autoReload="true"
5+
internalLogLevel="Info"
6+
internalLogFile="c:\temp\internal-nlog-AspNetCore.txt">
7+
8+
<!-- enable asp.net core layout renderers -->
9+
<extensions>
10+
<add assembly="NLog.Web.AspNetCore"/>
11+
</extensions>
12+
13+
<!-- the targets to write to -->
14+
<targets>
15+
<!-- File Target for all log messages with basic details -->
16+
<target xsi:type="File" name="allfile" fileName="c:\temp\nlog-AspNetCore-all-${shortdate}.log"
17+
layout="${longdate}|${event-properties:item=EventId:whenEmpty=0}|${level:uppercase=true}|${logger}|${message} ${exception:format=tostring}" />
18+
19+
<!-- File Target for own log messages with extra web details using some ASP.NET core renderers -->
20+
<target xsi:type="File" name="ownFile-web" fileName="c:\temp\nlog-AspNetCore-own-${shortdate}.log"
21+
layout="${longdate}|${event-properties:item=EventId:whenEmpty=0}|${level:uppercase=true}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}" />
22+
23+
<!--Console Target for hosting lifetime messages to improve Docker / Visual Studio startup detection -->
24+
<target xsi:type="Console" name="lifetimeConsole" layout="${MicrosoftConsoleLayout}" />
25+
</targets>
26+
27+
<!-- rules to map from logger name to target -->
28+
<rules>
29+
<!--All logs, including from Microsoft-->
30+
<logger name="*" minlevel="Trace" writeTo="allfile" />
31+
32+
<!--Output hosting lifetime messages to console target for faster startup detection -->
33+
<logger name="Microsoft.Hosting.Lifetime" minlevel="Info" writeTo="lifetimeConsole, ownFile-web" final="true" />
34+
35+
<!--Skip non-critical Microsoft logs and so log only own logs (BlackHole) -->
36+
<logger name="Microsoft.*" maxlevel="Info" final="true" />
37+
<logger name="System.Net.Http.*" maxlevel="Info" final="true" />
38+
39+
<logger name="*" minlevel="Trace" writeTo="ownFile-web" />
40+
</rules>
41+
</nlog>

Botticelli/Botticelli.Server.csproj

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -18,42 +18,46 @@
1818
</PropertyGroup>
1919

2020
<ItemGroup>
21-
<Content Remove="appsettings.json"/>
21+
<Content Remove="appsettings.json" />
2222
</ItemGroup>
2323

2424
<ItemGroup>
2525
<None Include="..\logo.jpg">
2626
<Pack>True</Pack>
2727
<PackagePath>\</PackagePath>
2828
</None>
29+
<Content Remove="nlog.config" />
30+
<None Include="nlog.config" />
2931
</ItemGroup>
3032

3133
<ItemGroup>
32-
<PackageReference Include="FluentEmail.MailKit" Version="3.0.2"/>
33-
<PackageReference Include="FluentEmail.Smtp" Version="3.0.2"/>
34-
<PackageReference Include="Flurl" Version="3.0.7"/>
35-
<PackageReference Include="Mapster" Version="7.4.0"/>
36-
<PackageReference Include="Microsoft.AspNetCore.ApiAuthorization.IdentityServer" Version="7.0.13"/>
37-
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="7.0.13"/>
38-
<PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="7.0.13"/>
34+
<PackageReference Include="FluentEmail.MailKit" Version="3.0.2" />
35+
<PackageReference Include="FluentEmail.Smtp" Version="3.0.2" />
36+
<PackageReference Include="Flurl" Version="3.0.7" />
37+
<PackageReference Include="Mapster" Version="7.4.0" />
38+
<PackageReference Include="Microsoft.AspNetCore.ApiAuthorization.IdentityServer" Version="7.0.13" />
39+
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="7.0.13" />
40+
<PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="7.0.13" />
3941
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="7.0.13">
4042
<PrivateAssets>all</PrivateAssets>
4143
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
4244
</PackageReference>
43-
<PackageReference Include="Microsoft.Extensions.Identity.Core" Version="7.0.13"/>
44-
<PackageReference Include="PasswordGenerator" Version="2.1.0"/>
45-
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.5.0"/>
45+
<PackageReference Include="Microsoft.Extensions.Identity.Core" Version="7.0.13" />
46+
<PackageReference Include="NLog" Version="5.2.7" />
47+
<PackageReference Include="NLog.Web.AspNetCore" Version="5.3.5" />
48+
<PackageReference Include="PasswordGenerator" Version="2.1.0" />
49+
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.5.0" />
4650
</ItemGroup>
4751

4852
<ItemGroup>
49-
<ProjectReference Include="..\BotDataSecureStorage\BotDataSecureStorage.csproj"/>
50-
<ProjectReference Include="..\Botticelli.Server.Data.Entities\Botticelli.Server.Data.Entities.csproj"/>
51-
<ProjectReference Include="..\Botticelli.Server.Data\Botticelli.Server.Data.csproj"/>
52-
<ProjectReference Include="..\Botticelli.Server.Models\Botticelli.Server.Models.csproj"/>
53+
<ProjectReference Include="..\BotDataSecureStorage\BotDataSecureStorage.csproj" />
54+
<ProjectReference Include="..\Botticelli.Server.Data.Entities\Botticelli.Server.Data.Entities.csproj" />
55+
<ProjectReference Include="..\Botticelli.Server.Data\Botticelli.Server.Data.csproj" />
56+
<ProjectReference Include="..\Botticelli.Server.Models\Botticelli.Server.Models.csproj" />
5357
</ItemGroup>
5458

5559
<ItemGroup>
56-
<Resource Include="appsettings.json"/>
60+
<Resource Include="appsettings.json" />
5761
</ItemGroup>
5862

5963
<ItemGroup>

Botticelli/Program.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
using Microsoft.EntityFrameworkCore;
1616
using Microsoft.IdentityModel.Tokens;
1717
using Microsoft.OpenApi.Models;
18+
using NLog.Extensions.Logging;
1819

1920
var builder = WebApplication.CreateBuilder(args);
2021

@@ -82,6 +83,7 @@
8283

8384

8485
builder.Services
86+
.AddLogging(cfg => cfg.AddNLog())
8587
.AddScoped<IBotManagementService, BotManagementService>()
8688
.AddScoped<IBotStatusDataService, BotStatusDataService>()
8789
.AddSingleton(new SecureStorage(secureStorageSettings))
Lines changed: 1 addition & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,6 @@
1-
using Botticelli.Server.Settings;
2-
using FluentEmail.Core;
3-
using FluentEmail.Core.Interfaces;
4-
5-
namespace Botticelli.Server.Services.Auth;
1+
namespace Botticelli.Server.Services.Auth;
62

73
public interface IPasswordSender
84
{
95
public Task SendPassword(string email, string password, CancellationToken ct);
10-
}
11-
12-
public class PasswordSender : IPasswordSender
13-
{
14-
private readonly ISender _fluentEmail;
15-
private readonly ServerSettings _serverSettings;
16-
17-
public PasswordSender(ISender fluentEmail, ServerSettings serverSettings)
18-
{
19-
_fluentEmail = fluentEmail;
20-
_serverSettings = serverSettings;
21-
}
22-
23-
public async Task SendPassword(string email, string password, CancellationToken ct)
24-
{
25-
var message = Email.From(_serverSettings.ServerEmail, "BotticelliBots Admin Service")
26-
.To(email)
27-
.Subject("BotticelliBots user credentials")
28-
.Body($"Your login/password: {email}/{password}");
29-
30-
if (ct.CanBeCanceled && ct.IsCancellationRequested)
31-
return;
32-
33-
var sendResult = await _fluentEmail.SendAsync(message, ct);
34-
35-
if (!sendResult.Successful)
36-
throw new InvalidOperationException($"Sending mail errors: {string.Join(',', sendResult.ErrorMessages)}");
37-
}
386
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
using Botticelli.Server.Settings;
2+
using FluentEmail.Core;
3+
using FluentEmail.Core.Interfaces;
4+
5+
namespace Botticelli.Server.Services.Auth;
6+
7+
public class PasswordSender : IPasswordSender
8+
{
9+
private readonly ISender _fluentEmail;
10+
private readonly ILogger<PasswordSender> _logger;
11+
private readonly ServerSettings _serverSettings;
12+
13+
public PasswordSender(ISender fluentEmail, ServerSettings serverSettings, ILogger<PasswordSender> logger)
14+
{
15+
_fluentEmail = fluentEmail;
16+
_serverSettings = serverSettings;
17+
_logger = logger;
18+
}
19+
20+
public async Task SendPassword(string email, string password, CancellationToken ct)
21+
{
22+
_logger.LogInformation($"Sending a password message to : {email}");
23+
var message = Email.From(_serverSettings.ServerEmail, "BotticelliBots Admin Service")
24+
.To(email)
25+
.Subject("BotticelliBots user credentials")
26+
.Body($"Your login/password: {email} / {password}");
27+
28+
if (ct.CanBeCanceled && ct.IsCancellationRequested)
29+
return;
30+
31+
var sendResult = await _fluentEmail.SendAsync(message, ct);
32+
33+
if (!sendResult.Successful)
34+
{
35+
_logger.LogError($"Sending a password message to : {email} error", args: sendResult.ErrorMessages);
36+
throw new InvalidOperationException($"Sending mail errors: {string.Join(',', sendResult.ErrorMessages)}");
37+
}
38+
39+
_logger.LogInformation($"Sending a password message to : {email} - OK");
40+
}
41+
}

Botticelli/nlog.config

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
<?xml version="1.0" encoding="utf-8" ?>
2+
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
autoReload="true"
5+
internalLogLevel="Info"
6+
internalLogFile="c:\temp\internal-nlog-AspNetCore.txt">
7+
8+
<!-- enable asp.net core layout renderers -->
9+
<extensions>
10+
<add assembly="NLog.Web.AspNetCore"/>
11+
</extensions>
12+
13+
<!-- the targets to write to -->
14+
<targets>
15+
<!-- File Target for all log messages with basic details -->
16+
<target xsi:type="File" name="allfile" fileName="c:\temp\nlog-AspNetCore-all-${shortdate}.log"
17+
layout="${longdate}|${event-properties:item=EventId:whenEmpty=0}|${level:uppercase=true}|${logger}|${message} ${exception:format=tostring}" />
18+
19+
<!-- File Target for own log messages with extra web details using some ASP.NET core renderers -->
20+
<target xsi:type="File" name="ownFile-web" fileName="c:\temp\nlog-AspNetCore-own-${shortdate}.log"
21+
layout="${longdate}|${event-properties:item=EventId:whenEmpty=0}|${level:uppercase=true}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}" />
22+
23+
<!--Console Target for hosting lifetime messages to improve Docker / Visual Studio startup detection -->
24+
<target xsi:type="Console" name="lifetimeConsole" layout="${MicrosoftConsoleLayout}" />
25+
</targets>
26+
27+
<!-- rules to map from logger name to target -->
28+
<rules>
29+
<!--All logs, including from Microsoft-->
30+
<logger name="*" minlevel="Trace" writeTo="allfile" />
31+
32+
<!--Output hosting lifetime messages to console target for faster startup detection -->
33+
<logger name="Microsoft.Hosting.Lifetime" minlevel="Info" writeTo="lifetimeConsole, ownFile-web" final="true" />
34+
35+
<!--Skip non-critical Microsoft logs and so log only own logs (BlackHole) -->
36+
<logger name="Microsoft.*" maxlevel="Info" final="true" />
37+
<logger name="System.Net.Http.*" maxlevel="Info" final="true" />
38+
39+
<logger name="*" minlevel="Trace" writeTo="ownFile-web" />
40+
</rules>
41+
</nlog>

0 commit comments

Comments
 (0)