Add filtering and timing
This commit is contained in:
parent
6b1e193c90
commit
3bf3220beb
@ -12,7 +12,9 @@
|
|||||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
<LangVersion>14.0</LangVersion>
|
<LangVersion>14.0</LangVersion>
|
||||||
<Copyright>Copyright 2003..2025 Marc Hernandez</Copyright>
|
<Copyright>Copyright 2003..2025 Marc Hernandez</Copyright>
|
||||||
<Description>A base set of </Description>
|
<Description>A base set of functionality</Description>
|
||||||
|
<SatelliteResourceLanguages>en</SatelliteResourceLanguages>
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
I Want to turn this on, but cant yet. Implementing nullability 1 file at a gime
|
I Want to turn this on, but cant yet. Implementing nullability 1 file at a gime
|
||||||
<Nullable>enable</Nullable>
|
<Nullable>enable</Nullable>
|
||||||
|
|||||||
@ -529,11 +529,29 @@ static public class log
|
|||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
public delegate bool FilterFn( LogEvent evt );
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static object s_lock = new object();
|
static object s_lock = new object();
|
||||||
static object s_lockTypeCallback = new object();
|
static object s_lockTypeCallback = new object();
|
||||||
static ImmutableDictionary<LogType, Action<LogEvent>> s_callbacks = ImmutableDictionary<LogType, Action<LogEvent>>.Empty;
|
static ImmutableDictionary<LogType, Action<LogEvent>> s_callbacks = ImmutableDictionary<LogType, Action<LogEvent>>.Empty;
|
||||||
|
|
||||||
|
//static ConcurrentDictionary<string, List<FilterFn>> s_filters = new();
|
||||||
|
|
||||||
|
static public void addFilter( string name, FilterFn filter )
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
s_filters.AddOrUpdate( name,
|
||||||
|
( k ) => new List<FilterFn> { filter },
|
||||||
|
( k, v ) => {
|
||||||
|
v.Add( filter );
|
||||||
|
return v;
|
||||||
|
} );
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
[StackTraceHidden]
|
[StackTraceHidden]
|
||||||
static public void addDirectCallback( LogType logType, Action<LogEvent> callback )
|
static public void addDirectCallback( LogType logType, Action<LogEvent> callback )
|
||||||
{
|
{
|
||||||
@ -681,6 +699,27 @@ static public class log
|
|||||||
// automatically finish when s_events.CompleteAdding() is called from another thread.
|
// automatically finish when s_events.CompleteAdding() is called from another thread.
|
||||||
foreach( var evt in s_events.GetConsumingEnumerable() )
|
foreach( var evt in s_events.GetConsumingEnumerable() )
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
|
// Apply filters
|
||||||
|
var cat = evt.Cat;
|
||||||
|
var blocked = false;
|
||||||
|
if( s_filters.TryGetValue( cat, out var filterList ) )
|
||||||
|
{
|
||||||
|
foreach( var filter in filterList )
|
||||||
|
{
|
||||||
|
if( !filter( evt ) )
|
||||||
|
{
|
||||||
|
blocked = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( blocked )
|
||||||
|
{
|
||||||
|
continue; // Skip this event
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//*/
|
||||||
writeToAll( evt );
|
writeToAll( evt );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -945,6 +984,7 @@ static public class log
|
|||||||
{
|
{
|
||||||
var trimmedLine = line.Trim( (char)0 );
|
var trimmedLine = line.Trim( (char)0 );
|
||||||
s_writer?.WriteLine( trimmedLine );
|
s_writer?.WriteLine( trimmedLine );
|
||||||
|
s_writer?.Flush();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
81
util/Exec.cs
Normal file
81
util/Exec.cs
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
using System.Diagnostics;
|
||||||
|
|
||||||
|
namespace lib;
|
||||||
|
|
||||||
|
public readonly ref struct Defer
|
||||||
|
{
|
||||||
|
private readonly Action _onDispose;
|
||||||
|
|
||||||
|
public Defer( Action onDispose )
|
||||||
|
{
|
||||||
|
_onDispose = onDispose;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Dispose()
|
||||||
|
{
|
||||||
|
_onDispose?.Invoke();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Defer Do( Action action ) => new Defer( action );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public readonly ref struct Timed
|
||||||
|
{
|
||||||
|
private readonly long _startTimestamp;
|
||||||
|
private readonly Action<TimeSpan> _onDispose;
|
||||||
|
|
||||||
|
public Timed( Action<TimeSpan> onDispose )
|
||||||
|
{
|
||||||
|
_onDispose = onDispose;
|
||||||
|
_startTimestamp = Stopwatch.GetTimestamp();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Dispose()
|
||||||
|
{
|
||||||
|
// Calculate elapsed ticks
|
||||||
|
long endTimestamp = Stopwatch.GetTimestamp();
|
||||||
|
long elapsedTicks = endTimestamp - _startTimestamp;
|
||||||
|
|
||||||
|
// Convert to TimeSpan based on system timer frequency
|
||||||
|
// (Standard formula for high-resolution timing)
|
||||||
|
double seconds = (double)elapsedTicks / Stopwatch.Frequency;
|
||||||
|
var elapsed = TimeSpan.FromSeconds( seconds );
|
||||||
|
|
||||||
|
_onDispose?.Invoke( elapsed );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Optional: Allow peeking at the time without stopping
|
||||||
|
public TimeSpan Elapsed
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
long current = Stopwatch.GetTimestamp();
|
||||||
|
return TimeSpan.FromSeconds( (double)( current - _startTimestamp ) / Stopwatch.Frequency );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Timed Do( Action<TimeSpan> action ) => new Timed( action );
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static public class Exec
|
||||||
|
{
|
||||||
|
static public void RunIf( bool condition, Action func )
|
||||||
|
{
|
||||||
|
if( condition )
|
||||||
|
func();
|
||||||
|
}
|
||||||
|
|
||||||
|
static public T RunIf<T>( bool condition, Func<T> func, T ret = default! )
|
||||||
|
{
|
||||||
|
if( condition )
|
||||||
|
return func();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user