Mattermost 로깅

Mattermost v11.11번역일: 2026-09-02원본 보기
중요

Mattermost v11부터 알림 로그 설정이 표준 콘솔 로그와 mattermost.log 파일로 통합되었습니다. 이제 기본 로그 레벨 설정이 서버 로그와 알림 로그를 함께 제어하므로, 고급 로깅 설정을 사용하지 않고는 알림 로깅을 비활성화할 수 없습니다.

AdvancedLoggingJSON 구성에서 개별 알림 로그 레벨인 NotificationError, NotificationWarn, NotificationInfo, NotificationDebug, NotificationTrace를 사용하면 알림 로그를 별도 파일로 분리해 문제 해결 시 발생하는 노이즈를 줄일 수 있습니다. 자세한 내용은 아래 고급 로깅 섹션을 참고하세요.

Mattermost는 서로 다른 운영·컴플라이언스 요구를 충족할 수 있도록 각각 별도의 로그 파일과 순환 정책으로 개별 구성할 수 있는 독립적인 로깅 시스템을 제공합니다.

로깅 유형 및 수집 대상운영 환경 권장 설정구성 우선순위

Log Settings

Mattermost 서버의 일반 작업 전반, 오류, 시작·초기화, API 호출, 시스템 이벤트. v11.0부터는 알림 서브시스템 이벤트도 포함합니다.

항상 활성화. Console: INFO, File: INFO 높음 — 운영에 필수

Audit Log Settings

보안 및 컴플라이언스 이벤트, 사용자 작업, API 접근, 인증 이벤트, 관리 변경 사항.

컴플라이언스가 필요한 경우 활성화 중간 — 규제 요구에 따라 결정

Notification Log Settings (v10.12 이하 릴리스에만 해당)

알림 서브시스템 이벤트, 푸시 알림, 이메일 발송, 모바일 알림 처리.

알림 문제 해결 시 활성화 낮음 — 문제를 디버깅할 때 활성화

기본적으로 모든 Mattermost 플랜은 로그를 콘솔과 mattermost.log 파일 양쪽에 기록하며, 로그 집계 도구가 읽을 수 있도록 기계 판독 가능한 JSON 형식을 사용합니다. Mattermost Enterprise 및 Professional 고객은 추가로 syslog와 TCP 소켓 대상 타깃에 직접 기록할 수 있습니다. 감사 로깅은 성능 영향을 최소화하도록 비동기 방식으로 설계되어 있습니다.

시스템 관리자는 업무 방식과 필요에 따라 System Console > Environment > Logging(시스템 콘솔 > 환경 > 로깅)으로 이동하거나 config.json 파일을 직접 편집해 다음 로깅 옵션을 맞춤 설정할 수 있습니다.

참고

Mattermost v11.3부터 AdvancedLoggingJSON 구성에는 표준 로그 레벨과 감사 로그 레벨을 올바르게 분리하도록 강제하는 강화된 검증이 포함됩니다.

  • 표준 로깅 구성은 감사 전용 로그 레벨(audit-api, audit-content, audit-permissions, audit-cli)을 거부합니다
  • 감사 로깅 구성은 표준 로그 레벨(debug, info, warn, error, fatal, panic 등)을 거부합니다
  • 구성 검증은 서버 시작 시점과 설정을 업데이트할 때 수행되어 잘못된 로그 레벨 조합을 방지합니다

콘솔 로그

콘솔 로그에는 일반 활동에 대한 상세한 debug 레벨 로그 메시지가 담기며, 표준 출력 스트림(stdout)을 통해 콘솔에 기록됩니다. 일반 활동에 대한 콘솔 로그는 맞춤 설정할 수 있습니다.

Mattermost v11.0부터 알림 로그는 기본 콘솔 로그에 자동으로 포함됩니다. 자세한 내용은 로깅 구성 설정을 참고하세요.

파일 로그

파일 로그에는 일반 활동에 대한 info 레벨 로그 메시지가 담기며, 여기에는 시작 시점의 오류와 정보, 초기화 및 웹훅 디버그 메시지가 포함됩니다. 파일은 ./logs/mattermost.log에 저장되고 100MB에서 순환되며, 같은 디렉터리에 별도 파일로 보관됩니다. 일반 활동에 대한 파일 로그는 맞춤 설정할 수 있습니다.

Mattermost v11.0부터 알림 로그는 기본 mattermost.log 파일에 자동으로 포함됩니다. 자세한 내용은 로깅 구성 설정을 참고하세요.

팁

mattermost.log 파일은 System Console > Reporting > Server Logs로 이동한 뒤 Download Logs를 선택해 로컬로 내려받을 수 있습니다.

로그 레코드는 필요에 따라 콘솔, 로컬 파일, syslog, TCP 소켓 타깃을 자유롭게 조합해 출력할 수 있으며, 각 타깃마다 추가 맞춤 설정을 제공합니다. 자세한 내용은 고급 로깅을 참고하세요.

로깅 출력 정의

일반 활동에 대한 로깅 출력은 시스템 콘솔에서 Environment > Logging > Advanced Logging으로 이동하거나 config.json 파일을 직접 편집해 JSON 형식으로 정의합니다.

아래 샘플 JSON을 출발점으로 사용할 수 있습니다.

v11 이상

