protected override void OnGroupOpen( IActivityLogGroup g ) { XmlWriter.WriteStartElement( g.MaskedGroupLevel.ToString() + "s" ); XmlWriter.WriteAttributeString( "Depth", g.Depth.ToString() ); XmlWriter.WriteAttributeString( "Level", g.GroupLevel.ToString() ); XmlWriter.WriteAttributeString( "Text", g.GroupText.ToString() ); }
public void OnOpenGroup(IActivityLogGroup group) { lock ( _buffer ) { _buffer.Append(_prefix).AppendFormat(">[{0}]{1}", group.GroupLevel, group.GroupText).AppendLine(); _prefix += " "; } }
public void OnGroupClosed( IActivityLogGroup group, IReadOnlyList<ActivityLogGroupConclusion> conclusions ) { lock( _buffer ) { _prefix = _prefix.Substring( 0, _prefix.Length - 1 ); _buffer.Append( _prefix ).AppendFormat( "<[Closed]{0}", group.GroupText ).AppendLine(); } }
public Entry( IActivityLogGroup d ) { Level = d.GroupLevel; Tags = d.GroupTags; Text = d.GroupText; Exception = d.Exception; LogTime = d.LogTime; }
public void OnOpenGroup( IActivityLogGroup group ) { if( group.MaskedGroupLevel >= LogLevel.Error ) { string s = DumpErrorText( group.LogTime, group.GroupText, group.MaskedGroupLevel, group.GroupTags, group.EnsureExceptionData() ); SystemActivityMonitor.HandleError( s ); } }
public void OnOpenGroup( IActivityLogGroup group ) { lock( _buffer ) { _buffer.Append( _prefix ).AppendFormat( ">[{0}]{1}", group.GroupLevel, group.GroupText ).AppendLine(); _prefix += " "; } }
protected override void OnGroupOpen( IActivityLogGroup g ) { Entries.Add( new Entry( g ) ); Writer.WriteLine(); Writer.Write( new String( '+', g.Depth ) ); Writer.Write( "{1} ({0})", g.MaskedGroupLevel, g.GroupText ); if( g.Exception != null ) Writer.Write( "Exception: " + g.Exception.Message ); if( WriteTags ) Writer.Write( "-[{0}]", g.GroupTags.ToString() ); }
void IActivityLoggerSink.OnGroupOpen(IActivityLogGroup g) { TextWriter w = _writer(); w.Write("{0}▪►-{1}: ", _prefix, g.GroupLevel.ToString()); _prefix += "▪ "; _prefixLevel = _prefix; w.WriteLine(g.GroupText.Replace(Environment.NewLine, Environment.NewLine + _prefixLevel)); }
void IActivityMonitorClient.OnOpenGroup(IActivityLogGroup group) { if (_file != null) { _file.UnicastWriteOpenGroup(group, this); ++_currentGroupDepth; _prevlogTime = group.Data.LogTime; _prevLogType = LogEntryType.OpenGroup; } }
void IActivityMonitorClient.OnGroupClosed(IActivityLogGroup group, IReadOnlyList <ActivityLogGroupConclusion> conclusions) { if (_curLevel != -1) { OnLeaveLevel((LogLevel)_curLevel); _curLevel = -1; } OnGroupClose(group, conclusions); }
/// <summary> /// Appends any group with level equal or above <see cref="LevelFilter"/> to <see cref="Entries"/>. /// </summary> /// <param name="group">Log group description.</param> protected override void OnOpenGroup(IActivityLogGroup group) { if ((int)group.GroupLevel >= (int)_filter) { _entries.Push(new Entry() { Level = group.GroupLevel, Text = group.GroupText, Exception = group.Exception }); } }
void IActivityMonitorClient.OnGroupClosed(IActivityLogGroup group, IReadOnlyList <ActivityLogGroupConclusion>?conclusions) { if (_file != null) { _file.UnicastWriteCloseGroup(group, conclusions, this); --_currentGroupDepth; _prevlogTime = group.CloseLogTime; _prevLogType = LogEntryType.CloseGroup; } }
void IActivityMonitorClient.OnOpenGroup(IActivityLogGroup group) { if (_curLevel != -1) { OnLeaveLevel((LogLevel)_curLevel); _curLevel = -1; } OnGroupOpen(group); }
public void OnOpenGroup(IActivityLogGroup group) { if (group.MaskedGroupLevel == LogLevel.Error) { _onError(); } else if (group.MaskedGroupLevel == LogLevel.Fatal) { _onFatal(); } }
void IActivityMonitorClient.OnGroupClosed(IActivityLogGroup group, IReadOnlyList <ActivityLogGroupConclusion> conclusions) { if (_curLevel != -1) { OnLeaveLevel((LogLevel)_curLevel); _curLevel = -1; } // Has the Group actually been opened? if (_openGroups.Count > 0 && _openGroups.Pop()) { OnGroupClose(group, conclusions); } }
void OnGroupClose(IActivityLogGroup g, IReadOnlyList <ActivityLogGroupConclusion> conclusions) { Writer.WriteLine(); Writer.Write(new String('-', g.Depth)); if (WriteConclusionTraits) { Writer.Write(String.Join(", ", conclusions.Select(c => c.Text + "-/[/" + c.Tag.ToString() + "/]/"))); } else { Writer.Write(String.Join(", ", conclusions.Select(c => c.Text))); } }
void IActivityMonitorClient.OnGroupClosed(IActivityLogGroup group, IReadOnlyList <ActivityLogGroupConclusion> conclusions) { var h = EnsureChannel(); if (h != null) { IMulticastLogEntry e = LogEntry.CreateMulticastCloseGroup(_monitorSource.UniqueId, _prevLogType, _prevlogTime, _currentGroupDepth, group.CloseLogTime, group.GroupLevel, conclusions); h.Handle(new GrandOutputEventInfo(e, _monitorSource.Topic)); --_currentGroupDepth; _prevlogTime = group.CloseLogTime; _prevLogType = LogEntryType.CloseGroup; } }
void IActivityMonitorClient.OnOpenGroup(IActivityLogGroup group) { var h = EnsureChannel(); if (h != null) { IMulticastLogEntry e = LogEntry.CreateMulticastOpenGroup(_monitorSource.UniqueId, _prevLogType, _prevlogTime, _currentGroupDepth, group.GroupText, group.LogTime, group.GroupLevel, group.FileName, group.LineNumber, group.GroupTags, group.EnsureExceptionData()); h.Handle(new GrandOutputEventInfo(e, _monitorSource.Topic)); ++_currentGroupDepth; _prevlogTime = group.LogTime; _prevLogType = LogEntryType.OpenGroup; } }
void IActivityMonitorClient.OnOpenGroup(IActivityLogGroup group) { if (_central.IsDisposed) { return; } Debug.Assert(_monitorSource != null, "Since we are called by the monitor..."); IMulticastLogEntry e = LogEntry.CreateMulticastOpenGroup(_central.GrandOutpuId, _monitorSource.UniqueId, _prevLogType, _prevlogTime, _currentGroupDepth, group.Data.Text, group.Data.LogTime, group.Data.Level, group.Data.FileName, group.Data.LineNumber, group.Data.Tags, group.Data.ExceptionData); _central.Sink.Handle(e); ++_currentGroupDepth; _prevlogTime = group.Data.LogTime; _prevLogType = LogEntryType.OpenGroup; }
/// <summary> /// Handles group conclusion. /// </summary> /// <param name="group">The closing group.</param> /// <param name="conclusions"> /// Mutable conclusions associated to the closing group. /// This can be null if no conclusions have been added yet. /// It is up to the first client that wants to add a conclusion to instantiate a new List object to carry the conclusions. /// </param> protected override void OnGroupClosing(IActivityLogGroup group, ref List <ActivityLogGroupConclusion> conclusions) { if (GenerateConclusion && _current != _root && _current.HasWarnOrError && (conclusions == null || !conclusions.Any(c => c.Tag == TagErrorCounter))) { if (conclusions == null) { conclusions = new List <ActivityLogGroupConclusion>(); } conclusions.Add(new ActivityLogGroupConclusion(TagErrorCounter, _current.ToString())); } }
/// <summary> /// Writes group conclusion and updates internally managed line prefix. /// </summary> /// <param name="g">Group that must be closed.</param> /// <param name="conclusions">Conclusions for the group.</param> protected override void OnGroupClose(IActivityLogGroup g, IReadOnlyList <ActivityLogGroupConclusion> conclusions) { _prefixLevel = _prefix = _prefix.Remove(_prefix.Length - 3); if (conclusions.Count == 0) { return; } var w = _buffer.Clear(); bool one = false; List <ActivityLogGroupConclusion> withMultiLines = null; foreach (var c in conclusions) { if (c.Text.Contains('\n')) { if (withMultiLines == null) { withMultiLines = new List <ActivityLogGroupConclusion>(); } withMultiLines.Add(c); } else { if (!one) { w.Append(_prefixLevel).Append("< "); one = true; } else { w.Append(" - "); } w.Append(c.Text); } } if (one) { w.AppendLine(); } if (withMultiLines != null) { foreach (var c in withMultiLines) { w.Append(_prefixLevel).Append("< "); w.AppendMultiLine(_prefixLevel + " ", c.Text, false); w.AppendLine(); } } _writer(_buffer.ToString()); }
/// <summary> /// Sends log to sinks (<see cref="IActivityLoggerSink.OnGroupClose"/>. /// </summary> /// <param name="group">The closed group.</param> /// <param name="conclusions">Texts that conclude the group. Never null but can be empty.</param> protected override void OnGroupClosed(IActivityLogGroup group, IReadOnlyList <ActivityLogGroupConclusion> conclusions) { if (_curLevel != -1) { foreach (var s in RegisteredSinks) { s.OnLeaveLevel((LogLevel)_curLevel); } _curLevel = -1; } foreach (var s in RegisteredSinks) { s.OnGroupClose(group, conclusions); } }
/// <summary> /// Sends log to sinks (<see cref="IActivityLoggerSink.OnGroupOpen"/>. /// </summary> /// <param name="group">The newly opened <see cref="IActivityLogGroup"/>.</param> protected override void OnOpenGroup(IActivityLogGroup group) { if (_curLevel != -1) { foreach (var s in RegisteredSinks) { s.OnLeaveLevel((LogLevel)_curLevel); } _curLevel = -1; } foreach (var s in RegisteredSinks) { s.OnGroupOpen(group); } }
void IActivityMonitorClient.OnOpenGroup(IActivityLogGroup group) { if (_curLevel != -1) { OnLeaveLevel((LogLevel)_curLevel); _curLevel = -1; } if (!CanOutputGroup(group.MaskedGroupLevel)) { _openGroups.Push(false); return; } _openGroups.Push(true); OnGroupOpen(group); }
void OnGroupOpen(IActivityLogGroup g) { Entries.Add(new Entry(g)); Writer.WriteLine(); Writer.Write(new String('+', g.Depth)); Writer.Write("{1} ({0})", g.MaskedGroupLevel, g.GroupText); if (g.Exception != null) { Writer.Write("Exception: " + g.Exception.Message); } if (WriteTags) { Writer.Write("-[{0}]", g.GroupTags.ToString()); } }
void IActivityLoggerSink.OnGroupClose(IActivityLogGroup g, IReadOnlyList <ActivityLogGroupConclusion> conclusions) { TextWriter w = _writer(); if (g.Exception != null) { DumpException(w, !g.IsGroupTextTheExceptionMessage, g.Exception); } _prefixLevel = _prefix = _prefix.Remove(_prefix.Length - 3); foreach (var c in conclusions) { string text = "◄▪-" + c.Conclusion; w.WriteLine(_prefixLevel + text.Replace(_prefixLevel + Environment.NewLine, Environment.NewLine + _prefixLevel + " ")); } }
/// <summary> /// Appends or updates the last <see cref="PathElement"/> of <see cref="DynamicPath"/> /// and handles errors or warning. /// </summary> /// <param name="group">The newly opened <see cref="IActivityLogGroup"/>.</param> protected override void OnOpenGroup(IActivityLogGroup group) { if (_currentIsGroupClosed) { HandleCurrentGroupIsClosed(); } if (_currentIsGroup || _current == null) { _current = new PathElement(); _path.Add(_current); } _currentIsGroup = true; _current.Level = group.GroupLevel; _current.Text = group.GroupText; CheckSnapshot(); }
void IActivityMonitorClient.OnGroupClosed(IActivityLogGroup group, IReadOnlyList <ActivityLogGroupConclusion>?conclusions) { if (_central.IsDisposed) { return; } Debug.Assert(_monitorSource != null, "Since we are called by the monitor..."); IMulticastLogEntry e = LogEntry.CreateMulticastCloseGroup(_central.GrandOutpuId, _monitorSource.UniqueId, _prevLogType, _prevlogTime, _currentGroupDepth, group.CloseLogTime, group.Data.Level, conclusions); _central.Sink.Handle(e); --_currentGroupDepth; _prevlogTime = group.CloseLogTime; _prevLogType = LogEntryType.CloseGroup; }
/// <summary> /// Writes a group opening. /// </summary> /// <param name="g">Group information.</param> protected override void OnGroupOpen(IActivityLogGroup g) { var w = _buffer.Clear(); string levelLabel = g.MaskedGroupLevel.ToString(); string start = string.Format("{0}> {1}: ", _prefix, levelLabel); _prefix += "| "; _prefixLevel = _prefix; string prefixLabel = _prefixLevel + new string( ' ', levelLabel.Length + 1 ); w.Append(start).AppendMultiLine(prefixLabel, g.GroupText, false); if (_currentTags != g.GroupTags) { w.Append(" -[").Append(g.GroupTags).Append(']'); _currentTags = g.GroupTags; } w.AppendLine(); if (g.Exception != null) { DumpException(w, _prefix, !g.IsGroupTextTheExceptionMessage, g.Exception); } _writer(_buffer.ToString()); }
/// <summary> /// Called for each <see cref="IActivityMonitor.UnfilteredOpenGroup"/>. /// Does nothing by default. /// </summary> /// <param name="group">The newly opened <see cref="IActivityLogGroup"/>.</param> protected virtual void OnOpenGroup( IActivityLogGroup group ) { }
/// <summary> /// Called once the user conclusions are known at the group level but before /// the group is actually closed: clients can update the conclusions for the group. /// Does nothing by default. /// </summary> /// <param name="group">The closing group.</param> /// <param name="conclusions"> /// Mutable conclusions associated to the closing group. /// This can be null if no conclusions have been added yet. /// It is up to the first client that wants to add a conclusion to instantiate a new List object to carry the conclusions. /// </param> protected virtual void OnGroupClosing( IActivityLogGroup group, ref List<ActivityLogGroupConclusion> conclusions ) { }
public void OnGroupClose(IActivityLogGroup g, IReadOnlyList <ActivityLogGroupConclusion> conclusions) { Writer.WriteLine(); Writer.Write(new String('-', g.Depth)); Writer.Write(String.Join(", ", conclusions.Select(c => c.Conclusion))); }
void IActivityLoggerSink.OnGroupClose( IActivityLogGroup g, IReadOnlyList<ActivityLogGroupConclusion> conclusions ) { TextWriter w = _writer(); if( g.Exception != null ) { DumpException( w, !g.IsGroupTextTheExceptionMessage, g.Exception ); } _prefixLevel = _prefix = _prefix.Remove( _prefix.Length - 3 ); foreach( var c in conclusions ) { string text = "◄▪-" + c.Conclusion; w.WriteLine( _prefixLevel + text.Replace( _prefixLevel + Environment.NewLine, Environment.NewLine + _prefixLevel + " " ) ); } }
public void OnGroupClose( IActivityLogGroup g, IReadOnlyList<ActivityLogGroupConclusion> conclusions ) { XmlWriter.WriteEndElement(); XmlWriter.Flush(); }
public void OnGroupClose(IActivityLogGroup g, IReadOnlyList <ActivityLogGroupConclusion> conclusions) { XmlWriter.WriteEndElement(); XmlWriter.Flush(); }
protected override void OnGroupClose( IActivityLogGroup g, IReadOnlyList<ActivityLogGroupConclusion> conclusions ) { Writer.WriteLine(); Writer.Write( new String( '-', g.Depth ) ); if( WriteConclusionTraits ) { Writer.Write( String.Join( ", ", conclusions.Select( c => c.Text + "-/[/"+ c.Tag.ToString() +"/]/" ) ) ); } else { Writer.Write( String.Join( ", ", conclusions.Select( c => c.Text ) ) ); } }
/// <summary> /// Sends log to sinks (<see cref="IActivityLoggerSink.OnGroupClose"/>. /// </summary> /// <param name="group">The closed group.</param> /// <param name="conclusions">Texts that conclude the group. Never null but can be empty.</param> protected override void OnGroupClosed( IActivityLogGroup group, IReadOnlyList<ActivityLogGroupConclusion> conclusions ) { if( _curLevel != -1 ) { foreach( var s in RegisteredSinks ) s.OnLeaveLevel( (LogLevel)_curLevel ); _curLevel = -1; } foreach( var s in RegisteredSinks ) s.OnGroupClose( group, conclusions ); }
public void OnGroupClose( IActivityLogGroup g, IReadOnlyList<ActivityLogGroupConclusion> conclusions ) { Writer.WriteLine(); Writer.Write( new String( '-', g.Depth ) ); Writer.Write( String.Join( ", ", conclusions.Select( c => c.Conclusion ) ) ); }
protected override void OnGroupClosed( IActivityLogGroup group, IReadOnlyList<ActivityLogGroupConclusion> conclusions ) { }
public void OnGroupOpen( IActivityLogGroup g ) { Writer.WriteLine(); Writer.Write( new String( '+', g.Depth ) ); Writer.Write( "{1} ({0})", g.GroupLevel, g.GroupText ); }
void IActivityMonitorClient.OnGroupClosed( IActivityLogGroup group, IReadOnlyList<ActivityLogGroupConclusion> conclusions ) { var h = EnsureChannel(); if( h != null ) { IMulticastLogEntry e = LogEntry.CreateMulticastCloseGroup( _monitorSource.UniqueId, _prevLogType, _prevlogTime, _currentGroupDepth, group.CloseLogTime, group.GroupLevel, conclusions ); h.Handle( new GrandOutputEventInfo( e, _monitorSource.Topic ) ); --_currentGroupDepth; _prevlogTime = group.CloseLogTime; _prevLogType = LogEntryType.CloseGroup; } }
void IActivityMonitorClient.OnOpenGroup( IActivityLogGroup group ) { var h = EnsureChannel(); if( h != null ) { IMulticastLogEntry e = LogEntry.CreateMulticastOpenGroup( _monitorSource.UniqueId, _prevLogType, _prevlogTime, _currentGroupDepth, group.GroupText, group.LogTime, group.GroupLevel, group.FileName, group.LineNumber, group.GroupTags, group.EnsureExceptionData() ); h.Handle( new GrandOutputEventInfo( e, _monitorSource.Topic ) ); ++_currentGroupDepth; _prevlogTime = group.LogTime; _prevLogType = LogEntryType.OpenGroup; } }
/// <summary> /// Called when the group is actually closed. /// Does nothing by default. /// </summary> /// <param name="group">The closed group.</param> /// <param name="conclusions">Text that conclude the group. Never null but can be empty.</param> protected virtual void OnGroupClosed( IActivityLogGroup group, IReadOnlyList<ActivityLogGroupConclusion> conclusions ) { }
// Security if OnGroupClosed is implemented one day on ActivityLoggerErrorCounter. protected override void OnGroupClosed(IActivityLogGroup group, IReadOnlyList <ActivityLogGroupConclusion> conclusions) { }
/// <summary> /// Writes a group opening. /// </summary> /// <param name="g">Group information.</param> protected override void OnGroupOpen( IActivityLogGroup g ) { var w = _buffer.Clear(); string levelLabel = g.MaskedGroupLevel.ToString(); string start = string.Format( "{0}> {1}: ", _prefix, levelLabel ); _prefix += "| "; _prefixLevel = _prefix; string prefixLabel = _prefixLevel + new string( ' ', levelLabel.Length + 1 ); w.Append( start ).AppendMultiLine( prefixLabel, g.GroupText, false ); if( _currentTags != g.GroupTags ) { w.Append( " -[" ).Append( g.GroupTags ).Append( ']' ); _currentTags = g.GroupTags; } w.AppendLine(); if( g.Exception != null ) { DumpException( w, _prefix, !g.IsGroupTextTheExceptionMessage, g.Exception ); } _writer( _buffer.ToString() ); }
/// <summary> /// Sends log to sinks (<see cref="IActivityLoggerSink.OnGroupOpen"/>. /// </summary> /// <param name="group">The newly opened <see cref="IActivityLogGroup"/>.</param> protected override void OnOpenGroup( IActivityLogGroup group ) { if( _curLevel != -1 ) { foreach( var s in RegisteredSinks ) s.OnLeaveLevel( (LogLevel)_curLevel ); _curLevel = -1; } foreach( var s in RegisteredSinks ) s.OnGroupOpen( group ); }
/// <summary> /// Writes group conclusion and updates internally managed line prefix. /// </summary> /// <param name="g">Group that must be closed.</param> /// <param name="conclusions">Conclusions for the group.</param> protected override void OnGroupClose( IActivityLogGroup g, IReadOnlyList<ActivityLogGroupConclusion> conclusions ) { _prefixLevel = _prefix = _prefix.Remove( _prefix.Length - 3 ); if( conclusions.Count == 0 ) return; var w = _buffer.Clear(); bool one = false; List<ActivityLogGroupConclusion> withMultiLines = null; foreach( var c in conclusions ) { if( c.Text.Contains( '\n' ) ) { if( withMultiLines == null ) withMultiLines = new List<ActivityLogGroupConclusion>(); withMultiLines.Add( c ); } else { if( !one ) { w.Append( _prefixLevel ).Append( "< " ); one = true; } else w.Append( " - " ); w.Append( c.Text ); } } if( one ) w.AppendLine(); if( withMultiLines != null ) { foreach( var c in withMultiLines ) { w.Append( _prefixLevel ).Append( "< " ); w.AppendMultiLine( _prefixLevel + " ", c.Text, false ); w.AppendLine(); } } _writer( _buffer.ToString() ); }
public void OnGroupOpen( IActivityLogGroup g ) { XmlWriter.WriteStartElement( g.GroupLevel.ToString() + "s" ); XmlWriter.WriteAttributeString( "Depth", g.Depth.ToString() ); XmlWriter.WriteAttributeString( "Level", g.GroupLevel.ToString() ); XmlWriter.WriteAttributeString( "Text", g.GroupText.ToString() ); }
protected override void OnGroupClosing(IActivityLogGroup group, IList <ActivityLogGroupConclusion> conclusions) { }
void IActivityMonitorClient.OnOpenGroup( IActivityLogGroup group ) { if( _file != null ) { _file.UnicastWriteOpenGroup( group, this ); ++_currentGroupDepth; _prevlogTime = group.LogTime; _prevLogType = LogEntryType.OpenGroup; } }
/// <summary> /// Updates error counters. /// </summary> /// <param name="group">The newly opened <see cref="IActivityLogGroup"/>.</param> protected override void OnOpenGroup(IActivityLogGroup group) { _current = new State(_current); _current.CatchLevel(group.GroupLevel); }
void IActivityMonitorClient.OnGroupClosed( IActivityLogGroup group, IReadOnlyList<ActivityLogGroupConclusion> conclusions ) { if( _file != null ) { _file.UnicastWriteCloseGroup( group, conclusions, this ); --_currentGroupDepth; _prevlogTime = group.CloseLogTime; _prevLogType = LogEntryType.CloseGroup; } }
void IActivityMonitorClient.OnOpenGroup( IActivityLogGroup group ) { OnOpenGroup( group ); }
void IActivityMonitorClient.OnGroupClosing( IActivityLogGroup group, ref List<ActivityLogGroupConclusion> conclusions ) { OnGroupClosing( group, ref conclusions ); }
public void OnGroupOpen(IActivityLogGroup g) { Writer.WriteLine(); Writer.Write(new String('+', g.Depth)); Writer.Write("{1} ({0})", g.GroupLevel, g.GroupText); }
void IActivityMonitorClient.OnGroupClosed( IActivityLogGroup group, IReadOnlyList<ActivityLogGroupConclusion> conclusions ) { OnGroupClosed( group, conclusions ); }
// Security if OnGroupClosing is implemented once on ActivityLoggerTap. protected override void OnGroupClosing( IActivityLogGroup group, IList<ActivityLogGroupConclusion> conclusions ) { }
void IActivityLoggerSink.OnGroupOpen( IActivityLogGroup g ) { TextWriter w = _writer(); w.Write( "{0}▪►-{1}: ", _prefix, g.GroupLevel.ToString() ); _prefix += "▪ "; _prefixLevel = _prefix; w.WriteLine( g.GroupText.Replace( Environment.NewLine, Environment.NewLine + _prefixLevel ) ); }
void IActivityMonitorClient.OnGroupClosing(IActivityLogGroup group, ref List <ActivityLogGroupConclusion>?conclusions) { }
protected override void OnOpenGroup( IActivityLogGroup group ) { }