1. 애플리케이션 로그란? 
    1. 시스템 상태, 애플리케이션의 동작, 문제 발생 원인 등을 파악하는 데 중요한 정보를 제공한다.
    2. 애플리케이션의 내부 동작 추적 및 문제 발생 원인을 분석하며, 전반적인 상태 모니터링에 도움을 준다.
  2. 애플리케이션 로그 확인 방법
    1. 리눅스/유닉스 시스템
      • /var/log/app_name/ 또는 /opt/app_name/logs/와 같은 경로에 저장된다.
      • `cat 경로` 또는 `tail -f 경로` 로 파일을 열 수 있다.
    2. 윈도우
      • C:\Program Files\AppName\logs\ 또는 C:\AppName\logs\와 같은 경로에 저장된다.
      • 텍스트 편집기를 사용하여 해당 파일을 열 수 있다.
    3. MacOS
      • /var/log/ 경로에 system.log 또는 install.log 파일로 저장된다.
      • Finder 또는 터미널을 통해 직접 접근할 수 있다. 
  3. 일반적인 로그 파일 형식과 분석 방법
    1. 로그 파일 형식
      • 타임스탬프 : 로그가 기록된 시간과 날짜를 나타낸다.
      • 로그 레벨 : 로그의 심각도 수준을 나타낸다. INFO, DEBUG, WARNING, ERROR, CRITICAL 등이 있다.
      • 메시지 : 이벤트에 대한 설명이나 작업의 세부 정보를 제공한다.
      • 모듈/파일명 : 로그 생성 코드의 파일명이나 모듈명이 포함된다.
      • 라인 번호 : 로그가 생성된 코드의 줄 번호를 의미한다.
      • 스레드 ID : 로그가 기록된 스레드의 ID 가 포함된다.
      • 스택 트레이스 : 예외나 오류가 발생 시, 문제가 발생 코드의 위치나 함수 호출 경로를 보여주는 디버깅 종류
        • 예외 타입과 메시지 : 예외의 종류와 관련된 에러 메시지가 노출된다.
        • 메서드 호출 순서 : 예외 발생까지의 호출 경로를 보여준다. (마지막 메서드가 스택의 가장 위에 있음)
        • 파일 이름 및 라인 : 문제 발생 코드의 파이라 이름과 라인 번호가 표시된다.
    2. 로그 분석 방법
      • 타임스탬프를 기준으로 로그를 정렬한다.
      • 로그 레벨을 필터링하여 중요한 문제를 우선적으로 식별한다.
      • 특정 키워드나, 에러 코드, 사용자 ID 등을 검색하여 관련 로그를 필터링한다.
      • 예외 로그의 스택 트레이스를 통해 문제의 원인이 되는 코드 라인을 식별하고 검토한다.
      • 특정한 이벤트나 오류가 얼마나 자주 발생하는 지 파악하여 반복적인 문제를 식별한다.
    3. 로그 예시를 통한 정보 파악.
      • 정보 로그 (INFO로그)
        2024-08-25 14:32:01,123 INFO [main] com.example.MyApp - Application started successfully.
        • 타임스탬프 : 2024-08-25 14:32:01,123
        • 로그 레벨 : INFO
        • 스레드 이름 : [main]
        • 클래스명 : com.example.MyApp
        • 메시지 : Application started successfully
      • 디버그 로그 (DEBUG 로그)
        2024-08-25 14:32:02,456 DEBUG [main] com.example.MyApp - Initializing configuration settings: { "setting1": "value1", "setting2": "value2" }

        • 타임스탬프 : 2024-08-25 14:32:02,456
        • 로그 레벨 : DEBUG
        • 스레드 이름 : [main]
        • 클래스명 : com.example.MyApp
        • 메시지 : Initializing configuration settings: { "setting1": "value1", "setting2": "value2" }
      • 경고 로그 (WARNING 로그)
        2024-08-25 14:33:05,789 WARN [main] com.example.MyApp - The configuration file is missing some optional settings.

        • 타임스탬프 : 2024-08-25 14:33:05,789
        • 로그 레벨 : WARN
        • 스레드 이름 : [main]
        • 클래스명 :  com.example.MyApp
        • 메시지 : The configuration file is missing some optional settings.
      • 오류 로그 (ERROR 로그)
        2024-08-25 14:34:12,987 ERROR [main] com.example.MyApp - Failed to connect to database: Connection timeout.

        • 타임스탬프 : 2024-08-25 14:34:12,987
        • 로그 레벨 : ERROR
        • 스레드 이름 : [main]
        • 클래스명 : com.example.MyApp
        • 메시지 : Failed to connect to database: Connection timeout.
      • 예외 로그 (EXCEPTION 로그)
        2024-08-25 14:35:23,654 ERROR [main] com.example.MyApp - Exception occurred while processing request
        java.lang.NullPointerException: Cannot invoke "String.length()" because "str" is null
            at com.example.MyApp.processRequest(MyApp.java:123)
            at com.example.MyApp.main(MyApp.java:45)

        • 타임스탬프 : 2024-08-25 14:35:23,654
        • 로그 레벨 : ERROR
        • 스레드 이름 : [main]
        • 클래스명 : com.example.MyApp
        • 메시지 : Exception occurred while processing request
        • 예외 정보 : java.lang.NullPointerException: Cannot invoke "String.length()" because "str" is null
        • 스택 트레이스
          - at com.example.MyApp.processRequest(MyApp.java:123)
          - at com.example.MyApp.main(MyApp.java:45)
  4. 로그 분석 도구
    1. 로그 분석 도구 사용하는 이유
      • 로그 파일이 크거나 분석이 복잡한 경우, 분석 도구를 사용하는 것이 유용할 수 있다.
    2. 로그 분석 도구 예시
      • ELK Stack : 로그 데이터를 수집, 분석, 시각화하는 데 사용되는 강력한 오픈 소스 도구 모음이다.
      • Splunk : 실시간 로그 분석과 모니터링을 위한 상용 도구이다
      • Graylog : 오픈 소스 로그 관리 도구로, 실시간 로그 분석 및 알림 기능을 제공한다.
      • Pappertrail, Loggly, Datadog : 클라우드 기반 로그 관리 분석 서비스 도구로, 로그 수집 및 모니터링을 지원한다.
  5. 로그를 통한 오류 발견 및 해결.
    1. 로그 레벨 설정 
      • 로그의 세부 수준을 설정한다.
      • 보통 DEBUG, INFO, WARNING, ERROR, CRITICAL 수준이 있다.
      • 일반적으로 개발 및 테스트 환경에서는 DEBUG수준까지 포함한 세부 로그를 수집한다.
      • 일반적으로 운영 환경에서 INFO 이상만 수집한다. 
    2. 로그 분석 및 모니터링
      • 로그 파일에서 'ERROR' 또는 'WARNING'수준의 로그를 필터링하여 문제를 확인한다.
        • grep -E "ERROR | WARNING" /path/to/logfile.log
      • 로그에서 반복적으로 발생하는 패턴을 찾고, 반복되는 원인의 코드 부분을 집중적으로 분석한다.
      • 모니터링 도구를 통해 실시간으로 로그를 감시하고, 특정 조건에 맞춰 알림을 설정한다.
    3. 오류 분석 및 원인 파악
      • 로그에 스택 트레이더스 포함된 경우, 가장 위 예외부터 읽음으로써 문제의 근본 원인을 파악한다.
      • 오류 발생 시점과 시스템 이벤트를 비교하여 관련성을 파악한다.
      • 동일 시간대의 다른 로그 메시지를 검색하여 관련 이벤트나 경고를 확인한다.
    4. 문제 해결 및 검증
      • 로그에 발견된 문제를 바탕으로 코드를 검토하여 문제의 원인을 수정한다.
      • 문제 수정 후 테스트 환경에서 동일한 시나리오를 실행하여 문제가 해결되었는지 검증한다.
      • 발견된 문제애 대해 자세한 로깅을 추가하여 더 명확한 정보를 제공하도록 개선한다.
    5. 주기적인 로그 검토
      • 주기적으로 로그 파일을 검토하여 새 문제느 패턴을 발견한다.
      • 로그 파일이 너무 커지지 않도록 로그 회전 설정을 하고, 오래된 로그는 보관하거나 삭제한다.
    6. 문서화 및 보고
      • 발생한 오류와 해결방법을 문서화하여 유사 문제 발생 시, 빠르게 대처할 수 있다.
      • 팀원들과 문제 해결 과정을 공유하여 유사 문제를 빠르게 해결할 수 있도록 한다.