Files
runner/src/Runner.Common/TraceManager.cs
T

90 lines
2.9 KiB
C#
Raw Normal View History

2023-06-02 21:47:59 +02:00
using System;
2019-10-10 00:52:42 -04:00
using System.Collections.Concurrent;
using System.Diagnostics;
using GitHub.DistributedTask.Logging;
using GitHub.Runner.Sdk;
namespace GitHub.Runner.Common
{
public interface ITraceManager : IDisposable
{
SourceSwitch Switch { get; }
Tracing this[string name] { get; }
}
public sealed class TraceManager : ITraceManager
{
2022-10-18 10:54:08 -04:00
private readonly ConcurrentDictionary<string, Tracing> _sources = new(StringComparer.OrdinalIgnoreCase);
2019-10-10 00:52:42 -04:00
private readonly HostTraceListener _hostTraceListener;
2022-12-06 16:16:00 +01:00
private readonly StdoutTraceListener _stdoutTraceListener;
2019-10-10 00:52:42 -04:00
private TraceSetting _traceSetting;
private ISecretMasker _secretMasker;
2022-12-06 16:16:00 +01:00
public TraceManager(HostTraceListener traceListener, StdoutTraceListener stdoutTraceListener, ISecretMasker secretMasker)
: this(traceListener, stdoutTraceListener, new TraceSetting(), secretMasker)
2019-10-10 00:52:42 -04:00
{
}
2022-12-06 16:16:00 +01:00
public TraceManager(HostTraceListener traceListener, StdoutTraceListener stdoutTraceListener, TraceSetting traceSetting, ISecretMasker secretMasker)
2019-10-10 00:52:42 -04:00
{
// Validate and store params.
ArgUtil.NotNull(traceListener, nameof(traceListener));
ArgUtil.NotNull(traceSetting, nameof(traceSetting));
ArgUtil.NotNull(secretMasker, nameof(secretMasker));
_hostTraceListener = traceListener;
2022-12-06 16:16:00 +01:00
_stdoutTraceListener = stdoutTraceListener;
2019-10-10 00:52:42 -04:00
_traceSetting = traceSetting;
_secretMasker = secretMasker;
Switch = new SourceSwitch("GitHubActionsRunnerSwitch")
{
Level = _traceSetting.DefaultTraceLevel.ToSourceLevels()
};
}
public SourceSwitch Switch { get; private set; }
public Tracing this[string name]
{
get
{
return _sources.GetOrAdd(name, key => CreateTraceSource(key));
}
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
private void Dispose(bool disposing)
{
if (disposing)
{
foreach (Tracing traceSource in _sources.Values)
{
traceSource.Dispose();
}
_sources.Clear();
}
}
private Tracing CreateTraceSource(string name)
{
SourceSwitch sourceSwitch = Switch;
TraceLevel sourceTraceLevel;
if (_traceSetting.DetailTraceSetting.TryGetValue(name, out sourceTraceLevel))
{
sourceSwitch = new SourceSwitch("GitHubActionsRunnerSubSwitch")
{
Level = sourceTraceLevel.ToSourceLevels()
};
}
2022-12-06 16:16:00 +01:00
return new Tracing(name, _secretMasker, sourceSwitch, _hostTraceListener, _stdoutTraceListener);
2019-10-10 00:52:42 -04:00
}
}
}