{
    "console1": {
        "type": "console",
        "format": "json",
        "levels": [
            {"id": 5, "name": "debug", "stacktrace": false},
            {"id": 4, "name": "info", "stacktrace": false, "color": 36},
            {"id": 3, "name": "warn", "stacktrace": false},
            {"id": 2, "name": "error", "stacktrace": true, "color": 31},
            {"id": 1, "name": "fatal", "stacktrace": true, "color": 31},
            {"id": 0, "name": "panic", "stacktrace": true, "color": 31},
            {"id": 10, "name": "stdlog", "stacktrace": false},

            {"id": 300, "name": "NotificationError", "stacktrace": true, "color": 31},
            {"id": 301, "name": "NotificationWarn", "stacktrace": false},
            {"id": 302, "name": "NotificationInfo", "stacktrace": false, "color": 36},
            {"id": 303, "name": "NotificationDebug", "stacktrace": false},
            {"id": 304, "name": "NotificationTrace", "stacktrace": false}
        ],
        "options": {
            "out": "stdout"
        },
        "maxqueuesize": 1000
    },
    "file1": {
        "type": "file",
        "format": "json",
        "levels": [
            {"id": 5, "name": "debug", "stacktrace": false},
            {"id": 4, "name": "info", "stacktrace": false},
            {"id": 3, "name": "warn", "stacktrace": false},
            {"id": 2, "name": "error", "stacktrace": true},
            {"id": 1, "name": "fatal", "stacktrace": true},
            {"id": 0, "name": "panic", "stacktrace": true},

            {"id": 300, "name": "NotificationError", "stacktrace": true},
            {"id": 301, "name": "NotificationWarn", "stacktrace": false},
            {"id": 302, "name": "NotificationInfo", "stacktrace": false},
            {"id": 303, "name": "NotificationDebug", "stacktrace": false},
            {"id": 304, "name": "NotificationTrace", "stacktrace": false}
        ],
        "options": {
            "filename": "mattermost_logging.log",
            "max_size": 100,
            "max_age": 1,
            "max_backups": 10,
            "compress": true
        },
        "maxqueuesize": 1000
    },
    "file2": {
        "type": "file",
        "format": "json",
        "levels": [
            {"id": 2, "name": "error", "stacktrace": true},
            {"id": 1, "name": "fatal", "stacktrace": true},
            {"id": 0, "name": "panic", "stacktrace": true},

            {"id": 300, "name": "NotificationError", "stacktrace": true},
            {"id": 301, "name": "NotificationWarn", "stacktrace": false}
        ],
        "options": {
            "filename": "mattermost_logging_errors.log",
            "max_size": 100,
            "max_age": 30,
            "max_backups": 10,
            "compress": true
        },
        "maxqueuesize": 1000
    }
}

v10.12 이하

{
    "console1": {
        "type": "console",
        "format": "json",
        "levels": [
            {"id": 5, "name": "debug", "stacktrace": false},
            {"id": 4, "name": "info", "stacktrace": false, "color": 36},
            {"id": 3, "name": "warn", "stacktrace": false},
            {"id": 2, "name": "error", "stacktrace": true, "color": 31},
            {"id": 1, "name": "fatal", "stacktrace": true, "color": 31},
            {"id": 0, "name": "panic", "stacktrace": true, "color": 31},
            {"id": 10, "name": "stdlog", "stacktrace": false}
        ],
        "options": {
            "out": "stdout"
        },
        "maxqueuesize": 1000
    },
    "file1": {
        "type": "file",
        "format": "json",
        "levels": [
            {"id": 5, "name": "debug", "stacktrace": false},
            {"id": 4, "name": "info", "stacktrace": false},
            {"id": 3, "name": "warn", "stacktrace": false},
            {"id": 2, "name": "error", "stacktrace": true},
            {"id": 1, "name": "fatal", "stacktrace": true},
            {"id": 0, "name": "panic", "stacktrace": true}
        ],
        "options": {
            "filename": "mattermost_logging.log",
            "max_size": 100,
            "max_age": 1,
            "max_backups": 10,
            "compress": true
        },
        "maxqueuesize": 1000
    },
    "file2": {
        "type": "file",
        "format": "json",
        "levels": [
            {"id": 2, "name": "error", "stacktrace": true},
            {"id": 1, "name": "fatal", "stacktrace": true},
            {"id": 0, "name": "panic", "stacktrace": true}
        ],
        "options": {
            "filename": "mattermost_logging_errors.log",
            "max_size": 100,
            "max_age": 30,
            "max_backups": 10,
            "compress": true
        },
        "maxqueuesize": 1000
    }
}

감사 로그

Enterprise, Enterprise Advanced 플랜에서 사용할 수 있습니다.

기본적으로 Mattermost는 감사 로그를 서버의 로컬 파일에 기록하지 않으며, Mattermost에서 감사 로깅을 활성화하는 기능은 현재 베타 상태입니다.

고급 감사 로깅을 활성화하고 맞춤 설정하면 Mattermost REST API나 mmctl에 대한 사용자 접근처럼 Mattermost 내부에서 수행된 활동과 이벤트를 기록할 수 있습니다. 감사 로그는 호출자의 지연을 줄이기 위해 비동기로 기록되며, 일반 로깅과는 별도로 저장됩니다. 타깃에 기록할 수 없는 짧은 구간 동안 감사 레코드는 메모리에 버퍼링되며, 최대 레코드 수는 구성할 수 있습니다. 일반적인 감사 레코드 양을 기준으로 하면 버퍼가 가득 차기까지 수 분이 걸릴 수 있습니다. 그 이후에는 레코드가 폐기되고, 레코드 폐기 이벤트가 로그에 기록됩니다.

