2

過去 6 週間ほど c# を学んでいる人に、やや難しい質問があります。

配列にストリーミングする 2 つのコンマ区切りファイルがあります。最初の列には d:m:yh:m:s があります。カンマ区切りの 2 番目のテキスト ファイルと一致させる必要があります。2 番目のファイルの d:m:yh:m:s を最初のファイルと一致させる必要があります。唯一の問題は、秒が同じ秒または秒 + 1 に一致する必要があり、その行を 3 番目のファイルに出力する必要があることです。

たとえば、次のことができます。

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");
}
4

1 に答える 1

0

IISログには「time-taken」という列があり、「アクションにかかった時間の長さ(ミリ秒単位)」として定義されています。この列の値を確認することで、各リクエストにかかる時間がわかります。

このリンクを確認してくださいW3C拡張ログファイル形式(IIS 6.0)

LogParserも試してみてください。これは、IISログを調べるための優れたツールです。

あなたの解決策は創造的ですが、それが理想的なアプローチではないと思います。

于 2012-11-16T02:47:17.330 に答える