/// <summary>
        /// Read a single log event from an already-deserialized JSON object.
        /// </summary>
        /// <param name="jObject">The deserialized compact-JSON event.</param>
        /// <returns>The log event.</returns>
        public static LogEvent ReadFromJObject(JObject jObject, IMessageFields messageFields)
        {
            if (jObject == null)
            {
                throw new ArgumentNullException(nameof(jObject));
            }

            return(ReadFromJObject(1, jObject, messageFields));
        }
Beispiel #2
0
 public JsonFormatterParser(IMessageFields messageFields)
 {
     this.messageFields     = messageFields;
     JsonSerializerSettings = new JsonSerializerSettings
     {
         DateParseHandling    = DateParseHandling.DateTimeOffset,
         DateFormatHandling   = DateFormatHandling.IsoDateFormat,
         DateTimeZoneHandling = DateTimeZoneHandling.Utc,
     };
 }
 /// <summary>
 /// Construct a <see cref="LogEventReader"/>.
 /// </summary>
 /// <param name="text">Text to read from.</param>
 /// <param name="messageFields"></param>
 /// <param name="serializer">If specified, a JSON serializer used when converting event documents.</param>
 public LogEventReader(TextReader text, IMessageFields messageFields, JsonSerializer serializer = null)
 {
     _messageFields = messageFields;
     _text          = text ?? throw new ArgumentNullException(nameof(text));
     _serializer    = serializer ?? CreateSerializer();
 }
        private static LogEvent ReadFromJObject(int lineNumber, JObject jObject, IMessageFields messageFields)
        {
            var timestamp = GetRequiredTimestampField(lineNumber, jObject, messageFields.Timestamp);

            string messageTemplate;

            if (TryGetOptionalField(lineNumber, jObject, messageFields.MessageTemplate, out var mt))
            {
                messageTemplate = mt;
            }
            else if (TryGetOptionalField(lineNumber, jObject, messageFields.Message, out var m))
            {
                messageTemplate = MessageTemplateSyntax.Escape(m);
            }
            else
            {
                messageTemplate = null;
            }

            var level = LogEventLevel.Information;

            if (TryGetOptionalField(lineNumber, jObject, messageFields.Level, out string l))
            {
                level = (LogEventLevel)Enum.Parse(typeof(LogEventLevel), l);
            }

            Exception exception = null;

            if (TryGetOptionalField(lineNumber, jObject, messageFields.Exception, out string ex))
            {
                exception = TryPopulateException(ex, exception, jObject);
            }

            var parsedTemplate = messageTemplate == null
                ? new MessageTemplate(Enumerable.Empty <MessageTemplateToken>())
                : Parser.Parse(messageTemplate);

            var renderings = Enumerable.Empty <Rendering>();

            if (jObject.TryGetValue(messageFields.Renderings, out JToken r))
            {
                var renderedByIndex = r as JArray;
                if (renderedByIndex == null)
                {
                    throw new InvalidDataException(
                              $"The `{messageFields.Renderings}` value on line {lineNumber} is not an array as expected.");
                }

                renderings = parsedTemplate.Tokens
                             .OfType <PropertyToken>()
                             .Where(t => t.Format != null)
                             .Zip(renderedByIndex, (t, rd) => new Rendering(t.PropertyName, t.Format, rd.Value <string>()))
                             .ToArray();
            }

            List <LogEventProperty> properties;

            if (jObject.ContainsKey("Properties") && jObject["Properties"] is JObject props)
            {
                properties = props.Properties()
                             .Where(f => !messageFields.All.Contains(f.Name))
                             .Select(f =>
                {
                    var name = messageFields.Unescape(f.Name);
                    var renderingsByFormat = renderings.Where(rd => rd.Name == name).ToList();
                    return(PropertyFactory.CreateProperty(name, f.Value, renderingsByFormat));
                })
                             .ToList();
            }
            else
            {
                properties = jObject
                             .Properties()
                             .Where(f => !messageFields.All.Contains(f.Name))
                             .Select(f =>
                {
                    var name = messageFields.Unescape(f.Name);
                    var renderingsByFormat = renderings.Where(rd => rd.Name == name).ToList();
                    return(PropertyFactory.CreateProperty(name, f.Value, renderingsByFormat));
                })
                             .ToList();
            }
            if (TryGetOptionalField(lineNumber, jObject, messageFields.EventId, out var eventId)) // TODO; should support numeric ids.
            {
                properties.Add(new LogEventProperty("@i", new ScalarValue(eventId)));
            }
            properties.Add(new LogEventProperty("Raw Data", new ScalarValue(jObject.ToString())));
            return(new LogEvent(timestamp, level, exception, parsedTemplate, properties));
        }
 public JsonFileParser(IMessageFields messageFields)
 {
     this.messageFields = messageFields;
 }
Beispiel #6
0
 static CompactJsonFormatParser()
 {
     messageFields = new CompactJsonFormatMessageFields();
 }