참고

Mattermost v7.2부터 감사 로깅은 이전 릴리스와 호환되지 않는 변경입니다. 기존 감사 로그를 새 형식으로 파싱하려는 경우에 해당합니다. 감사 로그 레코드의 형식과 내용은 표준 JSON 스키마를 사용해 모든 이벤트에 대해 표준화되도록 변경되었습니다. 감사 로그 레코드를 수집하거나 파싱하는 기존 도구는 수정이 필요할 수 있습니다.

Mattermost v9.3부터는 AD/LDAP 이벤트에 대한 고급 로깅을 다른 로깅과 분리해 활성화하고 맞춤 설정할 수 있습니다.

자체 호스팅 배포

감사 로깅을 맞춤 설정하려면 System Console > Compliance > Audit Logging으로 이동하세요. 아래 샘플 JSON을 출발점으로 사용할 수 있습니다.

일반 활동에 대한 콘솔 로그는 맞춤 설정할 수 있습니다. v11.0부터는 고급 로깅을 구성하지 않는 한 알림 로그가 자동으로 포함됩니다.

또한 감사 로그 레코드는 콘솔, 로컬 파일, syslog, TCP 소켓 타깃을 자유롭게 조합해 출력할 수 있으며, 각 타깃마다 추가 맞춤 설정을 제공합니다. 자세한 내용은 아래 고급 로깅을 참고하세요.

클라우드 배포

Mattermost v10.11부터는 감사 로깅을 맞춤 설정하려면 System Console > Compliance > Audit Logging으로 이동하세요. 아래 샘플 JSON을 출발점으로 사용할 수 있습니다. Mattermost v10.11 이전에는 System Console > Experimental > Features > Audit Logging으로 이동해 감사 로깅을 맞춤 설정합니다.

참고
  • Mattermost v10.11부터 클라우드 배포에는 자체 호스팅 배포에서는 제공되지 않는 인증서 기반 감사 로깅 기능이 포함됩니다.
  • 클라우드 기반 배포는 다음과 같은 자체 호스팅 감사 로깅 기본값을 사용합니다: FileEnabled: false
  • 클라우드 배포에서는 로컬 파일 기반 감사 로깅을 구성할 수 없으며, 파일 관련 설정은 모두 숨겨집니다.

로그 경로 제한

Mattermost v11.4부터 로그 파일 경로는 지정된 로깅 루트 디렉터리 안에 있는지 검증됩니다. 이 보안 강화 조치는 파일 시스템의 허가되지 않은 위치에 로그 파일이 기록되거나 그곳에서 읽히는 것을 방지합니다.

로깅 루트 디렉터리 구성

Mattermost v11.4부터는 MM_LOG_PATH 환경 변수로 모든 로그 파일의 루트 디렉터리를 정의합니다.

export MM_LOG_PATH=/var/log/mattermost

MM_LOG_PATH를 설정하지 않으면 Mattermost는 Mattermost 바이너리 위치를 기준으로 한 기본 logs 디렉터리를 사용합니다.

로그 경로 검증

다음 설정으로 구성된 모든 로그 파일 경로가 검증됩니다.

검증 동작 방식:

  1. 경로를 절대 경로로 해석합니다
  2. 심볼릭 링크를 실제 위치로 해석합니다
  3. 해석된 경로를 로깅 루트 디렉터리와 대조해 검증합니다
  4. 루트 디렉터리 밖의 경로는 오류 로그를 생성하고 다운로드에서 제외됩니다

검증이 수행되는 시점:

  • System Console > Reporting > Server Logs에서 로그 파일에 접근할 때
  • 지원 패킷을 생성할 때
  • 구성을 변경할 때(잘못된 경로에 대해 경고가 로그에 기록됩니다)

로그 파일 경로가 허용된 루트 디렉터리 밖에 있으면 Mattermost는 오류를 기록하고 해당 파일을 지원 패킷 다운로드에서 제외합니다: "Blocked attempt to read log file outside allowed root". 오류 메시지에는 파일 경로, 구성 섹션, 검증 실패 상세 정보가 포함됩니다.

구성 요구 사항

기본 로깅을 사용하는 경우: 별도 조치가 필요하지 않습니다. 로그는 기본 logs 디렉터리에 저장됩니다.

맞춤 로그 경로를 사용하는 경우: AdvancedLoggingJSON의 모든 로그 파일 경로가 로깅 루트 디렉터리 안의 위치를 가리키는지 확인하세요.

유효한 구성 예시:

export MM_LOG_PATH=/var/log/mattermost

config.json에서:

{
  "file1": {
    "type": "file",
    "format": "json",
    "levels": [
      {"id": 2, "name": "error", "stacktrace": true}
    ],
    "options": {
      "filename": "/var/log/mattermost/errors.log",
      "max_size": 100,
      "max_age": 7,
      "max_backups": 10,
      "compress": true
    },
    "maxqueuesize": 1000
  }
}

이 구성은 /var/log/mattermost/errors.log가 /var/log/mattermost 루트 안에 있으므로 유효합니다.

