解析日志文件 - C#或其他任何
问题描述:
我试图解析包含这样的信息日志文件:解析日志文件 - C#或其他任何
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) ;
}
请代码回到你的提示进一步解释!
再次感谢
答
您可以将文件的行添加到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([email protected]"\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
是你想读
答
日志文件
如果您只想获取操作和呼叫次数,您可以使用这段代码。
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;
}
}
之后,你有一个字典,其中的行动是关键和调用的计数是价值。
如果你想使解析更多的错误性,你可以在不根本chaning逻辑改变这一部分。
如果你想获得的所有行动的计数使用。
var actionCount = items.Sum(x => x.Value);
而且,如果您想获得例如“连接”操作的百分比,则可以使用此操作。
var percentage = 100.0/actionCount * items["connect"];
但是你要检查是否有这一行的字典任何“连接”项将失败。你可以检查一下是否有钥匙存在,你可以使用
items.ContainsKey("connect");
'但我无法做到这一点。' - 你到目前为止尝试过什么?我们可以看到代码吗? – vasek
我建议不使用'DataTable'因为这将是与例如一个'字典'和存储logtext作为键和次数作为值更容易。 –
像vasek问......你有什么试过?你需要帮助阅读文件,解析每一行,分析数据? –