【问题标题】:Parsing Log File - C# or any other解析日志文件 - C# 或任何其他
【发布时间】:2017-07-19 11:45:14
【问题描述】:

我正在尝试解析包含如下信息的日志文件:

2015-03-08 10:30:01     /user849/connect
2015-03-08 10:30:01     /user262/open-level2-price
2015-03-08 10:30:01     /user839/open-detailed-quotes
2015-03-08 10:30:02     /user145/add-technical-drawing
2015-03-08 10:30:02     /user108/connect
2015-03-08 10:30:03     /user850/filter-changed
2015-03-08 10:30:03     /user818/open-level2-price
2015-03-08 10:30:03     /user841/column-width
2015-03-08 10:30:03     /user850/filter-changed
2015-03-08 10:30:04     /user850/connect
2015-03-08 10:30:04     /user420/duration
2015-03-08 10:30:04     /user851/filter-changed
2015-03-08 10:30:04     /user217/duration
2015-03-08 10:30:05     /user82/update-column-properties
2015-03-08 10:30:05     /user809/open-level2-price
2015-03-08 10:30:05     /user382/add-technical-drawing
2015-03-08 10:30:06     /user851/connect
2015-03-08 10:30:07     /user350/add-technical-drawing
2015-03-08 10:30:09     /user849/filter-changed
2015-03-08 10:30:09     /user842/sort
2015-03-08 10:30:09     /user849/open-market-watch
2015-03-08 10:30:10     /user429/interval
2015-03-08 10:30:10     /user218/change-columns
2015-03-08 10:30:11     /user749/connect
2015-03-08 10:30:13     /user759/open-detailed-quotes
2015-03-08 10:30:14     /user753/connect
2015-03-08 10:30:14     /user377/connect

我正在尝试查找 3 个最常用的操作及其百分比,我想到的是读取文件,用一些正则表达式解析行,或者将它们填充到数据表中,然后处理该数据表,但我做不到。

你能告诉我该怎么做,从哪里开始,或者一些代码示例(最好是 c#)吗?

提前致谢!


编辑:

嗯,(我现在已经成功完成了)至于我尝试过的,这是我的代码

string filePath = @"6458.log";

try
{
    DataTable logLines = new DataTable("LogLines");
    //logLines.Columns.Add(new DataColumn("DateTime", System.Type.GetType("System.DateTime")));
    logLines.Columns.Add(new DataColumn("User", typeof(string)));
    logLines.Columns.Add(new DataColumn("Operation", typeof(string)));

    string[] lines = System.IO.File.ReadAllLines(filePath);

    foreach (string line in lines)
    {
        var cols = line.Split(new char[] { ' ', '/' }, StringSplitOptions.RemoveEmptyEntries);

        DataRow dr = logLines.NewRow();

        //dr["DateTime"] = cols[0] + " " + cols[1];
        dr["User"] = cols[2];
        dr["Operation"] = cols[3];

        logLines.Rows.Add(dr);
    }

    var query = from row in logLines.AsEnumerable()
                group row by row.Field<string>("Operation") into operations
                orderby operations.Count() descending
                select new
                {
                    Name = operations.Key,
                    CountOfClients = operations.Count()
                };
}
catch (Exception ex)
{
    throw(ex) ;
}

请用代码支持您的提示以获得进一步的解释!

再次感谢

【问题讨论】:

  • but i was not able to do it. - 到目前为止你尝试过什么?我们可以看到代码吗?
  • 我建议不要使用DataTable,因为例如使用Dictionary&lt;string, int&gt; 并将日志文本存储为键并将发生值存储为值会更容易。
  • 就像 vasek 所问的那样……你试过什么?您在读取文件、解析每一行、分析数据方面需要帮助吗?
  • @MightyBadaboom,如果两次使用相同的日志文本会怎样?
  • @ChristophK 增加 int 的值;)

标签: c# regex fileparsing


【解决方案1】:

您可以将文件的行添加到List然后使用linq获取您想要的数据

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

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            List<data> logs = new List<data>();
            var path=Path.Combine(Environment.CurrentDirectory+@"\file.txt");
            using (StreamReader sr = new StreamReader(path))
            {
                string line;
               while((line = sr.ReadLine()) != null)
               {

                   var log = Regex.Split(line, "     ");
                   logs.Add(new data { LogDate=DateTime.Parse(log[0]),Operation=log[1]});
               }
            }

            // here you can use linq to get the data you want from logs list



            // end of main 
        }


        public class data
        {
            public DateTime LogDate { get; set; }
            public string Operation { get; set; }
        }
        // end of class
    }


}

file.txt是你要读取的日志文件

【讨论】:

  • 感谢您的回答,非常感谢,这是一项临时任务,当时无法解决,但已成功交付,但没有机会检查答案
【解决方案2】:

如果您只想获取操作和调用次数,可以使用这段代码。

Dictionary<string, int> items = new Dictionary<string, int>();

foreach(string line in lines)
{
    var cols = line.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries);
    var operation = cols[2].Trim();

    if(items.Keys.Any(x => x.Equals(operation)))
    {
        items[operation]++;
    }
    else
    {
        items[operation] = 1;
    }
}

在此之后,您有一个字典,其中操作是键,调用次数是值。

如果你想让解析更容易出错,你可以在不改变逻辑的情况下更改这部分。

如果您想获取所有操作的计数,请使用它。

var actionCount = items.Sum(x => x.Value);

如果您想获得例如“连接”操作的百分比,您可以使用它。

var percentage = 100.0 / actionCount * items["connect"];

但是您必须检查此行的字典中是否有任何“连接”条目会失败。您可以检查是否存在可以使用的密钥

items.ContainsKey("connect");

【讨论】:

  • 感谢您的回答,非常感谢,这是一项临时任务,当时无法解决,但已成功交付,但没有机会检查答案
猜你喜欢
  • 2013-03-13
  • 2012-07-10
  • 1970-01-01
  • 1970-01-01
  • 2016-01-09
  • 1970-01-01
  • 2017-11-10
相关资源
最近更新 更多