Skip to content

Commit c776237

Browse files
authored
Merge pull request #9 from ernado-x/8-logging-configuration
2 parents c435c4c + e1481ba commit c776237

17 files changed

+312
-81
lines changed

README.md

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,10 @@ You can configure Telegram logging provider by code or by config file:
2525

2626
### Code
2727
```csharp
28-
var options = new TelegramLoggerOptions
28+
var options = new TelegramLoggerOptions(LogLevel.Information)
2929
{
3030
AccessToken = "1234567890:AAAaaAAaa_AaAAaa-AAaAAAaAAaAaAaAAAA",
3131
ChatId = "-0000000000000",
32-
LogLevel = LogLevel.Information,
3332
Source = "Human Readable Project Name"
3433
};
3534

@@ -54,7 +53,10 @@ builder
5453
"Microsoft.Hosting.Lifetime": "Information"
5554
},
5655
"Telegram": {
57-
"LogLevel": "Warning",
56+
"LogLevel": {
57+
"Default": "Error",
58+
"WebApp.Controllers": "Warning"
59+
},
5860
"AccessToken": "1234567890:AAAaaAAaa_AaAAaa-AAaAAAaAAaAaAaAAAA",
5961
"ChatId": "1234567890",
6062
"Source": "Human Readable Project Name"
@@ -78,3 +80,25 @@ public static IHostBuilder CreateHostBuilder(string[] args) =>
7880
})
7981
.ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); });
8082
````
83+
84+
### Use custom log writer
85+
Now developers can use their own implementation for writing data to Telegram. Custom writer should implement _ILogWriter_ interface:
86+
87+
``` cs
88+
var customLogWriter = new CustomLogWriter();
89+
logBuilder.AddTelegram(options, customLogWriter);
90+
```
91+
92+
### Use custom message formatter
93+
For implement custom message formatting _ITelegramMessageFormatter_ can be used now.
94+
95+
``` cs
96+
private ITelegramMessageFormatter CreateFormatter(string name)
97+
{
98+
return new CustomTelegramMessageFormatter(name);
99+
}
100+
101+
logBuilder.AddTelegram(options, CreateFormatter);
102+
```
103+
104+
For using custom message formatter delegate Func<string, ITelegramMessageFormatter> should be passed to extensions method AddTelegram. Delegate should be used because formatter needs to know which category is used for rendering the message.

examples/ConsoleApp/Program.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,10 @@ public class AnotherExampleClass
1717

1818
static void Main(string[] args)
1919
{
20-
var options = new TelegramLoggerOptions
20+
var options = new TelegramLoggerOptions(LogLevel.Information)
2121
{
2222
AccessToken = "1234567890:AAAaaAAaa_AaAAaa-AAaAAAaAAaAaAaAAAA",
2323
ChatId = "-0000000000000",
24-
LogLevel = LogLevel.Information,
2524
Source = "TEST APP",
2625
UseEmoji = true
2726
};

examples/WebApp.NextVersion/Controllers/WeatherForecastController.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,12 @@ public IEnumerable<WeatherForecast> Get()
2424
var rng = new Random();
2525
var temperatureC = rng.Next(-20, 55);
2626

27-
_logger.LogInformation($"Temperature: {temperatureC}");
27+
_logger.LogTrace($"Trace Temperature: {temperatureC}");
28+
_logger.LogDebug($"Debug Temperature: {temperatureC}");
29+
_logger.LogInformation($"Information Temperature: {temperatureC}");
30+
_logger.LogWarning($"Warning Temperature: {temperatureC}");
31+
_logger.LogError($"Error Temperature: {temperatureC}");
32+
_logger.LogCritical($"Critical Temperature: {temperatureC}");
2833

2934
return Enumerable.Range(1, 5).Select(index => new WeatherForecast
3035
{

examples/WebApp.NextVersion/appsettings.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,14 @@
55
"Microsoft.AspNetCore": "Warning"
66
},
77
"Telegram": {
8-
"LogLevel": "Information",
8+
"LogLevel": {
9+
"Default": "Error"
10+
},
911
"AccessToken": "1234567890:AAAaaAAaa_AaAAaa-AAaAAAaAAaAaAaAAAA",
1012
"ChatId": "-0000000000000",
1113
"UseEmoji": "true",
1214
"Source": "WebApp.NextVersion"
1315
}
14-
},
16+
},
1517
"AllowedHosts": "*"
1618
}

examples/WebApp/Controllers/WeatherForecastController.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,12 @@ public IEnumerable<WeatherForecast> Get()
3131
var rng = new Random();
3232
var temperatureC = rng.Next(-20, 55);
3333

34-
_logger.LogInformation($"Temperature: {temperatureC}");
34+
_logger.LogTrace($"Trace Temperature: {temperatureC}");
35+
_logger.LogDebug($"Debug Temperature: {temperatureC}");
36+
_logger.LogInformation($"Information Temperature: {temperatureC}");
37+
_logger.LogWarning($"Warning Temperature: {temperatureC}");
38+
_logger.LogError($"Error Temperature: {temperatureC}");
39+
_logger.LogCritical($"Critical Temperature: {temperatureC}");
3540

3641
return Enumerable.Range(1, 5).Select(index => new WeatherForecast
3742
{

examples/WebApp/appsettings.json

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,14 @@
66
"Microsoft.Hosting.Lifetime": "Information"
77
},
88
"Telegram": {
9-
"LogLevel": "Information",
9+
"LogLevel": {
10+
"Default": "Error",
11+
"WebApp.Controllers": "Warning"
12+
},
1013
"AccessToken": "1234567890:AAAaaAAaa_AaAAaa-AAaAAAaAAaAaAaAAAA",
1114
"ChatId": "-0000000000000",
1215
"UseEmoji": "true",
13-
"Source": "WebApp.NextVersion"
16+
"Source": "WebApp"
1417
}
1518
},
1619
"AllowedHosts": "*"
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
using Microsoft.Extensions.Logging;
2+
3+
namespace X.Extensions.Logging.Telegram;
4+
5+
public interface ILogLevelChecker
6+
{
7+
bool IsEnabled(LogLevel logLevel);
8+
}
9+
10+
public class DefaultLogLevelChecker : ILogLevelChecker
11+
{
12+
public bool IsEnabled(LogLevel logLevel) => logLevel != LogLevel.None;
13+
}

src/X.Extensions.Logging.Telegram/TelegramLoggerProcessor.cs renamed to src/X.Extensions.Logging.Telegram/LogQueueProcessor.cs

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,27 +2,34 @@
22
using System.Collections.Concurrent;
33
using System.Threading;
44
using System.Threading.Tasks;
5+
using JetBrains.Annotations;
56

67
namespace X.Extensions.Logging.Telegram;
78

8-
internal class TelegramLoggerProcessor : IDisposable
9+
[PublicAPI]
10+
public interface ILogQueueProcessor : IDisposable
11+
{
12+
void EnqueueMessage(string message);
13+
}
14+
15+
internal class LogQueueProcessor : ILogQueueProcessor
916
{
1017
private const int MaxQueuedMessages = 1024;
1118
private const int Timeout = 1500;
1219

1320
private readonly BlockingCollection<string> _queue = new(MaxQueuedMessages);
1421
private readonly Thread _thread;
15-
private readonly ITelegramWriter _writer;
22+
private readonly ILogWriter _writer;
1623

17-
public TelegramLoggerProcessor(TelegramLoggerOptions options)
24+
public LogQueueProcessor(ILogWriter logWriter)
1825
{
19-
_writer = new TelegramWriter(options.AccessToken, options.ChatId);
26+
_writer = logWriter;
2027

21-
// Start Telegram message queue process
28+
// Start message queue thread
2229
_thread = new Thread(async () => { await ProcessLogQueue(); })
2330
{
2431
IsBackground = true,
25-
Name = "Telegram logger queue process thread",
32+
Name = $"{nameof(LogQueueProcessor)} thread",
2633
};
2734

2835
_thread.Start();
@@ -39,6 +46,7 @@ public void EnqueueMessage(string message)
3946
}
4047
catch
4148
{
49+
// ignored
4250
}
4351
}
4452

@@ -69,6 +77,7 @@ private async Task ProcessLogQueue()
6977
}
7078
catch
7179
{
80+
// ignored
7281
}
7382
}
7483
}
@@ -83,6 +92,7 @@ public void Dispose()
8392
}
8493
catch
8594
{
95+
// ignored
8696
}
8797
}
8898
}

src/X.Extensions.Logging.Telegram/TelegramWriter.cs renamed to src/X.Extensions.Logging.Telegram/TelegramLogWriter.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,22 +6,22 @@
66
namespace X.Extensions.Logging.Telegram;
77

88
[PublicAPI]
9-
public interface ITelegramWriter
9+
public interface ILogWriter
1010
{
1111
Task Write(string message);
1212
}
1313

14-
public class TelegramWriter : ITelegramWriter
14+
public class TelegramLogWriter : ILogWriter
1515
{
1616
private readonly string _chatId;
1717
private readonly ITelegramBotClient _client;
1818

19-
public TelegramWriter(string accessToken, string chatId)
19+
public TelegramLogWriter(string accessToken, string chatId)
2020
: this(new TelegramBotClient(accessToken), chatId)
2121
{
2222
}
2323

24-
public TelegramWriter(ITelegramBotClient client, string chatId)
24+
public TelegramLogWriter(ITelegramBotClient client, string chatId)
2525
{
2626
_chatId = chatId;
2727
_client = client;
Lines changed: 7 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,25 @@
11
using System;
2-
using System.Linq;
32
using JetBrains.Annotations;
43
using Microsoft.Extensions.Logging;
54

65
namespace X.Extensions.Logging.Telegram;
76

87
public class TelegramLogger : ILogger
98
{
10-
private readonly TelegramLoggerProcessor _queueProcessor;
11-
private readonly string _category;
9+
private readonly ILogLevelChecker _logLevelChecker;
10+
private readonly ILogQueueProcessor _queueProcessor;
1211
private readonly ITelegramMessageFormatter _formatter;
1312

1413
internal TelegramLogger(
15-
string name,
1614
TelegramLoggerOptions options,
17-
TelegramLoggerProcessor loggerProcessor,
18-
string category)
19-
: this(options, loggerProcessor, category, new TelegramMessageFormatter(options, name))
20-
{
21-
}
22-
23-
internal TelegramLogger(
24-
TelegramLoggerOptions options,
25-
TelegramLoggerProcessor loggerProcessor,
26-
string category,
15+
ILogLevelChecker logLevelChecker,
16+
ILogQueueProcessor loggerProcessor,
2717
ITelegramMessageFormatter formatter)
2818
{
19+
Options = options ?? throw new ArgumentNullException(nameof(options));
20+
_logLevelChecker = logLevelChecker;
2921
_queueProcessor = loggerProcessor;
30-
_category = category;
3122
_formatter = formatter;
32-
33-
Options = options ?? throw new ArgumentNullException(nameof(options));
3423
}
3524

3625
[PublicAPI]
@@ -58,9 +47,7 @@ public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Except
5847
_queueProcessor.EnqueueMessage(message);
5948
}
6049

61-
public bool IsEnabled(LogLevel logLevel) =>
62-
logLevel > Options.LogLevel ||
63-
logLevel == Options.LogLevel && (Options.Categories == null || Options.Categories.Contains(_category));
50+
public bool IsEnabled(LogLevel logLevel) => _logLevelChecker.IsEnabled(logLevel);
6451

6552
public IDisposable BeginScope<TState>(TState state) => default;
6653
}

0 commit comments

Comments
 (0)