[리포트] Microsoft Log Parser

  • Post author:
  • Post category:
  • Post comments:0 Comments
  • Post last modified:February 7, 2020

LogParser란?

LogParser는 텍스트 기반의 로그 파일을 SQL 쿼리로 분석할 수 있게 해주는 유용한 도구이다. 백문이불여일견이라 했으니, Log Parser Help 문서 첫 장을 살펴보자.

Help 문서 첫 장

데이터 검색하기

특정 사용자의 로그온 기록을 윈도우 이벤트 로그(제어판/관리도구/이벤트)에서 찾아보자.

C:\>LogParser "SELECT TimeGenerated, SourceName, EventCategoryName, Message INTO report.txt
	FROM Security WHERE EventID = 528 AND SID LIKE '%TESTUSER%'" -resolveSIDs:ON

그러면 텍스트 파일 형태의 결과를 얻을 수 있다.

[Log Parser] Text Report

리포트 생성하기

HTML 형태로 리포트를 생성하도록 사용자가 지정할 수 있다.

[Log Parser]  HTML Report

통계 내기

IIS 로그 파일에 기록된 HTTP 응답 코드의 분포를 분석해보자.

C:\>LogParser "SELECT sc-status, COUNT(*) AS Times INTO Chart.gif
	FROM <1> GROUP BY sc-status ORDER BY Times DESC" -chartType: PieExploded3D -chartTitle:"Status Codes"

이 명령은 차트 형태의 결과를 만들어낸다.

[Log Parser] Chart Report

주요 사이트

서버 관리자의 관점에서 보기

지원되는 파일 포맷

[Log Parser] Architecture

Log Parser는 IIS 로그나, CSV 파일을 엔진이 분석한 후에 차트 등의 형태로 결과를 생성한다. 기본적으로 IIS, CSV, XML 등 20 여 가지의 파일 포맷을 분석할 수 있다. 아파치 로그의 경우에는 NCSA 파일 포맷을 선택하면 된다.

업계에서 널리 쓰이는 파일 포맷은 괜찮지만 자신만의 포맷을 사용하는 곳에선 과연 어떨까? 이런 경우를 대비해서 Log Parser는 TEXTLINE, TEXTWORD라는 입력 포맷을 제공한다. 다음은 HTML 문서에서 링크를 가져오는 Log Parser 예제이다.

C:\Program Files\Log Parser 2.2>LogParser "SELECT Text FROM my_url WHERE Text LIKE '%href%'" -i:TEXTLINE
Text
--------------------------------------------------------------
<link rel="stylesheet" type="text/css" media="screen"
	href="my_url/index.php?css=weblog/css_weblog_screen"/>
<link rel="stylesheet" type="text/css" media="print"
	href="my_url/index.php?css=weblog/css_weblog_print"/>
Press a key...

샘플

[설치 경로\Samples]에는 다양한 예제가 있다. 특히 관리자가 눈여겨 봐야 할 것은 Queries, TemplateFiles 폴더이다. 다양한 쿼리 예제를 살펴볼 수 있다.

주의할 점

차트 형태로 리포트를 생성하기 위해서는 마이크로소프트 오피스가 설치되어 있어야 한다.

참고 문헌

    1. LogParser와 놀기_1

    2. LogParser와 놀기_2

    IIS로그를 이용해서 Unique Visit/Page View 같은 데이터들을 LogParser를 이용해서 뽑아버려고 마음을 먹고, 간략한 배치 파일을 만들어보았다.

    일단 스스로 생각한 시스템의 모양은 다음과 같다.

    • 서비스 하지 않는 하나의 서버를 관리서버로 두고, 그곳에 로그를 복사한다.

    • LogParser를 이용해서 UV와 PV를 집계한다.

    • UV의 기준은 하루에 방문한 클라이언트의 중복 없는 합계이다. 클라이언트는 IP로 구분한다.

    • PV 의 기준은 동적 페이지 및 정적 페이지를 요청한 것으로 집계한다. 여기서는 ASP.NET으로 웹 어플리케이션이 구성되어있기 때문에 확장자가 aspx, htm, html인 것에 대하서만 페이지로 정의한다. – Ajax.NET을 사용하기 때문에 경우에 따라서는 ashx, asmx 역시 페이지로 들어가야할 수 있지만 사용자가 명시적으로 ‘페이지’라고 생각하지 않는 부분에 대해서는 포함시키지 않기로 한다.

  • Visual LogParser – GUI 로그 파서 도구

  • Professor Windows: How LogParser Works

  • Graphing PING results

  • Generating XML output and Excel 2003 XML pivots

  • Auditing the Event Logs

  • Querying an RSS Feed

개발자 관점에서 보기

Log Parser로 무엇을 할 수 있나?

