로그 스트리밍
n8n v2.29로그 스트리밍은 모든 Enterprise 플랜에서 사용할 수 있습니다. 로그 스트리밍을 사용하면 n8n에서 발생하는 이벤트를 자체 로깅 도구로 전송할 수 있습니다. 로그 스트리밍을 사용하려면 스트리밍 대상을 추가해야 합니다.
기능 제공 범위
로그 스트리밍은 모든 Enterprise 플랜에서 사용할 수 있습니다.
로그 스트리밍을 사용하면 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 비활성화됨
- 사용자 실행 삭제됨
- 실행 데이터 공개됨
- 실행 데이터 공개 실패
- 패키지 설치됨
- 패키지 업데이트됨
- 패키지 삭제됨
- 워크플로 생성됨
- 워크플로 삭제됨
- 워크플로 업데이트됨
- 워크플로 보관됨
- 워크플로 보관 해제됨
- 워크플로 활성화됨
- 워크플로 비활성화됨
- 워크플로 버전 업데이트됨
- 워크플로 실행됨
- 워크플로 대기 중
- 워크플로 재개됨
- 변수 생성됨
- 변수 업데이트됨
- 변수 삭제됨
- 외부 시크릿 제공업체 설정 저장됨
- 외부 시크릿 제공업체 다시 로드됨
- 외부 시크릿 연결 생성됨
- 외부 시크릿 연결 업데이트됨
- 외부 시크릿 연결 삭제됨
- 외부 시크릿 연결 테스트됨
- 외부 시크릿 연결 다시 로드됨
- 개인 게시 제한 활성화됨
- 개인 게시 제한 비활성화됨
- 개인 공유 제한 활성화됨
- 개인 공유 제한 비활성화됨
- 2FA 강제 적용 활성화됨
- 2FA 강제 적용 비활성화됨
- 토큰 교환 성공
- 토큰 교환 실패
- 토큰 교환 임베드 로그인
- 토큰 교환 임베드 로그인 실패
- 토큰 교환 아이덴티티 연결됨
- 토큰 교환 사용자 프로비저닝됨
- 토큰 교환 역할 업데이트됨
- 역할 매핑 역할 확인됨
- 역할 매핑 규칙 생성됨
- 역할 매핑 규칙 업데이트됨
- 역할 매핑 규칙 삭제됨
- 역할 매핑 규칙 일괄 삭제됨
- 워커
- 시작됨
- 중지됨
- AI 노드 로그
- 메모리 메시지 가져오기
- 메모리 메시지 추가됨
- 출력 파서 파싱됨
- 리트리버 관련 문서 가져오기
- 임베딩 문서 임베딩됨
- 임베딩 쿼리 임베딩됨
- 문서 처리됨
- 텍스트 분할기 분할됨
- 도구 호출됨
- 벡터 스토어 검색됨
- LLM 생성됨
- LLM 오류
- 벡터 스토어 채워짐
- 벡터 스토어 업데이트됨
- 러너
- 태스크 요청됨
- 응답 수신됨
- 큐
- 작업 큐에 추가됨
- 작업 큐에서 제거됨
- 작업 완료됨
- 작업 실패
- 작업 지연됨
대상#
n8n은 세 가지 대상 유형을 지원합니다:
- Syslog 서버
- 범용 웹훅
- Sentry 클라이언트
환경 변수를 사용하여 구성하기#
n8n을 셀프 호스팅하는 경우 UI 대신 환경 변수로 로그 스트리밍 대상을 관리할 수 있습니다. n8n v2.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"
}
]'