유효하지 않은 구성 예시:

MM_LOG_PATH=/var/log/mattermost인 경우 다음 구성은 실패합니다.

{
  "file1": {
    "type": "file",
    "options": {
      "filename": "/tmp/logs/app.log"
    }
  }
}

/tmp/logs/app.log가 /var/log/mattermost 루트 디렉터리 밖에 있으므로 실패합니다.

로그 경로 문제로 시스템 콘솔이나 지원 패킷에 로그가 나타나지 않는 경우, 문제 해결 단계는 문제 해결 문서를 참고하세요.


고급 로깅

Entry, Enterprise, Enterprise Advanced 플랜에서 사용할 수 있습니다(Professional에서는 제공되지 않습니다).

시스템 관리자는 일반 활동과 감사 활동의 로그 및 감사 레코드를 콘솔, 로컬 파일, syslog, TCP 소켓 타깃을 자유롭게 조합해 출력할 수 있습니다.

팁
  • Mattermost v11.0부터 알림 활동은 기본적으로 일반 로그에 포함되지만, 새로 추가된 개별 알림 로그 레벨을 사용해 분리할 수 있습니다. 각 출력 타깃은 배포 환경에 맞게 맞춤 설정할 수 있는 추가 구성 옵션을 제공합니다.
  • Mattermost v9.11부터 시스템 관리자는 mmctl config set 명령으로 고급 로깅 JSON 옵션을 구성할 수 있습니다. 슬래시 명령 예시는 mmctl config set 문서를 참고하세요.
  • Mattermost v9.3부터 시스템 관리자는 Environment > Logging으로 이동해 여러 줄 JSON으로 시스템 콘솔에서 고급 로깅 옵션을 구성할 수 있습니다.
  • 또는 관리자는 config.json 파일의 AdvancedLoggingJSON 섹션에서 여러 줄 JSON이나 문자열로 이스케이프한 JSON을 사용해 고급 로깅을 구성할 수 있습니다.
  • Mattermost Team Edition 고객은 감사 로그 레코드를 콘솔이나 파일로 출력할 수 있습니다.

고급 로깅 옵션은 다음과 같은 목적으로 구성할 수 있습니다.

  • 인증 문제를 해결하기 위해 AD/LDAP의 trace 로깅을 활성화합니다.
  • 오류와 panic을 알림을 발생시키는 별도의 모니터링 대상 파일에 수집합니다.
  • 문제를 재현할 수 있도록 운영 환경의 debug·error 로그를 로그 파일 순환이 적용된 별도 파일에 수집하면서, 디버그 로그가 사용할 수 있는 디스크 공간에 상한을 적용합니다.
  • 사용자 워크플로 중에 접근한 모든 API 엔드포인트를 감사합니다.

고급 로그 출력 정의

Multi-line JSON

아래 예시에서는 파일 출력이 일반 텍스트로 ./logs/audit.log에 기록되며 모든 감사 로그 레벨과 이벤트를 포함합니다. 오래된 로그는 1일간 보관되고, 백업 로그 파일은 한 번에 최대 10개까지 유지됩니다. 로그 파일 크기가 최대 500MB에 도달하면 gzip으로 순환됩니다. 파일에 기록하는 동안 최대 1000건의 감사 레코드를 큐에 넣거나 버퍼링할 수 있습니다.

v11 이상
"AdvancedLoggingJSON": {
    "file_1": {
        "type": "file",
        "format": "plain",
        "format_options": {
            "disable_level": false
        },
        "levels": [
            { "id": 100, "name": "audit-api" },
            { "id": 101, "name": "audit-content" },
            { "id": 102, "name": "audit-permissions" },
            { "id": 103, "name": "audit-cli" }
        ],
        "options": {
            "compress": true,
            "filename": "./logs/audit.log",
            "max_age": 1,
            "max_backups": 10,
            "max_size": 500
        },
        "maxqueuesize": 1000
    },
    "file_notifications": {
        "type": "file",
        "format": "json",
        "levels": [
            { "id": 300, "name": "NotificationError" },
            { "id": 301, "name": "NotificationWarn" },
            { "id": 302, "name": "NotificationInfo" },
            { "id": 303, "name": "NotificationDebug" },
            { "id": 304, "name": "NotificationTrace" }
        ],
        "options": {
            "compress": true,
            "filename": "./logs/notifications.log",
            "max_age": 7,
            "max_backups": 5,
            "max_size": 200
        },
        "maxqueuesize": 1000
    }
}
v10.12 이하
"AdvancedLoggingJSON": {
    "file_1": {
        "type": "file",
        "format": "plain",
        "format_options": {
          "disable_level": false
        },
        "levels": [
            { "id": 100, "name": "audit-api" },
            { "id": 101, "name": "audit-content" },
            { "id": 102, "name": "audit-permissions" },
            { "id": 103, "name": "audit-cli" }
        ],
        "options": {
            "compress": true,
            "filename": "./logs/audit.log",
            "max_age": 1,
            "max_backups": 10,
            "max_size": 500
        },
        "maxqueuesize": 1000
    }
}

Filespec

고급 로깅 구성은 여러 줄 JSON 대신 다른 구성 파일을 가리키는 파일 경로(filespec)로 지정할 수 있으며, 이렇게 하면 config.json 파일을 깔끔하게 유지할 수 있습니다.

