로그 저장 및 파일 생성 함수 구현 코드 (DIMSystem::LogDump)

로그 저장 및 파일 생성 함수 구현 코드 (DIMSystem::LogDump)

코딩에서 로그(LOG)의 중요성과 구현 방법

코딩에서 로그는 프로그램의 실행 상황과 동작에 대한 정보를 기록하는데 사용됩니다. 로그는 디버깅, 코드 분석, 오류 해결 등을 위해 매우 중요한 역할을 합니다. 로그는 일반적으로 시스템의 이벤트와 상태 정보를 기록합니다. 예를 들어 보면, 다음과 같습니다.

  • 프로그램이 실행될 때, 로그는 프로그램이 시작되었다는 메시지를 기록할 수 있습니다. 
  • 프로그램에서 중요한 데이터가 생성되거나 처리되는 경우, 로그는 해당 데이터를 기록합니다. 
  • 오류 메시지를 기록하여 문제를 해결할 수 있는 데 필요한 정보를 제공합니다. 
  • 로그는 파일, 데이터베이스 또는 콘솔 등에 저장됩니다. 
  • 프로그래머는 로그를 분석하여 문제점을 파악하고 해결할 수 있습니다. 
  • 프로그램의 성능과 사용 패턴에 대한 정보를 제공하기 때문에, 개발자들은 로그를 분석하여 프로그램의 최적화 및 개선을 위한 인사이트를 얻을 수 있습니다.  

코딩에서 로그(Log)는 매우 중요한 요소입니다. 로그는 프로그램의 실행 중에 발생하는 이벤트, 오류, 경고 등의 정보를 기록하는 기능을 말합니다. 로그는 다음과 같은 이유로 중요합니다.

  • 디버깅 및 문제 해결: 로그는 프로그램 실행 중에 발생하는 오류와 예외 상황을 기록합니다. 이를 통해 프로그램의 동작을 추적하고, 문제의 원인을 분석하여 디버깅과 문제 해결을 수행할 수 있습니다. 로그에는 오류 메시지, 스택 트레이스, 변수 값 등의 정보가 포함되어 있어 개발자에게 유용한 정보를 제공합니다.
  • 모니터링과 성능 분석: 로그는 프로그램의 실행 정보를 기록하기 때문에 시스템의 상태와 성능을 모니터링하는 데 도움이 됩니다. 로그를 분석하여 CPU 사용량, 메모리 사용량, 네트워크 트래픽 등의 지표를 파악할 수 있으며, 성능 개선 및 최적화에 도움을 줍니다.
  • 보안 및 감사 추적: 로그는 시스템의 보안 측면에서도 중요한 역할을 합니다. 로그는 프로그램에 접근한 사용자, 실행된 작업, 보안 이벤트 등을 기록하여 보안 위반 사례를 탐지하고 추적할 수 있습니다. 또한, 로그는 감사 추적에 활용되어 특정 작업이나 변경 사항의 기록을 남길 수 있습니다.
  • 운영과 유지 보수: 로그는 소프트웨어의 운영 및 유지 보수에 필요한 정보를 제공합니다. 프로그램의 동작과 상태에 대한 로그를 분석하여 장애를 예방하거나 조치를 취할 수 있으며, 시스템의 이상 동작을 파악하고 대응할 수 있습니다.
  • 데이터 분석과 추이 분석: 로그에는 프로그램 실행 중에 발생한 다양한 정보가 포함되어 있습니다. 이를 분석하여 사용자 동작 패턴, 트랜잭션 추이, 시스템 이벤트 등을 파악할 수 있습니다. 이를 통해 데이터 기반의 의사 결정을 내리고, 사용자 행동에 대한 인사이트를 도출할 수 있습니다.

로그는 개발 및 운영 단계에서 프로그램의 동작과 상태를 이해하고 분석하는 데 큰 도움을 주는 도구입니다. 적절하게 구성된 로그는 소프트웨어의 안정성, 보안성, 성능 향상 등을 위해 필수적인 요소입니다.

데이터 수신 확인을 위한 파일 로그 작성 함수 코드

수신되는 데이터를 파일에 write하여 어떤 데이터가 들어오는지 확인하는 소스 코드입니다. 데이터의 크기만큼을 헥사코드로 출력하며, 출력되는 시간을 로그에 기록하여 어느 시간대에 수신된 데이터인지를 확인할 수 있습니다. 

아래에 참고로 기술한 코드는 수신된 데이터를 확인하기 위한 로그 저장 및 파일 생성 함수 구현 코드입니다. 함수는 메시지형태, 수신데이터, 데이터의 길이를 매개변수로 받으며, 수신된 데이터를 저장하여 파일로 생성하는 기능을 합니다. 코드 내에는 파일 이름 및 경로 생성, 파일 생성, 데이터 저장 등의 기능이 구현되어 있습니다.

