LogParser를 이용한 exchange 로그 분석
12420 단어 Exchange
최근에 만든 exchange 모니터링 시스템에서 로그 로그를 분석해야 하는데 또 그를 꺼내서 상세하게 연구했다.
LogParser 기본 용도는 다음과 같습니다.
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는 모든 것을 데이터 분석에 사용하고 데이터 가져오는 데 강력한 도구이며 속도가 매우 빠르다.