"AdvancedLoggingJSON": "/path/to/audit_log_config.json"

여러 줄 JSON은 대신 별도의 구성 파일에 담습니다.

아래 예시에서 첫 번째 출력은 일반 텍스트로 콘솔에 기록되며 모든 감사 로그 레벨, 이벤트, 명령 출력을 포함합니다. 필드 사이에는 파이프 | 구분자가 놓입니다.

두 번째 출력은 기계 판독 가능한 JSON 형식의 일반 텍스트로 ./logs/audit.log에 기록되며 모든 감사 로그 레벨, 이벤트, 명령 출력을 포함합니다. 오래된 로그는 1일간 보관되고, 백업 로그 파일은 한 번에 최대 10개까지 유지됩니다. 로그 파일 크기가 최대 500MB에 도달하면 GZIP으로 순환됩니다. 파일에 기록하는 동안 최대 1000건의 감사 레코드를 큐에 넣거나 버퍼링할 수 있습니다.

audit_log_config.json 파일 내용:

v11 이상
{
    "sample-console": {
        "type": "console",
        "format": "plain",
        "format_options": {
            "delim": " | "
        },
        "levels": [
            {"id": 100, "name": "audit-api"},
            {"id": 101, "name": "audit-content"},
            {"id": 102, "name": "audit-permissions"},
            {"id": 103, "name": "audit-cli"}
        ],
        "options": {
            "out": "stdout"
        },
        "maxqueuesize": 1000
    },
    "sample-file": {
        "type": "file",
        "format": "json",
        "levels": [
            {"id": 100, "name": "audit-api"},
            {"id": 101, "name": "audit-content"},
            {"id": 102, "name": "audit-permissions"},
            {"id": 103, "name": "audit-cli"}
        ],
        "options": {
            "filename": "./logs/audit.log",
            "max_size": 500,
            "max_age": 1,
            "max_backups": 10,
            "compress": true
        },
        "maxqueuesize": 1000
    },
    "notifications-file": {
        "type": "file",
        "format": "json",
        "levels": [
            {"id": 300, "name": "NotificationError"},
            {"id": 301, "name": "NotificationWarn"},
            {"id": 302, "name": "NotificationInfo"},
            {"id": 303, "name": "NotificationDebug"},
            {"id": 304, "name": "NotificationTrace"}
        ],
        "options": {
            "filename": "./logs/notifications.log",
            "max_size": 200,
            "max_age": 7,
            "max_backups": 5,
            "compress": true
        },
        "maxqueuesize": 1000
    }
}
v10.12 이하
{
    "sample-console": {
        "type": "console",
        "format": "plain",
        "format_options": {
            "delim": " | "
        },
        "levels": [
            {"id": 100, "name": "audit-api"},
            {"id": 101, "name": "audit-content"},
            {"id": 102, "name": "audit-permissions"},
            {"id": 103, "name": "audit-cli"}
        ],
        "options": {
            "out": "stdout"
        },
        "maxqueuesize": 1000
    },
    "sample-file": {
        "type": "file",
        "format": "json",
        "levels": [
            {"id": 100, "name": "audit-api"},
            {"id": 101, "name": "audit-content"},
            {"id": 102, "name": "audit-permissions"},
            {"id": 103, "name": "audit-cli"}
        ],
        "options": {
            "filename": "./logs/audit.log",
            "max_size": 500,
            "max_age": 1,
            "max_backups": 10,
            "compress": true
        },
        "maxqueuesize": 1000
    }
}

대상 타깃 지정

로그 레코드는 콘솔, 로컬 파일, syslog, TCP 소켓 타깃을 자유롭게 조합해 보낼 수 있습니다. 로그 타깃은 추가 소프트웨어를 설치하지 않고도 대다수 로그 집계기와 로그 분석 도구를 지원할 수 있도록 선정되었습니다.

시스템 관리자는 다음을 위해 여러 로그 타깃을 정의할 수 있습니다.

  • 이중화를 위해 로그 출력을 파일과 로그 집계기에 미러링합니다.
  • 특정 항목을 특정 대상에 기록합니다. 예를 들어 모든 audit-content 레코드를 다른 레벨과는 다른 대상으로 라우팅할 수 있습니다.
  • 관리자는 타깃의 type을 none으로 설정해 로그 타깃을 일시적으로 비활성화할 수도 있습니다.

형식 기본 설정 구성

시스템 관리자는 format_options 섹션을 구성해 타깃별로 로그 형식을 제어할 수 있습니다.

Plain 로그 형식 구성 옵션

키유형설명
disable_timestampbool타임스탬프 출력을 비활성화합니다. 기본값은 false입니다.
disable_levelbool레벨 이름 출력을 비활성화합니다. 기본값은 false입니다.
disable_msgbool메시지 텍스트 출력을 비활성화합니다. 기본값은 false입니다.
disable_fieldsbool모든 필드의 출력을 비활성화합니다. 기본값은 false입니다.
disables_stacktracebool스택 트레이스 출력을 비활성화합니다. 기본값은 false입니다.
enable_callerstring로그 레코드를 생성한 파일과 줄 번호의 출력을 활성화합니다. 기본값은 false입니다.
delimstring필드 사이에 놓이는 구분자입니다. 기본값은 공백 한 칸입니다.
min_level_lennumber레벨 이름의 최소 길이입니다. 레벨 이름이 최솟값보다 짧으면 공백으로 채워집니다. 기본값은 0입니다.
min_msg_lennumber메시지의 최소 길이입니다. 메시지 텍스트가 최솟값보다 짧으면 공백으로 채워집니다. 기본값은 0입니다.
timestamp_formatstring타임스탬프 형식입니다. 기본값은 RFC3339입니다.
line_endstring줄 끝 문자를 대체합니다. 기본값은 n입니다.
enable_colorbool색상 출력을 지원하는 타깃에서 색상을 활성화합니다. 기본값은 false입니다.

