Saya memiliki file log besar seperti ini:

    2020-03-25 13:15:41 App initialized.
    2020-03-25 13:18:22.477 ERROR Exception from api  blah blah blah blah:  NOT FOUND
            at element(bl:97) ~[classes/:na]
            at blah blah blah blah(bm:997) ~[classes/:na]   
            at blah blah blah blah(yq:5) ~[classes/:na]
            at blah blah blah blah(Native Method) ~[na:1.4.0_111]   
    2020-03-25 13:18:22.477 ERROR blah blah - Exception from api  blah blah blah blah: STATUS MONITOR   
            at element(bl:97) ~[classes/:na]
            at blah blah blah blah(bm:997) ~[classes/:na]   
            at blah blah blah blah(yq:5) ~[classes/:na]
            at blah blah blah blah(Native Method) ~[na:1.4.0_111]  

Dan perlu menulis fungsi yang akan mengembalikan cap waktu dan teks dari kesalahan.

2020-03-25 13:18:22.477 

Sebagai kunci, dan

ERROR Exception from api  blah blah blah blah:  NOT FOUND
            at element(bl:97) ~[classes/:na]2020-03-25 13:15:41  
            at blah blah blah blah(bm:997) ~[classes/:na]   
            at blah blah blah blah(yq:5) ~[classes/:na]
            at blah blah blah blah(Native Method) ~[na:1.4.0_111]

Sebagai nilai-nilai

Saya menggunakan Dictionary<DateTime, string> untuk menyimpan data dan Stringbuilder untuk membangun setiap baris kesalahan. Tetapi saya tidak tahu cara mengulangnya dengan benar tanpa mengorbankan data yang saya coba buat karena itu akan diatur ulang setiap baris.

                foreach (var line in File.ReadLines(fileName))
                {
                    bool isTimeStamp = false;
                    do
                    {
                        sb = new StringBuilder();
                        timeStamp = new DateTime();
                        try
                        {
                            timeStamp = DateTime.Parse(line.Substring(0, 24));
                            isTimeStamp = true;
                        }
                        catch
                        {
                            sb.AppendLine(line);
                            break;
                        }
                    }
                    while (!isTimeStamp);

                    logs.Add(timeStamp, sb.ToString());
                }

Setiap petunjuk atau tip akan sangat dihargai.

c#
-2
MattPlum 27 Maret 2020, 17:43

1 menjawab

Jawaban Terbaik

Coba ikuti:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Text.RegularExpressions;

namespace ConsoleApplication3
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.txt";
        static void Main(string[] args)
        {
            string pattern = @"^(?'date'[^\s]+\s[^\s]+)\s+(?'error'.*)";
            Dictionary<DateTime, List<string>> dict = new Dictionary<DateTime,List<string>>();
            StreamReader reader = new StreamReader(FILENAME);
            string line = "";
            List<string> messages = null;
            while ((line = reader.ReadLine()) != null)
            {
                line = line.Trim();
                if (line.Length > 0)
                {
                    if (line.StartsWith("at"))
                    {
                        messages.Add(line.Trim());
                    }
                    else
                    {
                        Match match = Regex.Match(line, pattern);
                        string dateStr = match.Groups["date"].Value;
                        DateTime date = DateTime.Parse(dateStr);
                        string message = match.Groups["error"].Value.Trim();
                        messages = new List<string>();
                        messages.Add(message);
                        dict.Add(date, messages);
                    }
                }
            }

        }
    }
}
-1
jdweng 28 Maret 2020, 02:43