LogParser를 이용한 exchange 로그 분석

12420 단어 Exchange
LogParser 마이크로소프트가 개발한 강력한 로그 분석 소프트웨어로 그의 명성은 마이크로소프트와 합작 프로젝트를 할 때 들은 것이지만 당시에는 iis 로그를 분석하기 위해 사용했기 때문에 iis 로그를 데이터베이스에 쉽게 가져올 수 있었다.
최근에 만든 exchange 모니터링 시스템에서 로그 로그를 분석해야 하는데 또 그를 꺼내서 상세하게 연구했다.
LogParser 기본 용도는 다음과 같습니다.
  • Input Formats
  • Output Formats
  • Query Syntax

  • Input Formats는 분석 로그 파일 형식에 따라 내장된 일부 해상도를 선택할 수 있습니다. 그 중에서 가장 자주 사용하는 CSV 형식입니다.
    Output Formats 출력 파일의 형식은 명령행 모드에서 처리된 데이터를 내보내기 처리할 때 주로 사용됩니다.
    Query Syntax는logparser로 로그 파일을 분석할 때 파일을 데이터베이스 테이블로 이해할 수 있으며, 로그 파일에 대한 조회 필터링 등 기본적인 sql 문장을 실행할 수 있습니다.
    LogParser의 또 다른 강력한 점은 COM+로 변환하여 다른 언어를 호출할 수 있다는 것이다. 예를 들어 exchange 로그를 분석할 때 나는 사용한다.net에서 로그를 2차 처리합니다.
    이번 Exchange 로그 분석 방향:
    exchange 서버는 여러 개의 집단이기 때문에 로그는 여러 서버에 분산되고 로그는 중복되지 않기 때문에 이용합니다.net는 인터넷 이웃을 통해 여러 서버의 로그 디렉터리에 접근한 후 디렉터리에 대해 정해진 시간에 로그를 캡처하고 LogParser를 이용하여 로그를 간단하게 필터링한 후 데이터베이스에 부칩니다.프론트 데스크톱은 쏟아진 원시 데이터를 통해 데이터 분석을 한다.
    기본 코드 구현:
     1       using (IdentityScope c = new IdentityScope("mossadmin", "inet", "password")) // 
    
     2             {
    
     3                 var logs = System.IO.Directory.GetFiles(LogPath, "*.log") // , 
    
     4                     .Where(f => int.Parse(f.Substring(f.LastIndexOf('\\') + 7, 8)) >= _config.fileDT)
    
     5                     .OrderBy(f => int.Parse(f.Substring(f.LastIndexOf('\\') + 7, 8)))
    
     6                     .ToList();
    
     7 
    
     8                 if (logs.Count > 0)
    
     9                 {
    
    10                     DelOldLog(_config);
    
    11                     logs.ForEach(f =>
    
    12                     {
    
    13                         bind(f,_config.MacName);
    
    14                         _config.fileDT = int.Parse(f.Substring(f.LastIndexOf('\\') + 7, 8));
    
    15                         _config.modifyDT = new FileInfo(f).LastWriteTime;
    
    16                     });
    
    17                 }
    
    18             }

    LogParser 처리:
     1 static void bind(string logPath,string macName)
    
     2         {
    
     3             LogQuery oLogQuery = new LogQuery();// LogPaser 
    
     4             
    
     5             TsvInputFormat oTsvInputFormat = new TsvInputFormat();// 
    
     6             LogRecordSet oRecordSet;
    
     7             string query = string.Empty;
    
     8              
    
     9             DataTable dt = new DataTable();
    
    10             #region  --Log “reccode=” 
    
    11             query = @"select * from '" + logPath + "' where [event-id]='RECEIVE'";
    
    12 
    
    13             oTsvInputFormat.nSkipLines = 4;
    
    14             oTsvInputFormat.iCodepage = 65001;
    
    15 
    
    16             oRecordSet = oLogQuery.Execute(query, oTsvInputFormat);
    
    17             for (int i = 0; i < oRecordSet.getColumnCount(); i++)
    
    18             {
    
    19                 dt.Columns.Add(oRecordSet.getColumnName(i));
    
    20             }
    
    21             dt.Columns.Add("MacName");
    
    22             // 
    
    23             for (; !oRecordSet.atEnd(); oRecordSet.moveNext())
    
    24             {
    
    25                 DataRow dr = dt.NewRow();
    
    26                 for (int i = 0; i < oRecordSet.getColumnCount()-1; i++)
    
    27                 {
    
    28                     dr[oRecordSet.getColumnName(i)] = oRecordSet.getRecord().getValue(oRecordSet.getColumnName(i));
    
    29                 }
    
    30                 dr["MacName"] = macName;
    
    31                 dt.Rows.Add(dr);
    
    32             }
    
    33 
    
    34             oRecordSet.close();
    
    35             #endregion
    
    36             
    
    37             SqlBulkCopy sqlbulkcopy = new SqlBulkCopy(connectionString, SqlBulkCopyOptions.UseInternalTransaction);
    
    38             sqlbulkcopy.DestinationTableName = "LM_webLog";// 
    
    39             sqlbulkcopy.WriteToServer(dt);
    
    40 
    
    41             Console.WriteLine(dt.Rows.Count + ":" + logPath);
    
    42             
    
    43 
    
    44         }

    Exchange 로그 형식:
    #Software: Microsoft Exchange Server
    
    #Version: 14.0.0.0
    
    #Log-type: Message Tracking Log
    
    #Date: 2012-12-19T00:02:50.276Z
    
    #Fields: date-time,client-ip,client-hostname,server-ip,server-hostname,source-context,connector-id,source,event-id,internal-message-id,message-id,recipient-address,recipient-status,total-bytes,recipient-count,related-recipient-address,reference,message-subject,sender-address,return-path,message-info,directionality,tenant-id,original-client-ip,original-server-ip,custom-data

    Exchange의 로그 형식은 표준 csv와 약간 다르다. 파일 헤더에 주석이 있는 파일을 볼 수 있다. LogParser를 이용하여 처리할 때 정확한 열을 읽을 수 없다. 그리고 자신이 가지고 있는 도움말 문서를 연구할 때 원래 몇 줄을 뛰어넘어 처리할 수 있는지 지정할 수 있다.모든 것이 구글의 시대에 점점 더 열심히 자신의 도움말 문서를 보러 가지 않는다. 이것은 앞으로 구글에 너무 의존해서는 안 된다.
    oTsvInputFormat.nSkipLines = 4; // 
    
    oTsvInputFormat.iCodepage = 65001;// 

    요약:
    Logparser는 텍스트 형식 로그 처리를 할 때 확실히 강력하고 기본적으로 모든 형식의 데이터를 식별할 수 있으며 결합할 수 있다.net는 모든 것을 데이터 분석에 사용하고 데이터 가져오는 데 강력한 도구이며 속도가 매우 빠르다.

    좋은 웹페이지 즐겨찾기