JSON 로그 형식 구성 옵션

키유형설명
disable_timestampbool타임스탬프 출력을 비활성화합니다. 기본값은 false입니다.
disable_levelbool로그 레벨 표시 이름의 출력을 비활성화합니다. 기본값은 false입니다.
disable_msgbool메시지 텍스트 출력을 비활성화합니다. 기본값은 false입니다.
disable_fieldsbool모든 필드의 출력을 비활성화합니다. 기본값은 false입니다.
disables_stacktracebool스택 트레이스 출력을 비활성화합니다. 기본값은 false입니다.
enable_callerstring로그 레코드를 생성한 파일과 줄 번호의 출력을 활성화합니다. 기본값은 false입니다.
timestamp_formatstring타임스탬프 형식입니다. 기본값은 RFC3339입니다.

GELF 로그 형식 구성 옵션

키유형설명
hostnamestring로그 레코드에 맞춤 호스트명을 출력합니다. 생략하면 운영 체제에서 호스트명을 가져옵니다.
enable_callerstring로그 레코드를 생성한 파일과 줄 번호의 출력을 활성화합니다. 기본값은 false입니다.

로그 레벨과 이벤트 구성

키유형설명
idnumber로그 레벨의 고유 식별자입니다.
namestring로그 레벨의 이름입니다.
stacktracebool스택 트레이스를 출력합니다. 기본값은 false입니다.
colornumber로그 레코드의 일부를 출력할 때 사용하는 ANSI 색상 코드입니다. 지원되는 값은 다음과 같습니다.
  • Black: 30
  • Red: 31
  • Green: 32
  • Yellow: 33
  • Blue: 34
  • Magenta: 35
  • Cyan: 36
  • White: 37

로그 레벨

다음 로그 레벨은 감사 로그를 지원합니다.

ID이름설명
100audit-apiAPI 이벤트
101audit-content콘텐츠 변경. 이 로그 레벨은 다른 감사 로그 레벨보다 훨씬 많은 레코드를 생성할 수 있습니다.
102audit-permissions권한 변경
103audit-cliCLI 작업

다음 로그 레벨은 애플리케이션 로그를 지원합니다.

ID이름설명
140LDAPErrorAD/LDAP 인증 오류
141LDAPWarnAD/LDAP 인증 경고
142LDAPInfoAD/LDAP 인증 정보 로그
143LDAPDebugAD/LDAP 인증 디버그 로그
144LDAPTraceAD/LDAP 인증 trace 로그. Mattermost v9.3부터 LdapSetings.trace를 대체합니다.

타깃별 설정 구성

콘솔 타깃 구성 옵션

콘솔 타깃은 stdout 또는 stderr일 수 있습니다.

  • 표준 출력 스트림 stout은 일반적으로 명령 결과를 사용자에게 출력하는 명령 출력에 사용됩니다.
  • 표준 오류 스트림 sterr은 일반적으로 프로그램 실행 중에 발생하는 오류를 출력하는 데 사용됩니다.

파일 타깃 구성 옵션

파일 타깃은 크기 및/또는 기간에 따라 트리거되는 순환과 압축을 지원합니다.

키유형설명
filenamestring출력 파일의 전체 경로입니다. v11.4부터는 MM_LOG_PATH로 지정한 디렉터리 안에 있어야 합니다.
max_sizenumber로그 파일이 순환되기 전까지 커질 수 있는 최대 크기(MB)입니다. 기본값은 100MB입니다.
max_agenumber파일명에 인코딩된 타임스탬프를 기준으로 오래된 로그 파일을 보관할 최대 일수입니다. 기본값은 0이며, 이 경우 오래된 로그 파일 삭제가 비활성화됩니다.
max_backupsnumber보관할 오래된 로그 파일의 최대 개수입니다. 기본값은 0이며, 이 경우 오래된 로그 파일을 모두 보관합니다. 참고: max_age를 구성하면 이 구성 값과 무관하게 오래된 로그 파일이 삭제될 수 있습니다.
compressbool순환된 로그 파일을 gzip으로 압축합니다. 기본값은 false입니다.

Syslog 타깃 구성 옵션

Entry, Enterprise, Enterprise Advanced 플랜에서 사용할 수 있습니다(Professional에서는 제공되지 않습니다).

syslog 타깃은 TLS 전송 사용 여부와 관계없이 로컬 및 원격 syslog 서버를 지원합니다. syslog 타깃 지원에는 Mattermost Enterprise가 필요합니다.

