Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions src/Application/Common/Configurations/PrivacySettings.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
namespace CleanArchitecture.Blazor.Application.Common.Configurations;

public class PrivacySettings
{
public const string Privacy = "Privacy";

public bool LogClientIpAddresses { get; set; } = true;
public bool LogClientAgents { get; set; } = true;
}
4 changes: 4 additions & 0 deletions src/Blazor.Server.UI/appsettings.json
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,10 @@
"MailPickupDirectory": "",
"SocketOptions": null
},
"Privacy" : {
"LogClientIpAddresses": true,
"LogClientAgents" : true
},
"Serilog": {
"MinimumLevel": {
"Default": "Debug",
Expand Down
71 changes: 44 additions & 27 deletions src/Infrastructure/Extensions/SerilogExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,24 +32,28 @@ public static void RegisterSerilog(this WebApplicationBuilder builder)
.MinimumLevel.Override("Hangfire.Processing.BackgroundExecution", LogEventLevel.Error)
.Enrich.FromLogContext()
.Enrich.WithUtcTime()
.Enrich.WithClientIp()
.Enrich.WithClientAgent()
.WriteTo.Async(wt => wt.File("./log/log-.txt", rollingInterval: RollingInterval.Day))
.WriteTo.Async(wt => wt.Console(outputTemplate: "[{Timestamp:HH:mm:ss} {Level:u3} {ClientIp}] {Message:lj}{NewLine}{Exception}"))
.WriteToDatabase(context.Configuration)
.WriteTo.Async(wt =>
wt.Console(
outputTemplate:
"[{Timestamp:HH:mm:ss} {Level:u3} {ClientIp}] {Message:lj}{NewLine}{Exception}"))
.ApplyConfigPreferences(context.Configuration)
);
}

private static void WriteToDatabase(this LoggerConfiguration serilogConfig, IConfiguration configuration)
private static void ApplyConfigPreferences(this LoggerConfiguration serilogConfig, IConfiguration configuration)
{
if (configuration.GetValue<bool>("UseInMemoryDatabase"))
{
return;
}
EnrichWithClientInfo(serilogConfig, configuration);
WriteToDatabase(serilogConfig, configuration);
}

private static void WriteToDatabase(LoggerConfiguration serilogConfig, IConfiguration configuration)
{
if (configuration.GetValue<bool>("UseInMemoryDatabase")) return;

string? dbProvider =
var dbProvider =
configuration.GetValue<string>($"{nameof(DatabaseSettings)}:{nameof(DatabaseSettings.DBProvider)}");
string? connectionString =
var connectionString =
configuration.GetValue<string>($"{nameof(DatabaseSettings)}:{nameof(DatabaseSettings.ConnectionString)}");
switch (dbProvider)
{
Expand All @@ -65,12 +69,18 @@ private static void WriteToDatabase(this LoggerConfiguration serilogConfig, ICon
}
}

private static void EnrichWithClientInfo(LoggerConfiguration serilogConfig, IConfiguration configuration)
{
var privacySettings = configuration.GetRequiredSection(PrivacySettings.Privacy).Get<PrivacySettings>();

if (privacySettings == null) return;
if (privacySettings.LogClientIpAddresses) serilogConfig.Enrich.WithClientIp();
if (privacySettings.LogClientAgents) serilogConfig.Enrich.WithClientAgent();
}

private static void WriteToSqlServer(LoggerConfiguration serilogConfig, string? connectionString)
{
if (string.IsNullOrEmpty(connectionString))
{
return;
}
if (string.IsNullOrEmpty(connectionString)) return;

MSSqlServerSinkOptions sinkOpts = new()
{
Expand All @@ -97,9 +107,19 @@ private static void WriteToSqlServer(LoggerConfiguration serilogConfig, string?
},
AdditionalColumns = new Collection<SqlColumn>
{
new() { ColumnName = "ClientIP", PropertyName = "ClientIp", DataType = SqlDbType.NVarChar, DataLength = 64 },
new() { ColumnName = "UserName", PropertyName = "UserName", DataType = SqlDbType.NVarChar, DataLength = 64 },
new() { ColumnName = "ClientAgent", PropertyName = "ClientAgent", DataType = SqlDbType.NVarChar, DataLength = -1 }
new()
{
ColumnName = "ClientIP", PropertyName = "ClientIp", DataType = SqlDbType.NVarChar, DataLength = 64
},
new()
{
ColumnName = "UserName", PropertyName = "UserName", DataType = SqlDbType.NVarChar, DataLength = 64
},
new()
{
ColumnName = "ClientAgent", PropertyName = "ClientAgent", DataType = SqlDbType.NVarChar,
DataLength = -1
}
},
TimeStamp = { ConvertToUtc = true, ColumnName = "TimeStamp" },
LogEvent = { DataLength = 2048 }
Expand All @@ -116,10 +136,7 @@ private static void WriteToSqlServer(LoggerConfiguration serilogConfig, string?

private static void WriteToNpgsql(LoggerConfiguration serilogConfig, string? connectionString)
{
if (string.IsNullOrEmpty(connectionString))
{
return;
}
if (string.IsNullOrEmpty(connectionString)) return;

const string tableName = "Loggers";
//Used columns (Key is a column name)
Expand All @@ -135,7 +152,10 @@ private static void WriteToNpgsql(LoggerConfiguration serilogConfig, string? con
{ "LogEvent", new LogEventSerializedColumnWriter(NpgsqlDbType.Varchar) },
{ "UserName", new SinglePropertyColumnWriter("UserName", PropertyWriteMethod.Raw, NpgsqlDbType.Varchar) },
{ "ClientIP", new SinglePropertyColumnWriter("ClientIp", PropertyWriteMethod.Raw, NpgsqlDbType.Varchar) },
{ "ClientAgent", new SinglePropertyColumnWriter("ClientAgent", PropertyWriteMethod.ToString, NpgsqlDbType.Varchar) }
{
"ClientAgent",
new SinglePropertyColumnWriter("ClientAgent", PropertyWriteMethod.ToString, NpgsqlDbType.Varchar)
}
};
serilogConfig.WriteTo.Async(wt => wt.PostgreSQL(
connectionString,
Expand All @@ -150,10 +170,7 @@ private static void WriteToNpgsql(LoggerConfiguration serilogConfig, string? con

private static void WriteToSqLite(LoggerConfiguration serilogConfig, string? connectionString)
{
if (string.IsNullOrEmpty(connectionString))
{
return;
}
if (string.IsNullOrEmpty(connectionString)) return;

const string tableName = "Loggers";
serilogConfig.WriteTo.Async(wt => wt.SQLite(
Expand Down