만약 게임 또는 서버 로그 분석 도구를 제작해야 한다면, Log Parser가 중요한 단서를 줄 수 있다. 윈도우 기반의 분석 도구라면 Log Parser의 기능을 그대로 가져다 쓸 수도 있다. COM API가 제공되므로 거의 모든 프로그래밍 언어와 상호작용을 할 수 있다.

하지만 비 윈도우 계열의 애플리케이션을 제작해야 한다면, COM을 쓸 수는 없을 것이다. 그러니 Log Parser의 기능을 가져다 쓸 수는 없을 것이다. 그렇더라도 Log Parser Help 문서 정도는 봐두면 좋다. Conceptual Overview나 COM API를 읽고 나면 Log Parser의 아키텍처가 머리 속에 그려질 것이다. 출시된 제품의 설계를 보고 분석하면 시행착오를 줄일 수 있다.

Log Parser COM API

Log Parser는 COM 기반으로 작성되었기 때문에, C++, C#, Visual Basic, 그리고 JScript 등의 언어를 사용하여 기능을 확장할 수 있다. 기능 확장은 매우 유용하지만, 한계도 갖고 있으므로 상황에 따라서는 Log Parser의 기능을 확장하는 것으론 부족할 수 있다. 이런 경우에는 자신만의 로그 분석 도구를 개발해야 할 것이다.

COM API로 할 수 있는 것

COM API로 고정된 형태의 로그 분석기를 개발할 수 있다. 일반적인 용도라면 간단한 스크립트만으로 로그 분석을 끝낼 수 있다. 하지만 어떤 때에는 로그 분석 애플리케이션이 필요할 수도 있다. Log Parser의 SQL 구문을 서버 관리자가 익힐 필요가 없게 애플리케이션에서 모든 것을 자동으로 처리하면 무척 편리할 것이다.

또한 Log Parser가 지원하지 않는 다양한 로그 포맷을 지원할 수도 있다. TEXTLINE, TEXTWORD 등의 범용 입력 포맷으로도 제대로 분석할 수 없는 포맷인 경우에 이런 방법이 무척 유용하다. [설치 경로/Samples/COM] 폴더에는 3개의 예제가 있다. 다음은 책 정보를 표현하는 XML 입력 파일과 그것을 분석하기 위한 C# 소스 코드의 일부이다.

/// <summary>LogParser COM Input format sample</summary>
namespace MSUtil.LogQuery.Sample
{
    public interface ILogParserInputContext
    {
        void OpenInput(string from);
        int GetFieldCount();
        string GetFieldName(int index);
        int GetFieldType(int index);
        bool ReadRecord();
        object GetValue(int index);
        void CloseInput(bool abort);
    }

    // TODO: Generate a unique GUID for your input format
    /// <summary>XMLInputFormat for LogParser</summary>
    [Guid( "FBB03457-D80A-4d83-AB3A-2DF63779DDC8" )]
    public class XMLInputFormat : ILogParserInputContext
    {
        // For an XML file, such as books.xml, the following 'fields' are available:
				// Author
				// Price
				// PubDate

        XmlDocument xmlFile;
        IEnumerator bookNodes;
        ArrayList xmlFields;

        #region LogField Class
        private class LogField
        {
            string fieldName;
            FieldType fieldType;

// 중략...
		}
// 중략...
	}
}
COM API로 할 수 없는 것

Log Parser Help 문서는 로그 파일 포맷의 확장에 대해서만 언급한다. 리포트 포맷의 형태를 확장할 수 있는지, 그렇다면 어떻게 하면 되는지는 문서만으로 알 수 없다.

MIN, MAX와 같은 기본적인 통계 명령은 지원하지만, 이것으로는 부족할지 모른다. 통계 기능의 확장을 위한 별도의 인터페이스가 없기 때문에 LogRecordSet를 순회하며 통계를 내야 할지도 모른다.

// Execute the query
LogRecordSet oRecordSet = oLogQuery.Execute(query, oEVTInputFormat);

// Browse the recordset
for(; !oRecordSet.atEnd(); oRecordSet.moveNext())
{
	Console.WriteLine(oRecordSet.getRecord().toNativeString(","));
}

참고 문헌

프로그래머의 입장에서 참고할 만한 문서는 Log Parser Help 정도이다.

Author Details
Kubernetes, DevSecOps, AWS, 클라우드 보안, 클라우드 비용관리, SaaS 의 활용과 내재화 등 소프트웨어 개발 전반에 도움이 필요하다면 도움을 요청하세요. 지인이라면 가볍게 도와드리겠습니다. 전문적인 도움이 필요하다면 저의 현업에 방해가 되지 않는 선에서 협의가능합니다.
0 0 votes
Article Rating
Subscribe
Notify of
guest

This site uses Akismet to reduce spam. Learn how your comment data is processed.

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments