elsa-core/src/modules/Elsa.Diagnostics.ConsoleLogs/Services/ConsoleLineBuffer.cs
Sipke Schoorstra 43108c2e48
Add diagnostics console logs (#7462)
* feat: add diagnostics console logs

* test: avoid secret-like redaction fixtures

* fix: address console logs review feedback

* fix: harden console log capture lifecycle

* fix: report console log drop summaries

* fix: address diagnostics review cleanups
2026-05-18 02:16:46 +02:00

57 lines
1.4 KiB
C#

using System.Text;
using Microsoft.Extensions.Options;
namespace Elsa.Diagnostics.ConsoleLogs.Services;
public class ConsoleLineBuffer(IOptions<ConsoleLogsOptions> options)
{
private readonly StringBuilder _buffer = new();
private readonly ConsoleLogsOptions _options = options.Value;
private DateTimeOffset? _lastWriteAt;
public IReadOnlyCollection<string> Append(string value, DateTimeOffset now)
{
_lastWriteAt = now;
var lines = new List<string>();
foreach (var ch in value.Where(x => x != '\r'))
{
if (ch == '\n')
{
if (_buffer.Length > 0)
lines.Add(FlushBuffer());
continue;
}
_buffer.Append(ch);
if (_buffer.Length >= _options.MaxLineLength)
lines.Add(FlushBuffer());
}
return lines;
}
public string? FlushIfIdle(DateTimeOffset now)
{
if (_buffer.Length == 0 || _lastWriteAt == null)
return null;
return now - _lastWriteAt >= _options.IdleFlushTimeout ? FlushBuffer() : null;
}
public string? Flush()
{
return _buffer.Length == 0 ? null : FlushBuffer();
}
private string FlushBuffer()
{
var line = _buffer.ToString();
_buffer.Clear();
_lastWriteAt = null;
return line;
}
}