C#匹配IIS和Oracle服务器日志循环

C#匹配IIS和Oracle服务器日志循环,c#,oracle,iis,C#,Oracle,Iis,对于在过去6周里一直在学习c#的人来说,我有一个有点难的问题 我有两个逗号分隔的文件,我将它们流到一个数组中。第一个有一列d:m:y h:m:s。我需要将它与第二个文本文件(逗号分隔)匹配,我需要将第二个文件中的d:m:y h:m:s与第一个文件匹配。唯一的问题是,秒数必须与相同的秒数或秒数+1匹配,我需要将该行打印到第三个文件中 例如,我可以: File 1 File 2 d:m:y h:m:s d:m:y h:m:s,UUID - 1 d:m:y h:m:s

对于在过去6周里一直在学习c#的人来说,我有一个有点难的问题

我有两个逗号分隔的文件,我将它们流到一个数组中。第一个有一列d:m:y h:m:s。我需要将它与第二个文本文件(逗号分隔)匹配,我需要将第二个文件中的d:m:y h:m:s与第一个文件匹配。唯一的问题是,秒数必须与相同的秒数或秒数+1匹配,我需要将该行打印到第三个文件中

例如,我可以:

File 1           File 2
d:m:y h:m:s      d:m:y h:m:s,UUID - 1
d:m:y h:m:s      d:m:y h:m:s+1,UUID - 2
d:m:y h:m:s      d:m:y h:m:s+1,UUID - 3
此外,UUID在1:1关系中必须是唯一的。 文件1是IIS服务器日志。 文件2是Oracle服务器日志

最终目标是匹配到服务器日志之间的时间差,以找出哪些进程花费的时间太长

这有意义吗?代码如下