/**
    @brief - 데이터 수신 확인용 코드
    @param - msg_type(메시지형태), *buffer(수신데이터), buffer_length(데이터의 길이)
    @exception - 예외처리
*/
void DIMSystem::LogDump( char msg_type, char * buffer, int buffer_length )
{
SYSTEMTIME st; ///< 수신되는 시간을 확인하기 위한 시간
char msg[4096]; ///< 생성되는 메시지 저장 공간
GetLocalTime( & st ); ///< 시스템의 현재 시간을 읽기
memset( msg, 0x00, sizeof(msg) ); ///< 저장 공간을 초기화
for( int i=0;i<buffer_length;i++ ) ///< 길이만큼 반복-수신 데이터를 저장 공간에 쌓기
{
char t[8]; ///< 한 바이트를 저장
memset( t, 0, sizeof(char) * 8 ); ///< 초기화
sprintf( t, "%02X ", (unsigned char)buffer[i] ); ///< 한 바이트를 저장
strcat( msg, t ); ///< 최종 출력 변수에 저장
}
strcat( msg, "\n" ); ///< 개행
char filename[1024]; ///< 파일 이름을 저장하는 변수
#if 1 ///< 전처리문으로 아래 코드를 처리할지 여부를 결정
sprintf( filename, "%s\\LOG\\%04d_%02d_%02d", g_ExePath, st.wYear, st.wMonth, st.wDay ); ///< 파일 폴더명을 생성
_mkdir( filename ); ///< 폴더을 생성
sprintf( filename, "%s\\LOG\\%04d_%02d_%02d\\%s_%02d_%02d_%02d_%02d.txt", g_ExePath, st.wYear, st.wMonth, st.wDay, 
GetIP(), st.wYear, st.wMonth, st.wDay, st.wHour); ///< 저장할 파일명을 생성

#else
//sprintf( filename, "D:\\%s.txt", GetIP() );
#endif
#if 1
FILE * fp = fopen( filename, "at" );
if( fp )
{
fprintf( fp, "%02d.%02d %02d:%02d:%02d %03d|%c|%s"
, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds
, msg_type
, msg);
fclose(fp);
}
#else
///< 잦은 open, close는 시스템에 부하를 주고, 패킷 수신 및 전송 속도 저하의 원인.
///< open/close 동작을 한번 수행
if(m_fp == NULL)
m_fp = fopen( filename, "at" );
if( m_fp )
{
fprintf( m_fp, "%02d.%02d %02d:%02d:%02d %03d|%c|%s"
, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds
, msg_type
, msg);
//fclose(fp);
}
#endif
}

C언어에서 FILE 구조체를 이용한 파일 입출력 기능에 대해 알아보기

C언어에서 FILE은 파일과 관련된 정보를 저장하는 데이터 형식입니다. FILE은 파일을 열고, 읽고, 쓰고, 닫을 때 사용됩니다. 파일은 데이터를 영구적으로 저장할 수 있는 메모리 영역입니다. FILE 구조체는 이러한 파일을 읽거나 쓰기 위한 접근 방법을 제공합니다. FILE 구조체는 파일의 이름, 파일 위치, 읽기 및 쓰기 작업을 수행하기 위한 포인터 등 파일과 관련된 정보를 저장합니다. C언어에서 FILE 구조체는 파일 입출력 함수에서 사용됩니다. 입출력 함수의 기능은 다음과 같습니다.

  • 파일을 열 때는 fopen() 함수 사용 
  • 파일을 닫을 때는 fclose() 함수 사용 
  • fread() 함수는 파일에서 데이터를 읽어 메모리 로딩 
  • fwrite() 함수는 메모리에 저장된 데이터를 파일 write 

FILE 구조체는 텍스트 파일과 이진 파일 모두에서 사용됩니다. 텍스트 파일에서는 문자열과 같은 문자 데이터를 파일에 쓰고, 읽을 수 있습니다. 이진 파일에서는 정수, 실수 및 다른 데이터 형식을 파일에 저장할 수 있습니다. FILE 구조체는 C언어에서 파일을 다루는데 필수적인 요소입니다. 파일 처리는 프로그램에서 매우 중요한 기능 중 하나이며, FILE 구조체를 이용하여 파일을 다루면서 프로그램에서 필요한 데이터를 영구적으로 저장하고, 파일에서 데이터를 읽어와서 사용할 수 있습니다. 

C언어에서 파일에 서식을 지정하여 출력하는 fprintf 함수

C언어에서 fprintf 함수는 파일에 서식을 지정하여 데이터를 출력하는 함수입니다. fprintf 함수는 출력 대상이 파일일 때 사용되며, printf 함수와 유사한 방식으로 사용됩니다. 따라서, 로그를 출력하는데, 가장 중요한 것이 파일에 기록를 하는 것이 필수입니다. 파일 기록을 위해서 fprintf 함수를 사용하게 됩니다. fprintf 함수는 다음과 같은 구조를 가집니다.

  • int fprintf(FILE *stream, const char *format, ...);

