【问题标题】:Extracing JSON from syslog-pefixed lines in C#从 C# 中以系统日志为前缀的行中提取 JSON
【发布时间】:2019-09-30 17:38:54
【问题描述】:

我正在尝试解析系统日志(或类似系统日志)的响应以仅提取 JSON

<14>1 09 30 2019 15:34:37 UTC logsource {"somejson": "thejson", "details": {"detail1": detail, "detail2": detail"}}

<14>1 09 30 2019 15:34:37 UTC logsource {"somejson": "thejson", "details": {"detail1": detail, "detail2": detail"}}

<14>1 09 30 2019 15:34:37 UTC logsource {"somejson": "thejson", "details": {"detail1": detail, "detail2": detail"}}

我想删除“1 09 30 2019 15:34:37 UTC logsource”前缀,以便剩余数据是有效的 JSON,以便我可以将每一行发送到数据库。我认为输出看起来像这样:

{
    "body" [
        {
            "somejson": "thejson",
            "details": {
                "detail1": details,
                "detail2": details.
            }
        },
        {
            "somejson": "thejson",
            "details": {
                "detail1": details,
                "detail2": details.
            }
        },
        {
            "somejson": "thejson",
            "details": {
                "detail1": details,
                "detail2": details.
            }
        }
    ]
}

也许我可以遍历原始数据并以某种方式使用 String.Replace 替换字符串?我感谢任何帮助,即使它只是为我指明了正确的方向。

【问题讨论】:

  • 我假设“1 09 30 2019 15:34:37 UTC logsource”会不一致?因此,如果我理解,您需要做的是删除第一个“{”之前的所有内容。对吗?
  • @CaseyCrookston 是的,删除第一个 { 之前的所有内容是理想的。大概为了使它成为一个有效的 JSON,我还需要添加一些格式
  • 删除第一个 { 之前的所有内容非常简单。你可以通过像c# remove everything before character 这样的快速谷歌搜索来解决这个问题。从那里应该很容易添加开头{"body" [和关闭]}
  • @CaseyCrookston 我认为从短字符串中删除某些内容不会有问题,但是如何删除以 开头的每一行中第一个 { 之前的所有内容?能够遍历每一行并执行相同的操作,我有点迷失了
  • 好的,听起来这里发生了一些您可能没有在帖子中解释的事情。您是否有需要修改列表中每个字符串的List&lt;string&gt;?另外,在您向我们展示的示例中,这是字符串的全部内容吗?

标签: c# json parsing syslog


【解决方案1】:

一种方法是使用 Newtonsoft.Json。去掉不需要的日志前缀后,可以将字符串解析为JObject。我还继续删除了您输入中的空白行。这是我用来执行此操作的代码:

using System;
using System.Linq;
using System.IO;
using Newtonsoft.Json.Linq;

namespace extractingJSONSyslogQuestion
{
    class Program
    {
        static void Main(string[] args)
        {
            var input = File.ReadAllText("test.txt");
            var lines = input.Split("\n");

            // Remove blank lines
            lines = lines.Where(l => !string.IsNullOrEmpty(l)).ToArray();

            foreach(var line in lines) {
                // Get rid of log prefix
                var data = line.Substring(line.IndexOf("{"));
                var json = JObject.Parse(data);
                Console.WriteLine(json);
            }
        }
    }
}

这是我使用的输入文件。请注意,我在字符串 "detail" 周围添加了双引号以使其成为有效的 json:

<14>1 09 30 2019 15:34:37 UTC logsource {"somejson": "thejson", "details": {"detail1": "detail", "detail2": "detail"}}

<14>1 09 30 2019 15:34:37 UTC logsource {"somejson": "thejson", "details": {"detail1": "detail", "detail2": "detail"}}

<14>1 09 30 2019 15:34:37 UTC logsource {"somejson": "thejson", "details": {"detail1": "detail", "detail2": "detail"}

最后,这是我的程序的输出:

{
  "somejson": "thejson",
  "details": {
    "detail1": "detail",
    "detail2": "detail"
  }
}
{
  "somejson": "thejson",
  "details": {
    "detail1": "detail",
    "detail2": "detail"
  }
}
{
  "somejson": "thejson",
  "details": {
    "detail1": "detail",
    "detail2": "detail"
  }
}

如果您发表评论,我很乐意更详细地回答有关代码的任何问题。

【讨论】:

    猜你喜欢
    • 2022-07-22
    • 2018-08-31
    • 1970-01-01
    • 2021-10-26
    • 1970-01-01
    • 2022-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多