키유형설명
hoststring로그 레코드를 수신하는 서버의 IP 또는 도메인 이름입니다.
portnumber로그 레코드를 수신하는 서버의 포트 번호입니다.
tlsbool로그 레코드를 수신하는 서버에 TLS 연결을 생성합니다. 기본값은 false입니다.
certstring서버에 TLS 연결을 설정할 때 사용할 인증서 파일(.pem)의 경로입니다.
insecureboolMattermost가 서버가 제시하는 모든 인증서와 그 인증서에 포함된 모든 호스트명을 수락합니다. 기본값은 false입니다. 참고: 테스트 환경에서만 사용해야 하며 운영 환경에서는 사용하지 않아야 합니다.
tagstringSyslog 태그 필드입니다.

TCP 타깃 구성 옵션

Entry, Enterprise, Enterprise Advanced 플랜에서 사용할 수 있습니다(Professional에서는 제공되지 않습니다).

TCP 소켓 타깃은 IP 주소 또는 도메인 이름, 포트, 선택적 TLS 인증서로 구성할 수 있습니다. TCP 소켓 타깃 지원에는 Mattermost Enterprise가 필요합니다. 출발점으로 사용할 구성 샘플 JSON 파일을 내려받을 수 있습니다.

키유형설명
hoststring로그 레코드를 수신하는 서버의 IP 또는 도메인 이름입니다.
portnumber로그 레코드를 수신하는 서버의 포트 번호입니다.
tlsbool로그 레코드를 수신하는 서버에 TLS 연결을 생성합니다. 기본값은 false입니다.
certstring서버에 TLS 연결을 설정할 때 사용할 인증서 파일(.pem)의 경로입니다.
insecureboolMattermost가 서버가 제시하는 모든 인증서와 그 인증서에 포함된 모든 호스트명을 수락합니다. 기본값은 false입니다. 참고: 테스트 환경에서만 사용해야 하며 운영 환경에서는 사용하지 않아야 합니다.

클러스터 작업 실행 디버그 메시지

Enterprise, Enterprise Advanced 플랜에서 사용할 수 있습니다.

Mattermost v11.4부터 시스템 관리자가 고가용성 배포에서 특정 반복 작업(Recurring Tasks)의 클러스터 작업 실행 동작을 파악할 수 있도록 debug 레벨 로그 메시지가 제공됩니다.

이 디버그 메시지는 다음 반복 작업에만 적용됩니다.

  • Scheduled Posts(예약 게시물)
  • Post Reminders(게시물 리마인더)
  • DND Status Reset(방해 금지 상태 초기화)
중요
  • 이 디버그 메시지는 Elasticsearch 인덱싱, SAML 동기화, LDAP 동기화, 데이터 보존, 컴플라이언스 내보내기 등 다른 작업 유형에서는 제공되지 않습니다. 다른 작업 유형에서 이 디버그 메시지가 없다고 해서 작업 실행에 문제가 있는 것은 아닙니다.
  • 이 메시지는 디버그 로깅이 활성화된 경우에만 표시됩니다. 자세한 내용은 디버그 로깅은 어떻게 활성화하나요?를 참고하세요.
  • 클러스터 배포에서는 리더 노드만 이 반복 작업을 실행합니다. 리더가 아닌 노드는 해당 작업을 건너뛰고, 이것이 정상 동작임을 나타내는 디버그 메시지를 기록합니다.

작업 시작 시 디버그 메시지

리더가 아닌 노드가 시작되면 이 반복 작업의 초기화를 건너뛰고 다음 디버그 메시지 중 하나를 기록합니다.

  • Skipping scheduled posts job startup since this is not the leader node
  • Skipping unset DND status job startup since this is not the leader node
  • Skipping post reminder job startup since this is not the leader node

이 메시지는 정상 동작을 나타냅니다. 고가용성 클러스터에서는 중복 실행을 방지하기 위해 이 반복 작업이 리더 노드에서만 실행되어야 합니다.

리더십 변경 시 디버그 메시지

이 반복 작업이 실행 중인 노드가 리더 지위를 잃으면 실행 중인 작업을 취소하고 다음을 기록합니다.

  • This is no longer leader node. Cancelling the [job name] task

여기서 [job name]은 scheduled posts, DND status reset, post reminder 중 하나입니다.

이는 클러스터가 리더 선출을 올바르게 수행하고 있음을 나타냅니다. 새 리더 노드가 이 반복 작업의 실행을 이어받습니다.

클러스터 작업 디버그 메시지로 문제 해결하기

특정 노드에서 반복 작업(Scheduled Posts, Post Reminders, DND Status Reset)이 실행되지 않는 이유를 조사하는 경우 다음을 확인하세요.

  1. 아직 활성화하지 않았다면 디버그 로깅을 활성화합니다.
  2. 위에 나열된 디버그 메시지가 로그에 있는지 확인합니다.
  3. 이 메시지가 보인다면 해당 노드는 리더가 아닌 노드로 올바르게 식별되었으며 예상대로 동작하고 있는 것입니다.
  4. 이 반복 작업은 대신 리더 노드에서 실행됩니다.
참고

이 디버그 메시지는 반복 작업에만 적용됩니다. 다른 작업 유형(Elasticsearch 인덱싱, SAML 동기화, LDAP 동기화, 데이터 보존, 컴플라이언스 내보내기)에는 다른 로깅 메커니즘이 적용됩니다. 다른 작업 유형에서 이 디버그 메시지가 없는 것은 정상이며 문제가 있음을 뜻하지 않습니다.

리더 선출과 클러스터 구성에 대한 자세한 내용은 고가용성 클러스터 기반 배포를 참고하세요.


