summaryrefslogtreecommitdiff
path: root/src/Agent.App/Logging/RollingFileLog.cs
blob: 8bdbbb428cca5ba85d888c9a320e2eee81afdb95 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
using System.Globalization;

namespace Agent.App.Logging;

public sealed class RollingFileLog : IDisposable
{
    private readonly RollingFileWriter _writer;
    private readonly int _minimumLevel;

    public RollingFileLog(string directory, long maxBytes, int retainedFiles, string minimumLevel = "information")
    {
        Directory.CreateDirectory(directory);
        _writer = new RollingFileWriter(Path.Combine(directory, "application.log"), maxBytes, retainedFiles);
        _minimumLevel = ParseLevel(minimumLevel);
    }

    public void Information(string message) => Write("INF", message);
    public void Operational(string message) => Write("INF", message, force: true);
    public void Warning(string message) => Write("WRN", message);
    public void Error(string message) => Write("ERR", message);
    public void Fatal(string message) => Write("FTL", message);

    private void Write(string level, string message, bool force = false)
    {
        if (!force && Level(level) < _minimumLevel) return;
        string line = string.Create(CultureInfo.InvariantCulture, $"{DateTimeOffset.UtcNow:O} [{level}] {message}");
        Console.Error.WriteLine(line);
        _writer.WriteLine(line);
    }

    private static int ParseLevel(string level) => level.ToLowerInvariant() switch
    {
        "information" or "info" => 0,
        "warning" or "warn" => 1,
        "error" => 2,
        "fatal" => 3,
        _ => throw new ArgumentException($"Unknown logging level '{level}'.", nameof(level))
    };

    private static int Level(string level) => level switch { "INF" => 0, "WRN" => 1, "ERR" => 2, "FTL" => 3, _ => 0 };

    public void Dispose()
    {
        _writer.Dispose();
    }
}