public LoggingDummyFactory() { var logWriterConfigTypes = typeof(LogWriterConfigBase).Assembly.DefinedTypes.Where(_ => _.BaseType == typeof(LogWriterConfigBase)).ToList(); AutoFixtureBackedDummyFactory.UseRandomConcreteSubclassForDummy <LogWriterConfigBase>( null, logWriterConfigTypes); AutoFixtureBackedDummyFactory.AddDummyCreator( () => { var result = new LogItemContext(A.Dummy <DateTime>().ToUniversalTime(), A.Dummy <string>(), A.Dummy <string>(), A.Dummy <string>()); return(result); }); AutoFixtureBackedDummyFactory.AddDummyCreator( () => { var context = A.Dummy <LogItemContext>(); var dummySubject = new DummySubject { Info = A.Dummy <string>() }; var result = new LogItem(new RawSubject(dummySubject, dummySubject.Info).ToSubject(), LogItemKind.Object, context, A.Dummy <string>()); return(result); }); AutoFixtureBackedDummyFactory.AddDummyCreator( () => { var result = new RawSubject(A.Dummy <string>(), A.Dummy <string>()); return(result); }); AutoFixtureBackedDummyFactory.AddDummyCreator( () => { var rawSubject = A.Dummy <RawSubject>(); var result = rawSubject.ToSubject(); return(result); }); }
public LogItem BuildLogItem( string logItemOrigin, LogEntry logEntry, IReadOnlyCollection <IHaveCorrelationId> additionalCorrelations = null) { logEntry = logEntry ?? throw new ArgumentNullException(nameof(logEntry)); var psuedoOrderCorrelationPosition = GetSomewhatFakePositionFromLogEntry(logEntry); if (!string.IsNullOrWhiteSpace(logEntry.Category)) { throw new ArgumentException(Invariant($"{nameof(LogEntry)} cannot have the property {nameof(LogEntry.Category)} set; found: {logEntry.Category}.")); } if (psuedoOrderCorrelationPosition != 1 && (logEntry.Params?.Any() ?? false)) { throw new ArgumentException(Invariant($"{nameof(LogEntry)} cannot have the property {nameof(LogEntry.Params)} set unless it's part of the {nameof(LogActivity.Trace)} scenario; found: {logEntry.Params.Select(_ => _.ToString()).ToCsv()}")); } object logItemSubjectObject; var correlations = new List <IHaveCorrelationId>(additionalCorrelations ?? new IHaveCorrelationId[0]); var correlationId = Guid.NewGuid().ToString().ToLowerInvariant(); if (psuedoOrderCorrelationPosition == -1) { logItemSubjectObject = logEntry.Subject; } else { if ((psuedoOrderCorrelationPosition == 0) || (psuedoOrderCorrelationPosition == 2)) { logItemSubjectObject = logEntry.Subject; } else if (psuedoOrderCorrelationPosition == 1) { if (logEntry.Params?.Any() ?? false) { if (logEntry.Params.Count() > 1) { throw new InvalidOperationException(Invariant($"{nameof(LogEntry)} cannot have the property {nameof(LogEntry.Params)} set with more than one value as part of the {nameof(LogActivity.Trace)} scenario; found: {logEntry.Params.Select(_ => _.ToString()).ToCsv()}")); } else { logItemSubjectObject = logEntry.Params.Single(); } } else { logItemSubjectObject = logEntry.Message; } } else { throw new NotSupportedException(Invariant($"This fake order correlation position is not supported: {psuedoOrderCorrelationPosition}")); } var activityCorrelatingSubject = new RawSubject( logEntry.Subject, LogHelper.BuildSummaryFromSubjectObject(logEntry.Subject)); correlationId = activityCorrelatingSubject.GetHashCode().ToGuid().ToString().ToLowerInvariant(); var elapsedMilliseconds = psuedoOrderCorrelationPosition == 0 ? 0 : logEntry.ElapsedMilliseconds ?? throw new InvalidOperationException(Invariant($"{nameof(logEntry)}.{nameof(LogEntry.ElapsedMilliseconds)} is null when there is an {nameof(ElapsedCorrelation)}")); var elapsedCorrelation = new ElapsedCorrelation(correlationId, TimeSpan.FromMilliseconds(elapsedMilliseconds)); var correlatingSubject = activityCorrelatingSubject.ToSubject(); correlations.Add(elapsedCorrelation); var subjectCorrelation = new SubjectCorrelation(correlationId, correlatingSubject); correlations.Add(subjectCorrelation); var orderCorrelation = new OrderCorrelation(correlationId, psuedoOrderCorrelationPosition); correlations.Add(orderCorrelation); } string stackTrace = null; var kind = LogHelper.DetermineKindFromSubject(logItemSubjectObject); if (logItemSubjectObject is Exception loggedException) { var exceptionCorrelations = Logging.Domain.CorrelationManager.BuildExceptionCorrelations(loggedException, correlationId, this.errorCodeKeysField); correlations.AddRange(exceptionCorrelations); stackTrace = loggedException.StackTrace; } switch (psuedoOrderCorrelationPosition) { case 0: logItemSubjectObject = UsingBlockLogger.InitialItemOfUsingBlockSubject; break; case 2: logItemSubjectObject = UsingBlockLogger.FinalItemOfUsingBlockSubject; break; } var logItemRawSubject = new RawSubject( logItemSubjectObject, LogHelper.BuildSummaryFromSubjectObject(logItemSubjectObject)); var context = new LogItemContext(logEntry.TimeStamp, logItemOrigin, LogHelper.MachineName, LogHelper.ProcessName, LogHelper.ProcessFileVersion, logEntry.CallingMethod, logEntry.CallingType?.ToRepresentation(), stackTrace); var comment = (logItemSubjectObject is string logItemSubjectAsString) && (logItemSubjectAsString == logEntry.Message) ? null : logEntry.Message; var result = new LogItem(logItemRawSubject.ToSubject(), kind, context, comment, correlations); return(result); }