解析日志文件并获取条目数据

时间:2010-09-10 21:12:02

标签: c# file logging

我有一个大的日志文件,其中多行由新行分隔。每个行条目存储四个值。

如果我正在阅读日志文件并希望存储此信息,我应该使用哪种数据类型/对象?

示例:

source1 destination1 result time
source2 destination1 result time
sources3 destination2 result time

这些值在行之间不是唯一的,它们可以重复。

我可以为{source,destination,result,time}值的每一行声明一个结构,并将结构对象存储在整个文件的List<T>中吗?

4 个答案:

答案 0 :(得分:3)

是的,您可以采用创建自己的特定课程并制作该课程List的方法。

根据文件的大小,使用DataTable执行此操作可以做得更好:

var dt = new DataTable();
dt.Columns.Add(new DataColumn("Source", typeof(string)));
dt.Columns.Add(new DataColumn("Destination", typeof(string)));
dt.Columns.Add(new DataColumn("Result", typeof(string)));
dt.Columns.Add(new DataColumn("Timestamp", typeof(DateTime)));

var dr = dt.NewRow();
dr["Source"] = "DATA";
dr["Destination"] = "DATA";
dr["Result"] = "DATA";
dr["Timestamp"] = DateTime.Now;
dt.Rows.Add(dr);

答案 1 :(得分:3)

是的,这正是我要做的。如果您没有LINQ,则可以将通用List与自己的自定义类一起使用。

public class LogEntry
{
     private String _source = String.Empty;
     private String _destination = String.Empty;
     private String _result = String.Empty;
     private String _time = String.Empty;

     public String Source
     {
         get { return _source; }
         set { _source = value; }
     }

     public String Destination
     {
            get { return _source; }
            set { _source = value; }
     }

     public String Result
     {
         get { return _source; }
         set { _source = value; }
     }

     public String Time
     {
         get { return _source; }
         set { _source = value; }
     }

     public LogEntry()
     {
     }

     public LogEntry( String source, String destination, String result, String time )
     {
         _source = source;
         _destination = destination;
         _result = result;
         _time = time;
     }

    public LogEntry( String[] args )
    {
        _source = args[0];
        _destination = args[1];
        _result = args[2];
        _time = args[3];
    }
  }

然后您可以使用如下列表:

 List<LogEntry> _logEntries = new List<LogEntry>();

我会将文件中的每一行读入一个String并创建一个新的LogEntry类,该类传递一个String.Split方法调用的结果。下面的代码是严格的伪代码。

char[] splitter = new char[1];
splitter[0] = ' ';

while( readLines into String )
{
   _logEntries.Add( new LogEntry( String.Split( splitter ) ) );
}

这个解决方案非常脆弱,日志文件格式的任何变化都会严重破坏代码,但它会起作用。此外,你打破白色空间,以便更好地确保你真正想要打破的。

答案 2 :(得分:2)

滚动你自己的课程

public class LogEntry
{
    public string Source;
    public string Destination;
    public DateTime ResultTime;
}

然后,您可以在每个输入行上调用Split(),然后将String []的每个元素解析为LogEntry对象。

答案 3 :(得分:2)

        class YourType
        {
            public String Source { get; private set; }
            public String Destination { get; private set; }
            public String Resoult { get; private set; }
            public String Time { get; private set; }

            //or func returning bool and remove exception
            public YourType(String line)
            {
                var split = line.Split(' ');

                if (split.Length != 4)
                    throw new ArgumentException();

                Source = split[0];
                Destination = split[1];
                Resoult = split[2];
                Time = split[3];
            }

        }

        public Main()
        {
            String values =
 @"source1 destination1 result time
source2 destination1 result time
sources3 destination2 result time";



            var v = from line in values.Split(new String[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries)
                    select new YourType(line);

            foreach (var it in v)
            {
                Console.WriteLine(it.Source);
            }

        }