private void btnRun_Click(object sender, EventArgs e)
{
    // open server file
    StreamReader readServerFile = new StreamReader(strServerFile);
    readServerFile.ReadLine();

    // open message file
    StreamReader readMessageLog = new StreamReader(strMessageLog);
    readMessageLog.ReadLine();

    // write line to file - false does not append
    StreamWriter writer = new StreamWriter(strSavedLog, true);
    string strHeader = "Ast Timestamp,Method,Service,IP Address,Time Taken, Time Taken(s),Log Filename,UUID,Request Created,Request Type,Response Created,Result Description,Sender,Time Span,Resp-Req(s)";
    writer.WriteLine(strHeader);

    // loop through server file and copy to save log
    foreach (string strServerLine in File.ReadLines(strServerFile))
    {
        string[] ServerLogWord = strServerLine.Split(',');

        if (ServerLogWord[0] != "Ast Timestamp")
        {
            // extract - server log "Ast Timestamp" convert to date
            string strServerLogAstTimestamp = ServerLogWord[0];
            string AstServerLogTimestamp = strServerLogAstTimestamp.ToString();

            DateTime ServerFileLogDateTime = DateTime.ParseExact(AstServerLogTimestamp, "dd/MM/yyyy hh:mm:ss tt", null);

            // convert time taken in MS to Sec
            int timeTaken = Convert.ToInt32(ServerLogWord[4]);
            int timeTakenSeconds = timeTaken / 1000;

            // loop through message file
            foreach (string strMessageLine in File.ReadLines(strMessageLog))
            {
                string[] MessageLogWord = strMessageLine.Split(',');

                if (MessageLogWord[0] != "ID")
                {
                    // extract - message log - "requestcreated" convert to date
                    string strMessageLogRequestCreated = MessageLogWord[2];
                    string AstMessageLogRequestCreated = strMessageLogRequestCreated.ToString();
                    DateTime MessageLogDateTimeRequestCreated = Convert.ToDateTime(AstMessageLogRequestCreated);

                    // extract - message log - "responsecreated" convert to date
                    string strMessageLogResponseCreated = MessageLogWord[5];
                    string AstMessageLogResponseCreated = strMessageLogResponseCreated.ToString();
                    DateTime MessageLogDateTimeResponseCreated = Convert.ToDateTime(AstMessageLogResponseCreated);

                    // time calculations
                    // calculate timespan
                    TimeSpan ts = MessageLogDateTimeResponseCreated.Subtract(ServerFileLogDateTime);
                    // ***** Change x to modify the time range, must add + or -:  -----  'AddSeconds(x)'
                    DateTime desiredTime = ServerFileLogDateTime.AddSeconds(1);

                    // calculate the time  
                    TimeSpan respReqTimeTaken = MessageLogDateTimeResponseCreated.Subtract(MessageLogDateTimeRequestCreated);

                    // if timestamps match
                    if (MessageLogDateTimeResponseCreated == ServerFileLogDateTime && MessageLogDateTimeRequestCreated <= desiredTime)
                    {
                       if (ServerFileLogDateTime)
                       {
                          string SavedLog = string.Join(",", AstServerLogTimestamp, ServerLogWord[1], ServerLogWord[2], ServerLogWord[3], ServerLogWord[4], timeTakenSeconds, ServerLogWord[5], MessageLogWord[1], AstMessageLogRequestCreated, MessageLogWord[3], AstMessageLogResponseCreated, MessageLogWord[7], MessageLogWord[9], ts, respReqTimeTaken);
                          // write line to save log
                          writer.WriteLine(SavedLog);
                       }
                    }
                }
            }
        }
    }
    writer.Close();
    MessageBox.Show("Complete");
}
private void btnRun\u单击(对象发送方,事件参数e)
{
//打开服务器文件
StreamReader readServerFile=新的StreamReader(strServerFile);
readServerFile.ReadLine();
//打开消息文件
StreamReader readMessageLog=新的StreamReader(strMessageLog);
readMessageLog.ReadLine();
//将行写入文件-false不追加
StreamWriter writer=新的StreamWriter(strSavedLog,true);
string stream strHeader=“Ast时间戳、方法、服务、IP地址、花费的时间、花费的时间、日志文件名、UUID、创建的请求、请求类型、创建的响应、结果描述、发送方、时间跨度、响应请求”;
writer.WriteLine(strHeader);
//循环浏览服务器文件并复制以保存日志
foreach(文件中的字符串strServerLine.ReadLines(strServerFile))
{
字符串[]ServerLogWord=strServerLine.Split(',');
if(ServerLogWord[0]!=“Ast时间戳”)
{
//提取-服务器日志“Ast时间戳”转换为日期
字符串strServerLogAstTimestamp=ServerLogWord[0];
字符串AstServerLogTimestamp=strServerLogAstTimestamp.ToString();
DateTime ServerFileLogDateTime=DateTime.ParseExact(AstServerLogTimestamp,“dd/MM/yyyy hh:MM:ss tt”,null);
//将以毫秒为单位的时间转换为秒
int timetake=Convert.ToInt32(ServerLogWord[4]);
int timeTakenSeconds=所用时间/1000;
//循环浏览消息文件
foreach(File.ReadLines中的字符串strMessageLine(strMessageLog))
{
字符串[]MessageLogWord=strMessageLine.Split(',');
if(MessageLogWord[0]!=“ID”)
{
//摘录-消息日志-“requestcreated”转换为日期
字符串strMessageLogRequestCreated=MessageLogWord[2];
字符串AstMessageLogRequestCreated=strMessageLogRequestCreated.ToString();
DateTime MessageLogDateTimeRequestCreated=Convert.ToDateTime(AstMessageLogRequestCreated);
//摘录-消息日志-“responsecreated”转换为日期
字符串strMessageLogResponseCreated=MessageLogWord[5];
字符串AstMessageLogResponseCreated=strMessageLogResponseCreated.ToString();
DateTime MessageLogDateTimeResponseCreated=Convert.ToDateTime(AstMessageLogResponseCreated);
//时间计算
//计算时间跨度
TimeSpan ts=MessageLogDateTimeResponseCreated.Subtract(ServerFileLogDateTime);
//******更改x要修改时间范围,必须添加+或-:-----“添加秒数(x)”
DateTime desiredTime=ServerFileLogDateTime.AddSeconds(1);
//计算时间
TimeSpan RespreqTimeTake=MessageLogDateTimeResponseCreated.Subtract(MessageLogDateTimeRequestCreated);
//如果时间戳匹配

如果(MessageLogDateTimeResponseCreated==ServerFileLogDateTime&&MessageLogDateTimeRequestCreatedIIS日志中有一列名为“所用时间”,它被定义为“操作所用的时间长度,以毫秒为单位”。通过检查此列的值,可以知道每个请求所用的时间

请检查此链接

还可以尝试LogParser,它是检查IIS日志的好工具


您的解决方案很有创意,但我认为它不是理想的方法。

您的目的是“找出哪些进程花费的时间太长”。只需查看IIS日志,您就可以找到“哪个请求运行时间最长”。不建议在IIS和Oracle日志之间匹配时间戳。嗨,Eric,我感谢您的帮助。我正在尝试了解一些Web服务的最新情况,这些Web服务会从屏幕上消失,或者完全崩溃。我希望完成的是找出哪些进程正在崩溃/挂起系统。这是一个ASP网站,可以与th IIS、Oracle和ArcSDE。因此,尝试比较服务器日志。我认为您的ASP站点必须托管在web服务器上,通常是IIS。您可以先检查IIS日志,找出哪个请求运行时间最长或返回错误代码。然后检查请求中发生的情况。感谢Eric,我感谢您抽出时间来查看lp是一个家伙。老板仍然希望编写代码,所以我基本上列出了两个列表,并使用timespan在-1、0和0秒之间进行匹配,读取一个文件,然后以1:1的比例读取下一个文件。然后,我编写了与流氓服务器文件不匹配的服务器文件。我发现服务器文件中会有一行不匹配的奇数与下一行匹配,当我删除不匹配的服务器文件行并再次循环通过这些行,它们将匹配。刚刚从老板那里得到消息..项目完成..很好。