첫 번째 매개변수인 stream은 출력 대상 파일을 지정합니다. 두 번째 매개변수인 format은 출력할 서식을 지정하는 문자열입니다. 이후의 매개변수들은 출력할 데이터입니다. fprintf 함수는 지정된 서식 문자열에 맞게 출력을 수행합니다. 서식 문자열은 % 기호와 함께 출력할 데이터의 형식을 지정합니다. 서식 문자열 내의 % 기호는 출력할 데이터의 형식과 매칭되는 데이터를 받아 출력합니다.

아래는 fprintf 함수를 사용하여 파일에 문자열과 정수를 출력하는 예시입니다.

#include <stdio.h>
int main() 
{
    FILE *fp; ///< 파일 포인터 선언
    char str[] = "Hello, world!"; ///< 출력할 문자열 선언
    int num = 123; ///< 숫자 선언
    fp = fopen("output.txt", "w"); ///< 출력 파일을 쓰기용으로 열기
    fprintf(fp, "%s %d", str, num); ///< 파일에 문자와 숫자를 출력
    fclose(fp); ///< 파일에 문자 쓰기가 끝나면 파일 닫기
    return 0; ///< 프로그램 종료
}

위 예시에서는 파일 포인터인 fp를 이용하여 "output.txt" 파일을 쓰기 모드로 열고, fprintf 함수를 사용하여 문자열과 정수를 파일에 출력합니다. 이후 파일 포인터를 닫아주는 fclose 함수를 사용하여 파일을 닫습니다.

위 코드를 실행하면 "output.txt" 파일에 "Hello, world! 123"이라는 문자열이 출력됩니다.

로그 생성 시 주의해야 할 요소와 관리 방법

로그 생성 시 주의해야 할 몇 가지 요소는 다음과 같습니다.
  • 필요한 로그만 생성하기: 로그는 시스템 동작 및 문제 해결을 추적하는 데 도움을 주지만, 불필요하거나 중복된 로그를 생성하면 디스크 공간을 낭비하고 로그 분석을 어렵게 할 수 있습니다. 필요한 정보만 로깅하도록 설정하고, 중요한 이벤트나 오류에 대해서만 로그를 생성하도록 관리해야 합니다.
  • 로그 포맷과 구조 정의하기: 로그의 일관된 포맷과 구조를 정의하는 것은 로그를 읽고 분석하기 쉽게 만듭니다. 일관성 있는 로그 포맷을 사용하여 필요한 정보를 포함하고, 시간 정보, 이벤트 유형, 상태 등을 명확히 기록해야 합니다.
  • 중요한 정보 포함하기: 로그에는 중요한 정보가 포함되어야 합니다. 예를 들어, 발생한 이벤트의 시간, 사용자 정보, 오류 메시지, 예외 스택 트레이스 등을 포함해야 합니다. 이러한 정보는 문제 해결과 디버깅에 도움을 줄 수 있습니다.
  • 보안에 대한 고려: 로그는 시스템 동작에 대한 정보를 담고 있으므로 보안에 민감한 정보가 노출되지 않도록 해야 합니다. 개인 식별 정보(PII), 비밀번호, 중요한 데이터 등의 민감한 정보는 로그에 기록하지 않아야 합니다. 필요한 경우 로그에서 민감한 정보를 필터링하거나 익명화하는 방법을 사용해야 합니다.
  • 로그 수준 관리하기: 로그는 다양한 수준으로 구성될 수 있습니다. DEBUG, INFO, WARNING, ERROR 등의 로그 수준을 설정하여 필요한 로그 레벨을 지정하고, 로그의 중요성에 따라 적절한 수준을 선택해야 합니다. 너무 많은 디버그 로그는 성능에 영향을 미칠 수 있으므로 주의해야 합니다.
  • 로그 저장 및 관리: 로그는 적절한 위치에 저장 및 관리되어야 합니다. 로그를 중앙 집중화된 로그 서버에 저장하거나 외부 저장소에 보관함으로써 로그 분석과 문제 해결을 용이하게 할 수 있습니다. 또한, 로그 파일의 크기와 보관 기간에 대한 정책을 설정하여 디스크 공간을 효율적으로 관리해야 합니다.
  • 로그 분석과 모니터링: 로그는 문제를 진단하고 시스템 동작을 모니터링하는 데 중요한 도구입니다. 로그를 분석하고 주요 이벤트를 모니터링하여 시스템 상태를 파악하고 문제를 조기에 감지할 수 있도록 해야 합니다. 적절한 로그 분석 도구를 사용하고, 로그 모니터링 시스템을 구축하여 중요한 이벤트나 경고를 실시간으로 감지할 수 있도록 해야 합니다.
이러한 주의 사항을 고려하여 로그 생성과 관리를 수행하면 시스템의 문제 해결과 성능 향상에 도움이 될 수 있습니다.

댓글 쓰기

다음 이전