자주 묻는 질문

디버그 로깅은 어떻게 활성화하나요?

Mattermost 시스템 관리자는 System Console > Environment > Logging > File Log Level로 이동해 DEBUG로 설정한 뒤 변경 사항을 저장합니다.

Mattermost 시스템 관리자가 디버그 로깅을 활성화하거나 비활성화할 수 있는 시스템 콘솔 페이지 스크린샷

디버그 로깅은 로그 파일 크기를 크게 늘릴 수 있고 서버 성능에 악영향을 줄 수 있습니다. 서버 로그를 주시하거나, 일시적으로만 활성화하거나, 운영 환경이 아닌 개발 환경에서만 활성화하세요.

Mattermost에는 시스템 auditd 외에 별도의 감사 로그가 있나요?

있습니다. 자세한 내용은 감사 로그 문서를 참고하세요.

syslog를 타깃으로 구성하면 데이터를 보낸 주체(즉, Mattermost 앱 노드)의 IP 주소가 포함되나요?

포함됩니다. 이는 syslog 데몬(수신 측)의 기능입니다. 일반적으로 모든 로그 줄 앞에는 타임스탬프와 데이터를 보낸 노드의 호스트명이 붙습니다. 예를 들어 로그 줄은 Nov 28 10:56:59 tower kernel: [1072437.431123] ....로 시작하며, 여기서 tower는 해당 로그 줄을 생성한 서버의 호스트명입니다.

감사 로그를 활성화한 뒤, 관리자가 감사 로그 설정을 비활성화하거나 수정하는 이벤트도 감사 로깅이 추적할 수 있나요?

추적할 수 있지만, 감사 로그를 어떻게 구성했는지에 따라 다릅니다. 감사 로그 구성은 REST API, mmctl, 시스템 콘솔, 디스크상의 파일, 환경 변수로 지정할 수 있습니다. REST API나 시스템 콘솔로 변경하면 감사 레코드가 남습니다. 다만 Mattermost 서버는 구성 파일이나 환경 변수를 통한 변경은 포착할 수 없습니다.

감사가 비활성화되는 시점에 서비스 등이 중지되거나 업데이트되는 정보가 서버 로그에 표시되나요?

표시됩니다. REST API, mmctl, 시스템 콘솔로 감사 로그 구성을 업데이트하면 감사 로그의 마지막 이벤트는 관리자 사용자가 서버 구성을 업데이트한 내용이어야 하며, 이를 통해 보안 팀은 시스템에서 어떤 작업이 누구에 의해 이루어졌는지 파악할 수 있습니다.

로그에서 수신 웹훅 상세 정보를 제외하려면 어떻게 하나요?

웹훅 디버깅 활성화 설정을 참고하세요.

로그 필드 최대 크기는 어떻게 조정하나요?

최대 필드 크기 설정을 참고하세요.

환경 변수로 고급 로깅을 구성하려면 어떻게 하나요?

MM_LOGSETTINGS_ADVANCEDLOGGINGJSON 환경 변수로 고급 로깅을 구성합니다. JSON 페이로드는 jq로 생성할 수 있습니다. 예를 들면 다음과 같습니다.

export MM_LOGSETTINGS_ADVANCEDLOGGINGJSON=$(jq -n -c '{
    "console1": {
        "Type": "console",
        "Format": "json",
        "Levels": [
            {"ID": 5, "Name": "debug", "Stacktrace": false},
            {"ID": 4, "Name": "info", "Stacktrace": false, "color": 36},
            {"ID": 3, "Name": "warn", "Stacktrace": false},
            {"ID": 2, "Name": "error", "Stacktrace": true, "color": 31},
            {"ID": 1, "Name": "fatal", "Stacktrace": true, "color": 31},
            {"ID": 0, "Name": "panic", "Stacktrace": true, "color": 31},
            {"ID": 10, "Name": "stdlog", "Stacktrace": false}
        ],
        "Options": {
            "Out": "stdout"
        },
        "MaxQueueSize": 1000
    }
}')

LDAP의 trace 로깅은 어떻게 켜나요?

LDAP의 trace 로깅을 활성화하려면 다음 JSON 구성을 출발점으로 사용하세요.

{
    "ldap-file": {
        "type": "file",
        "format": "plain",
        "levels": [
            {
                "id": 144,
                "name": "LDAPTrace"
            },
            {
                "id": 143,
                "name": "LDAPDebug"
            },
            {
                "id": 142,
                "name": "LDAPInfo"
            },
            {
                "id": 141,
                "name": "LDAPWarn",
                "stacktrace": true
            },
            {
                "id": 140,
                "name": "LDAPError",
                "stacktrace": true
            }
        ],
        "options": {
            "filename": "./logs/ldap.log",
            "max_size": 100,
            "max_age": 14,
            "max_backups": 3,
            "compress": false
        },
        "maxqueuesize": 1000
    }
}

Mattermost의 중앙 집중 로깅은 어떻게 구성하나요?

Mattermost는 Grafana Loki와 OpenTelemetry Collector를 사용한 중앙 집중 로깅을 권장합니다. 로그 집계 설정 방법, 유용한 LogQL 쿼리, Grafana 대시보드에 대한 자세한 내용은 중앙 집중 로깅용 Grafana Loki 배포 가이드를 참고하세요.