【问题标题】:How to extract data based on timestamps in multiline log?如何根据多行日志中的时间戳提取数据?
【发布时间】:2015-08-19 13:56:43
【问题描述】:

我的日志包含以下格式的数据。我的问题是这个 - 假设我在日志中搜索 12:22 PM,我怎样才能提取与该时间戳相关的所有信息并输出它......有没有办法可以说从下午 12:22 开始输出所有内容直到你达到下一个时间戳?这基本上就是我想要以编程方式做的事情。任何帮助将不胜感激。谢谢!

12:22 PM
    abc 
    def
       ghi
    abc
12:33 PM
    abc
    def

上述情况的输出就是这样 -

   12:22 PM
        abc 
        def
           ghi
        abc

另外请注意:可能有多个日志条目具有相同的时间戳,例如,同一时间戳下可能有 2 个或 3 个或更多条目,即12:22 PM

【问题讨论】:

  • 使用正则表达式来验证时间戳,比如/^(0?[1-9]|1[012])(:[0-5]\d) [APap][mM]$/,如果你没有时间戳匹配,那么它就是你想要的输出行。

标签: c# parsing timestamp


【解决方案1】:

您可以编写一个静态函数,该函数将从给定的时间戳中提取所需的日志,如下所示:

注意:我不处理异常场景的[如 FileNotFoundException 和其他异常],请按您的要求处理。

 static string GetLogsByTimeStamp(string timeStamp)
    {
        if (!string.IsNullOrEmpty(timeStamp))
        {
            string filePath = @"F:\log.txt"; //your logfile path here
            string format = "hh:mm tt";
            TimeSpan reqTimeStamp = DateTime.ParseExact(timeStamp.Trim(),
                        format, CultureInfo.InvariantCulture).TimeOfDay;
            StringBuilder selectiveLogs = new StringBuilder(string.Empty);
            bool startReading = false;
            foreach (var line in File.ReadLines(filePath))
            {
                string[] arrItems = line.Split(new[] { ' ' }, 
                            StringSplitOptions.RemoveEmptyEntries);
                DateTime logDateTime = DateTime.MinValue;
                bool isDateTimeValid = false;
                if (arrItems != null && arrItems.Length > 1)
                    DateTime.TryParseExact(string.Format("{0}{1}{2}", 
                        arrItems[0].Trim(), " ", arrItems[1].Trim()), 
                                        format, CultureInfo.InvariantCulture,
                                        DateTimeStyles.None, out logDateTime);
                TimeSpan logTimeStamp = logDateTime.TimeOfDay;
                if ((!startReading && logTimeStamp == reqTimeStamp) ||   
                                   (startReading && !isDateTimeValid))
                    startReading = true;
                if (startReading && logTimeStamp > reqTimeStamp)
                {
                    startReading = false;
                    break; // no need to continue when you know that u 
                           //reached greater timestamp than required.
                }
                if (startReading)
                    selectiveLogs.AppendLine(line);
            }
            return selectiveLogs.ToString();
        }
        else
            return string.Empty;
    }

你可以使用上面的静态函数如下:

string requiredLog = GetLogsByTimeStamp("12:22 PM");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多