로그 스트리밍
n8n v2.42요약
로그 스트리밍은 다음 플랜에서 사용할 수 있습니다: 로그 스트리밍을 사용하면 n8n에서 발생하는 이벤트를 자체 로깅 도구로 전송할 수 있습니다. 이 섹션의 상세 내용은 n8n 공식 문서를 참조하세요. 로그 스트리밍을 사용하려면 스트리밍 대상을 추가해야 합니다.
기능 제공 범위
로그 스트리밍은 다음 플랜에서 사용할 수 있습니다:
- n8n Cloud: Enterprise
- 셀프 호스팅: Enterprise
로그 스트리밍을 사용하면 n8n에서 발생하는 이벤트를 자체 로깅 도구로 전송할 수 있습니다. 이를 통해 자체 알림 및 로깅 프로세스에서 n8n 모니터링을 관리할 수 있습니다.
이 섹션의 상세 내용은 n8n 공식 문서를 참조하세요.
로그 스트리밍 설정하기#
로그 스트리밍을 사용하려면 스트리밍 대상을 추가해야 합니다.
- Settings > Log Streaming으로 이동합니다.
- Add new destination을 선택합니다.
- 대상 유형을 선택합니다. n8n이 New Event Destination 모달을 엽니다.
- New Event Destination 모달에서 이벤트 대상에 대한 구성 정보를 입력합니다. 이 정보는 사용 중인 대상 유형에 따라 달라집니다.
- 스트리밍할 이벤트를 선택하려면 Events를 선택합니다.
- Save를 선택합니다.
셀프 호스팅 사용자
n8n을 셀프 호스팅하는 경우 환경 변수를 사용하여 추가적인 로그 스트리밍 동작을 구성할 수 있습니다. 또한 환경 변수로 대상을 관리할 수도 있습니다. 자세한 내용은 환경 변수를 사용하여 로그 스트리밍 대상 구성하기를 참고하세요.
프로세스별 이벤트 로그 파일#
n8n은 각 이벤트를 스트리밍 대상으로 전달하기 전에 로컬 로그 파일에 저장합니다. 이 파일은 재시작 후에도 유지되며, 아직 전달되지 않은 이벤트를 n8n이 다시 전송할 수 있게 해줍니다.
기본적으로 n8n은 이벤트 로그를 <n8n-user-folder>/n8nEventLog.log에 기록하며, 해당 프로세스에는 -worker 또는 -webhook-processor 접미사가 붙습니다. 단일 n8n 프로세스가 파일을 소유하는 경우, 이 기본값은 예상대로 작동합니다.
공유 쓰기 가능 파일 시스템
여러 n8n 프로세스가 하나의 쓰기 가능한 볼륨을 공유하는 경우(예: NFS 또는 EFS의 공유 영구 볼륨을 사용하는 큐 모드 워커), 동일한 이벤트 로그 파일에 기록해서는 안 됩니다. 여러 프로세스에서 동시에 추가 기록(append)하면 파일이 뒤섞이거나 손상되어 복구 실패 및 이벤트 손실로 이어질 수 있습니다.
이를 방지하려면 각 프로세스에서 N8N_EVENTBUS_LOGWRITER_LOGFULLPATH를 .log로 끝나는 고유한 절대 경로로 설정하세요. n8n은 구성된 경로를 그대로 사용하며 프로세스 유형 접미사를 추가하지 않으므로, 프로세스 간 고유성을 보장하는 것은 오케스트레이터의 책임입니다.
함께 사용되는 변수인 N8N_EVENTBUS_LOGWRITER_MAXTOTALMESSAGESPERFILE은 복구 과정에서 n8n이 단일 이벤트 로그 파일에서 파싱하는 줄 수를 제한하여, 손상된 파일이 프로세스 메모리를 고갈시키지 않도록 합니다.
참고 사항:
N8N_EVENTBUS_LOGWRITER_LOGFULLPATH가 설정되지 않은 경우 기본 동작은 변경되지 않습니다.- 이 변수가 설정되면 n8n은 경로에 자동으로 접미사를 붙이지 않습니다. 각 프로세스는 고유한 값을 받아야 합니다.
- 이전 배포에서 생성된 공유
n8nEventLog-worker.log파일이 이미 존재하는 경우, 이 기능을 적용하기 전에 수동으로 격리하세요. n8n은 기존 파일을 자동으로 삭제하지 않습니다.
이벤트#
다음 이벤트를 사용할 수 있습니다. 스트리밍할 이벤트는 Settings > Log Streaming > Events에서 선택할 수 있습니다.
- 워크플로
- 시작됨
- 성공
- 실패
- 취소됨
- 노드 실행
- 시작됨
- 완료됨
- 감사
- 사용자 로그인 성공
- 사용자 로그인 실패
- 사용자 가입
- 사용자 업데이트됨
- 사용자 삭제됨
- 사용자 초대됨
- 사용자 초대 수락됨
- 사용자 재초대됨
- 사용자 이메일 실패
- 사용자 재설정 요청됨
- 사용자 재설정됨
- 사용자 자격 증명 생성됨
- 사용자 자격 증명 공유됨
- 사용자 자격 증명 업데이트됨
- 사용자 자격 증명 삭제됨
- 사용자 API 생성됨
- 사용자 API 삭제됨
- 사용자 MFA 활성화됨
- 사용자 MFA 비활성화됨
- 사용자 실행 삭제됨
- 실행 데이터 공개됨
- 실행 데이터 공개 실패
- 패키지 설치됨
- 패키지 업데이트됨
- 패키지 삭제됨
- n8n 패키지 가져오기 성공
- n8n 패키지 내보내기 성공
- n8n 패키지 내보내기 실패
- n8n 패키지 가져오기 실패
- 워크플로 생성됨
- 워크플로 삭제됨
- 워크플로 업데이트됨
- 워크플로 보관됨
- 워크플로 보관 해제됨
- 워크플로 활성화됨
- 워크플로 비활성화됨
- 워크플로 버전 업데이트됨
- 워크플로 실행됨
- 워크플로 대기 중
- 워크플로 재개됨
- 변수 생성됨
- 변수 업데이트됨
- 변수 삭제됨
- 외부 시크릿 제공업체 설정 저장됨
- 외부 시크릿 제공업체 다시 로드됨
- 외부 시크릿 연결 생성됨
- 외부 시크릿 연결 업데이트됨
- 외부 시크릿 연결 삭제됨
- 외부 시크릿 연결 테스트됨
- 외부 시크릿 연결 다시 로드됨
- 개인 게시 제한 활성화됨
- 개인 게시 제한 비활성화됨
- 개인 공유 제한 활성화됨
- 개인 공유 제한 비활성화됨
- 2FA 강제 적용 활성화됨
- 2FA 강제 적용 비활성화됨
- 토큰 교환 성공
- 토큰 교환 실패
- 토큰 교환 임베드 로그인
- 토큰 교환 임베드 로그인 실패
- 토큰 교환 아이덴티티 연결됨
- 토큰 교환 사용자 프로비저닝됨
- 토큰 교환 역할 업데이트됨
- 역할 매핑 역할 확인됨
- 역할 매핑 규칙 생성됨
- 역할 매핑 규칙 업데이트됨
- 역할 매핑 규칙 삭제됨
- 역할 매핑 규칙 일괄 삭제됨
- MCP OAuth 완료됨
- MCP 도구 호출됨
- MCP 액세스 업데이트됨
- 워커
- 시작됨
- 중지됨
- AI 노드 로그
- 메모리 메시지 가져오기
- 메모리 메시지 추가됨
- 출력 파서 파싱됨
- 리트리버 관련 문서 가져오기
- 임베딩 문서 임베딩됨
- 임베딩 쿼리 임베딩됨
- 문서 처리됨
- 텍스트 분할기 분할됨
- 도구 호출됨
- 벡터 스토어 검색됨
- LLM 생성됨
- LLM 오류
- 벡터 스토어 채워짐
- 벡터 스토어 업데이트됨
- 러너
- 태스크 요청됨
- 응답 수신됨
- 큐
- 작업 큐에 추가됨
- 작업 큐에서 제거됨
- 작업 완료됨
- 작업 실패
- 작업 지연됨
두 종류의 감사 이벤트가 패키지를 언급하지만 서로 관련이 없습니다. 패키지 설치됨, 패키지 업데이트됨, 패키지 삭제됨은 인스턴스에 설치된 커뮤니티 노드에 관한 이벤트입니다. n8n 패키지 이벤트는 인스턴스 간에 워크플로를 옮길 때 사용하는 이식 가능한 아카이브인 n8n 패키지에 관한 이벤트입니다.
워크플로 이벤트#
워크플로 이벤트 네 가지는 단일 워크플로 실행의 수명 주기를 다룹니다.
| 이벤트 이름 | 전송 시점 |
|---|---|
n8n.workflow.started |
워크플로 실행이 시작될 때. |
n8n.workflow.success |
워크플로 실행이 오류 없이 끝날 때. |
n8n.workflow.failed |
워크플로 실행이 오류와 함께 끝날 때. |
n8n.workflow.cancelled |
사용자 또는 시스템이 실행 중인 실행을 취소할 때. |
네 가지를 모두 스트리밍하려면 대상이 n8n.workflow를 구독하도록 설정하세요. Settings > Log Streaming > Events에서는 Workflow 그룹에 표시됩니다.
모든 이벤트에는 executionId, workflowId, workflowName이 포함됩니다.
n8n.workflow.started, n8n.workflow.success, n8n.workflow.failed에는 다음 필드도 포함됩니다:
| 필드 | 설명 |
|---|---|
userId |
실행을 소유한 사용자. 예를 들어 스케줄 트리거처럼 n8n이 직접 실행을 시작한 경우에는 없습니다. |
mode |
실행 모드. 예: trigger, manual, webhook, retry. |
isManual |
사용자가 에디터에서 직접 실행을 시작한 경우 true. |
projectId, projectName |
워크플로가 속한 프로젝트. 프로젝트에 속한 경우에만 포함됩니다. |
n8n.workflow.success와 n8n.workflow.failed에는 success 부울(boolean) 값도 포함됩니다. 성공 이벤트에서는 true, 실패 이벤트에서는 false입니다.
n8n.workflow.failed에는 다음 필드가 추가로 포함됩니다:
| 필드 | 설명 |
|---|---|
lastNodeExecuted |
실행이 실패했을 때 실행 중이던 노드의 이름. |
errorNodeType |
해당 노드의 유형. 예: n8n-nodes-base.httpRequest. |
errorMessage |
문자열 형태의 오류 메시지. |
n8n.workflow.cancelled에는 실행이 취소된 이유를 설명하는 문자열인 reason이 추가로 포함됩니다.
MCP 이벤트#
기능 제공 범위
MCP 감사 이벤트는 n8n 2.34.0부터 사용할 수 있습니다.
MCP 감사 이벤트 세 가지는 Settings > Instance-level MCP에서 켜는 인스턴스 MCP 서버를 다룹니다. MCP Server Trigger 노드를 사용하는 워크플로는 다루지 않습니다. 두 방식의 차이는 Connect to n8n MCP server를 참고하세요.
| 이벤트 이름 | 전송 시점 |
|---|---|
n8n.audit.mcp.oauth.completed |
사용자가 OAuth로 MCP 클라이언트 인증을 마칠 때. userId, clientId, clientName이 포함됩니다. |
n8n.audit.mcp.tool.called |
MCP 클라이언트가 도구를 호출할 때. 필드는 아래를 참고하세요. |
n8n.audit.mcp.access.updated |
사용자가 인스턴스 MCP 액세스를 켜거나 끌 때. 수행한 사용자와 새로운 enabled 값이 포함됩니다. |
세 가지를 모두 스트리밍하려면 대상이 n8n.audit.mcp를 구독하도록 설정하세요. Settings > Log Streaming > Events에서는 Audit 그룹에 표시됩니다.
n8n.audit.mcp.tool.called에는 다음 필드가 포함됩니다:
| 필드 | 설명 |
|---|---|
userId |
클라이언트가 자격 증명으로 인증한 사용자. |
_email, _firstName, _lastName, globalRole |
해당 사용자의 상세 정보. |
toolName |
호출된 도구. 예: execute_workflow. |
workflowId |
도구가 워크플로에 작업을 수행한 경우 해당 워크플로. |
status |
success 또는 error. |
errorMessage |
호출이 실패한 이유. status가 error일 때만 포함됩니다. |
authType |
oauth 또는 api_key. api_key는 OAuth 액세스 토큰이 아닌 모든 베어러 토큰을 포함합니다. authType은 n8n 2.34.0부터 사용할 수 있습니다. |
clientId |
호출이 인증에 사용한, 인스턴스에 등록된 OAuth 클라이언트. authType이 oauth일 때 포함됩니다. clientId는 n8n 2.34.0부터 사용할 수 있습니다. |
clientName |
클라이언트가 스스로 보고하는 이름. |
클라이언트별 사용량을 측정하려면 clientId로 그룹화하세요. clientId는 하나의 클라이언트 등록을 식별하므로, 토큰이 갱신된 후에도 해당 클라이언트가 수행하는 모든 호출에서 같은 값을 유지합니다. 같은 제품을 두 번 설치하면 각각 따로 등록되어 서로 다른 값을 가지므로, clientId는 제품 수가 아니라 등록 수를 세는 기준입니다. clientName은 검증되지 않고 고유하지도 않으므로 키로 사용하지 마세요.
대상에 anonymizeAuditMessages를 설정하면 사용자의 이메일과 이름이 마스킹됩니다. userId, authType, clientId는 마스킹되지 않으므로 이 값들로 여전히 그룹화하고 집계할 수 있습니다.
대상#
n8n은 세 가지 대상 유형을 지원합니다:
- Syslog 서버
- 범용 웹훅
- Sentry 클라이언트
환경 변수를 사용하여 구성하기#
n8n을 셀프 호스팅하는 경우 UI 대신 환경 변수로 로그 스트리밍 대상을 관리할 수 있습니다. n8n 2.19.0부터 사용할 수 있습니다. N8N_LOG_STREAMING_MANAGED_BY_ENV를 true로 설정하고, 대상을 N8N_LOG_STREAMING_DESTINATIONS에 JSON 배열 형태로 제공하세요. n8n은 시작할 때마다 이를 다시 적용하며, Log Streaming UI를 읽기 전용으로 잠급니다. 전체 패턴은 환경 변수를 사용하여 인스턴스 설정 관리하기를 참고하세요.
이 섹션의 상세 내용은 n8n 공식 문서를 참조하세요.
공통 필드#
모든 대상은 type과 관계없이 다음 필드를 허용합니다.
| 필드 | 유형 | 필수 여부 | 설명 |
|---|---|---|---|
type |
"webhook" | "syslog" | "sentry" |
예 | 대상 유형입니다. 어떤 유형별 필드가 적용되는지를 결정합니다. |
label |
string | 아니요 | UI에 표시되는 이름입니다. |
enabled |
boolean | 아니요 | 대상이 이벤트를 전달할지 여부입니다. |
subscribedEvents |
string[] | 아니요 | 전달할 이벤트 이름 또는 그룹 접두사입니다(예: n8n.audit, n8n.workflow). |
anonymizeAuditMessages |
boolean | 아니요 | n8n.audit.* 이벤트에서 민감한 페이로드 데이터를 제거합니다. |
circuitBreaker |
object | 아니요 | 장애 방지 설정입니다. 서킷 브레이커를 참고하세요. |
웹훅#
| 필드 | 유형 | 필수 여부 | 기본값 | 설명 |
|---|---|---|---|---|
url |
string (URL) | 예 | - | 이벤트 페이로드를 수신하는 엔드포인트입니다. |
method |
"GET" | "POST" | "PUT" |
아니요 | "POST" |
전달에 사용되는 HTTP 메서드입니다. |
sendQuery |
boolean | 아니요 | false |
쿼리 파라미터를 전송할지 여부입니다. |
specifyQuery |
"keypair" | "json" |
아니요 | "keypair" |
sendQuery가 true일 때 쿼리 파라미터의 형식입니다. |
queryParameters |
{ parameters: [{ name, value }] } |
아니요 | - | 키/값 쌍 형태의 쿼리 파라미터입니다. specifyQuery가 "keypair"일 때 사용됩니다. |
jsonQuery |
string | 아니요 | "" |
JSON 문자열 형태의 쿼리 파라미터입니다. specifyQuery가 "json"일 때 사용됩니다. |
sendHeaders |
boolean | 아니요 | false |
헤더를 전송할지 여부입니다. |
specifyHeaders |
"keypair" | "json" |
아니요 | "keypair" |
sendHeaders가 true일 때 헤더의 형식입니다. |
headerParameters |
{ parameters: [{ name, value }] } |
아니요 | - | 키/값 쌍 형태의 헤더입니다. specifyHeaders가 "keypair"일 때 사용됩니다. |
jsonHeaders |
string | 아니요 | "" |
JSON 문자열 형태의 헤더입니다. specifyHeaders가 "json"일 때 사용됩니다. |
options |
object | 아니요 | {} |
연결 수준 옵션입니다. 웹훅 옵션을 참고하세요. |
웹훅 옵션#
| 필드 | 유형 | 필수 여부 | 기본값 | 설명 |
|---|---|---|---|---|
allowUnauthorizedCerts |
boolean | 아니요 | false |
SSL 인증서 검증을 무시합니다. |
queryParameterArrays |
"repeat" | "brackets" | "indices" |
아니요 | "brackets" |
쿼리 파라미터에 사용되는 배열 형식입니다. sendQuery가 true일 때 사용됩니다. |
redirect |
{ redirect: { followRedirects, maxRedirects } } |
아니요 | { redirect: {} } |
HTTP 리디렉션을 따릅니다. followRedirects의 기본값은 false이며, maxRedirects의 기본값은 21입니다. |
proxy |
{ proxy: { protocol, host, port } } |
아니요 | { proxy: {} } |
HTTP/HTTPS 프록시입니다. protocol은 "https" 또는 "http"이며, host의 기본값은 "127.0.0.1", port의 기본값은 9000입니다. |
timeout |
integer ≥ 1 (ms) | 아니요 | 5000 |
중단하기 전에 서버가 응답을 시작할 때까지 대기하는 시간입니다. |
socket |
{ keepAlive, maxSockets, maxFreeSockets } |
아니요 | { keepAlive: true, maxSockets: 50, maxFreeSockets: 5 } |
소켓 풀 구성입니다. maxSockets와 maxFreeSockets는 1 이상의 정수입니다. |
[
{
"type": "webhook",
"label": "Audit",
"subscribedEvents": ["n8n.audit", "n8n.workflow"],
"anonymizeAuditMessages": true,
"url": "https://hooks.example.com/n8n",
"method": "POST",
"sendHeaders": true,
"specifyHeaders": "keypair",
"headerParameters": {
"parameters": [
{ "name": "Authorization", "value": "Bearer s3cret" }
]
},
"options": {
"timeout": 5000,
"redirect": { "redirect": { "followRedirects": true, "maxRedirects": 5 } }
}
}
]
Syslog#
| 필드 | 유형 | 필수 여부 | 기본값 | 설명 |
|---|---|---|---|---|
host |
string | 예 | - | Syslog 서버 호스트 이름 또는 IP입니다. |
port |
number | 아니요 | 514 |
Syslog 서버 포트입니다. |
protocol |
"udp" | "tcp" | "tls" |
아니요 | "udp" |
전송 프로토콜입니다. |
tlsCa |
string | protocol이 "tls"일 때 |
"" |
TLS 연결에 사용되는 PEM 형식의 CA 인증서입니다. |
facility |
number | 아니요 | 16 |
Syslog 퍼실리티 코드입니다. 허용되는 값: 0(Kernel), 1(User), 3(System), 13(Audit), 14(Alert), 1623(Local0 |
app_name |
string | 아니요 | "n8n" |
syslog APP-NAME으로 사용되는 값입니다. |
[
{
"type": "syslog",
"label": "SIEM",
"subscribedEvents": ["n8n.audit", "n8n.workflow"],
"host": "syslog.example.com",
"port": 514,
"protocol": "tls",
"tlsCa": "-----BEGIN CERTIFICATE-----\n…\n-----END CERTIFICATE-----",
"facility": 16,
"app_name": "n8n"
}
]
Sentry#
| 필드 | 유형 | 필수 여부 | 기본값 | 설명 |
|---|---|---|---|---|
dsn |
string (URL) | 예 | - | Sentry DSN 클라이언트 키입니다. |
[
{
"type": "sentry",
"label": "Sentry prod",
"subscribedEvents": ["n8n.workflow"],
"dsn": "https://public@sentry.example.com/1"
}
]
서킷 브레이커#
서킷 브레이커는 반복적인 실패 이후 대상으로의 전달을 일시적으로 중지하여, 문제가 있는 다운스트림 서비스에 부하가 걸리지 않도록 합니다. 모든 대상 유형에서 사용할 수 있습니다.
| 필드 | 유형 | 필수 여부 | 기본값 | 설명 |
|---|---|---|---|---|
maxFailures |
integer ≥ 1 | 아니요 | 5 |
failureWindow 내 실패 횟수가 이 값에 도달하면 n8n이 해당 대상으로의 요청 전송을 중지합니다. |
failureWindow |
integer ≥ 100 (ms) | 아니요 | 60000 |
실패 횟수를 계산하는 슬라이딩 윈도우입니다. 오래된 실패는 만료됩니다. |
{ "circuitBreaker": { "maxFailures": 3, "failureWindow": 30000 } }
전체 예제#
N8N_LOG_STREAMING_MANAGED_BY_ENV=true
N8N_LOG_STREAMING_DESTINATIONS='[
{
"type": "webhook",
"label": "Ops webhook",
"enabled": true,
"subscribedEvents": ["n8n.workflow", "n8n.audit"],
"anonymizeAuditMessages": true,
"url": "https://hooks.example.com/n8n",
"method": "POST",
"sendHeaders": true,
"specifyHeaders": "keypair",
"headerParameters": {
"parameters": [
{ "name": "Authorization", "value": "Bearer s3cret" }
]
},
"circuitBreaker": { "maxFailures": 5, "failureWindow": 60000 }
},
{
"type": "sentry",
"label": "Sentry prod",
"subscribedEvents": ["n8n.workflow"],
"dsn": "https://public@sentry.example.com/1"
}
]'