7.로그 남기기 기능

온라인 게임을 개발하다 보면 여러가지 실행 기록(로그)를 남기는 기능이 필요하기 마련입니다. ProudNet은 이를 위한 로그 남기기 기능을 제공합니다.

그림 7-1Windows도 이벤트 로그를 남기는 기능이 있습니다.

ProudNet의 로그 남기기 기능은 비동기로 실행됩니다. 즉, 로그를 남기겠다는 메서드를 호출하는 즉시 메서드는 리턴합니다. 그리고 별도의 스레드에서 실제 로그를 파일이나 데이터베이스에 기록합니다.

ProudNet은 다음과 같은 형태로 로그를 남기는 기능을 제공합니다.

7.1파일에 로그를 기록하기

Proud::CLogWriter클래스는 파일에 로그를 기록할수 있게 해주는 클래스 입니다.

7. 로그 남기기 기능에서 설명하고 있듯이 이 기능은 비동기로 실행됩니다.

일반적인 사용법은 아래 code를 참고 하십시오.

// CLogWriter를 생성한다.
CAutoPtr<Proud::CLogWriter> logwriter;
logwriter.Attach(Proud::CLogWriter::New(L"log.txt"));

// 로그를 써봅시다. 2개의 WriteLine함수를 제공합니다.
logwriter->WriteLine( Proud::TraceID::TID_System, L"시스템로그 입니다. );
logwriter->WriteLine( "%d번째 로그입니다.", 1 );

// 새로운 Log File로 바꿔봅시다. 만약 새로운 파일 생성이 실패하면 Proud::Exception 으로 예외처리 됩니다.
logwriter->SetFileName(L"log2.txt);

7.2데이터베이스에 로그를 기록하기

Proud::CDbLogWriter 클래스는 DB에 로그를 기록할수 있게 해주는 클래스 입니다.

7. 로그 남기기 기능에서 설명하고 있듯이 이 기능은 비동기로 실행됩니다.

이를 사용하기 위해서는 Sample/DbmsSchema 폴더에있는 LogTable.sql을 실행하여 LogTable을 미리 생성해주어야 합니다. DBMS 구축은 샘플 데이터베이스 구축하기 의 절차를 참고하십시오.

일반적인 사용법은 아래 code를 참고 하십시오.

// 에러를 받아 처리할 함수입니다.
class CTestLogWriterDelegate : public ILogWriterDelegate
{
    virtual void OnLogWriterException(Proud::AdoException& Err) override
    {
        // ...
    }
};

CTestLogWriterDelegate g_dblogDelegate;

void main()
{
    // ...
    // CDbLogParameter에 값을 채운다.
    Proud::CDbLogParameter dbparam;
    dbparam.m_dbmsConnectionString = L"Data Source=localhost;Database=Log-Test;Trusted_Connection=yes";
    dbparam.m_loggerName = L"LoggerName";
    dbparam.m_dbLogTableName = L"DbLog";

    // CDbLogWriter를 생성한다.
    CAutoPtr<Proud::CDbLogWriter> dbLogWriter;
    dbLogWriter.Attach(Proud::CDbLogWriter::New(dbparam, &g_dblogDelegate));
    
    // ProudNet에서 제공하지 않는 새로운 Field를 넣어봅시다.
    // 주의!! 사용자가 원하는 필드를 넣고싶을때에는 DBMS의 Log-Test Table에 미리 필드를 생성시켜 주어야 합니다.
    // TestField를 DBMS에 만들고 datatype은 int라고 했을때 아래구문처럼 CPropNode를 생성하여 WriteLine에 넣어주시면 됩니다.
    Proud::CProperty newnode;
    Proud::String TestField = L"TestField";
    Proud::CVariant TestValue = 123;
    newnode.Add(TestField, TestValue);
    dbLogWriter->WriteLine(L"로그 내용입니다.", &newnode);
    
    // ...
}