public void PropertiesContainFieldsFromStructuredLogs() { var logRecords = new List <LogRecord>(); using var loggerFactory = LoggerFactory.Create(builder => { builder.AddOpenTelemetry(options => { options.AddInMemoryExporter(logRecords); }); builder.AddFilter(typeof(LogsHelperTests).FullName, LogLevel.Trace); }); var logger = loggerFactory.CreateLogger <LogsHelperTests>(); string log = "Hello from {name} {price}."; logger.LogInformation(log, "tomato", 2.99); var properties = new ChangeTrackingDictionary <string, string>(); LogsHelper.GetMessageAndSetProperties(logRecords[0], properties); Assert.True(properties.TryGetValue("name", out string name)); Assert.Equal("tomato", name); Assert.True(properties.TryGetValue("price", out string price)); Assert.Equal("2.99", price); }
public void PropertiesContainEventIdAndEventNameIfSetOnLog() { var logRecords = new List <LogRecord>(); using var loggerFactory = LoggerFactory.Create(builder => { builder.AddOpenTelemetry(options => { options.ParseStateValues = true; options.AddInMemoryExporter(logRecords); }); builder.AddFilter(typeof(LogsHelperTests).FullName, LogLevel.Trace); }); var logger = loggerFactory.CreateLogger <LogsHelperTests>(); EventId id = new EventId(1, "TestEvent"); logger.LogInformation(id, "Log Information"); var properties = new ChangeTrackingDictionary <string, string>(); LogsHelper.GetMessageAndSetProperties(logRecords[0], properties); Assert.True(properties.TryGetValue("EventId", out string eventId)); Assert.Equal("1", eventId); Assert.True(properties.TryGetValue("EventName", out string eventName)); Assert.Equal("TestEvent", eventName); }
public void MessageIsSetToOriginalFormatWhenIncludeFormattedMessageIsNotSet() { var logRecords = new List <LogRecord>(); using var loggerFactory = LoggerFactory.Create(builder => { builder.AddOpenTelemetry(options => { options.AddInMemoryExporter(logRecords); }); builder.AddFilter(typeof(LogsHelperTests).FullName, LogLevel.Trace); }); var logger = loggerFactory.CreateLogger <LogsHelperTests>(); string log = "Hello from {name} {price}."; logger.LogInformation(log, "tomato", 2.99); var properties = new ChangeTrackingDictionary <string, string>(); var message = LogsHelper.GetMessageAndSetProperties(logRecords[0], properties); Assert.Equal(log, message); Assert.False(properties.ContainsKey("OriginalFormat")); Assert.True(properties.TryGetValue("name", out string name)); Assert.Equal("tomato", name); Assert.True(properties.TryGetValue("price", out string price)); Assert.Equal("2.99", price); }
public MessageData(int version, LogRecord logRecord) : base(version) { Properties = new ChangeTrackingDictionary <string, string>(); Measurements = new ChangeTrackingDictionary <string, double>(); Message = LogsHelper.GetMessageAndSetProperties(logRecord, Properties).Truncate(SchemaConstants.MessageData_Message_MaxLength); SeverityLevel = LogsHelper.GetSeverityLevel(logRecord.LogLevel); }
public TelemetryExceptionData(int version, LogRecord logRecord) : base(version) { Properties = new ChangeTrackingDictionary <string, string>(); Measurements = new ChangeTrackingDictionary <string, double>(); var message = LogsHelper.GetMessageAndSetProperties(logRecord, Properties); SeverityLevel = LogsHelper.GetSeverityLevel(logRecord.LogLevel); ProblemId = LogsHelper.GetProblemId(logRecord.Exception).Truncate(SchemaConstants.ExceptionData_ProblemId_MaxLength); // collect the set of exceptions detail info from the passed in exception List <TelemetryExceptionDetails> exceptions = new List <TelemetryExceptionDetails>(); ConvertExceptionTree(logRecord.Exception, message, null, exceptions); // trim if we have too many, also add a custom exception to let the user know we're trimmed if (exceptions.Count > MaxExceptionCountToSave) { // create our "message" exception. InnerExceptionCountExceededException countExceededException = new InnerExceptionCountExceededException( string.Format( CultureInfo.InvariantCulture, "The number of inner exceptions was {0} which is larger than {1}, the maximum number allowed during transmission. All but the first {1} have been dropped.", exceptions.Count, MaxExceptionCountToSave)); // remove all but the first N exceptions exceptions.RemoveRange(MaxExceptionCountToSave, exceptions.Count - MaxExceptionCountToSave); // we'll add our new exception and parent it to the root exception (first one in the list) exceptions.Add(new TelemetryExceptionDetails(countExceededException, countExceededException.Message, exceptions[0])); } Exceptions = exceptions; }