Skip to content

Commit de232b0

Browse files
authored
Vercel CLI Custom Format Support (#70)
* Add vercel custom format yaml YAML custom format supports "vercel logs" CLI command * Sample JSON output from Vercel CLI w/ JSON option such as "vercel logs [deployment_url|deployment_id] -j"
1 parent 8f51907 commit de232b0

File tree

2 files changed

+74
-0
lines changed

2 files changed

+74
-0
lines changed

formats/vercel-stream.yaml

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
# Vercel Stream Format (Single JSON Objects per Line)
2+
# This format handles Vercel's streaming format where each line is a JSON object
3+
# containing labels and the log message, severity (level) and timestamp.
4+
#
5+
# Example log lines from vercelclisample.json generate using Vercel CLI like "vercel logs [deployment_url|deployment_id] -j" for JSON format:
6+
# {"level":"error","message":"actual log message","messageTruncated":false,"rowId":"1758639354881","source":"edge-function","timestampInMs":1758639354881,"requestMethod":"GET","requestPath":"/api/noise","domain":"vercel-gonzo-logs-demo-4xufftd83-jon-reeves-projects.vercel.app","responseStatusCode":-1}
7+
# Ensure this file is in ~/.config/gonzo/formats/ and use via "vercel logs [deployment_url|deployment_id] -j | gonzo --format=vercel-stream.yaml"
8+
9+
# Structure:
10+
# - labels: ALL fields (other than "level", "message" and "timestampInMs" are automatically extracted as attributes)
11+
# - message: The actual log message
12+
# - timestamp(timestampInMs): When the log was generated (Unix ms / epoch format)
13+
14+
name: vercel-stream
15+
description: Vercel log stream format with automatic labels extraction
16+
author: Gonzo Community
17+
type: json # 'json' type for JSON-structured logs
18+
19+
# No json.fields mapping - use the raw JSON structure
20+
# This preserves all the original fields for direct access
21+
22+
mapping:
23+
# Extract and parse the timestamp
24+
timestamp:
25+
field: timestampInMs
26+
time_format: unix_ms # Vercel uses Unix ms / epoch format
27+
28+
# The 'message' field contains the actual log message
29+
body:
30+
field: message
31+
32+
# Extract severity from "level"
33+
severity:
34+
field: level # First try level
35+
transform: uppercase # Normalize to uppercase
36+
default: INFO # Default to INFO if not present
37+
38+
# Auto-map all unmapped fields as attributes
39+
auto_map_remaining: true
40+
41+
# Attributes are automatically extracted from the labels object
42+
# All fields in labels.* will become attributes
43+
# You can still explicitly map specific fields if you need transforms
44+
attributes:
45+
# Example of explicit mapping with transform (optional)
46+
# Most fields will be auto-extracted from labels
47+
http_status_severity:
48+
field: responseStatusCode
49+
transform: status_to_severity

test-data/vercelclisample.json

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
{"level":"info","message":"[noise] {\"ts\":\"2025-09-23T14:55:43.026Z\",\"level\":\"debug\",\"service\":\"orders\",\"msg\":\"validated payload\",\"reqId\":\"p8az76lx\",\"value\":65}","messageTruncated":false,"rowId":"1758639343031","source":"edge-function","timestampInMs":1758639343031,"requestMethod":"GET","requestPath":"/api/noise","domain":"vercel-gonzo-logs-demo-4xufftd83-jon-reeves-projects.vercel.app","responseStatusCode":-1}
2+
{"level":"warning","message":"[noise] {\"ts\":\"2025-09-23T14:55:43.027Z\",\"level\":\"warn\",\"service\":\"checkout\",\"msg\":\"validated payload\",\"reqId\":\"t43ih5uv\",\"value\":936}","messageTruncated":false,"rowId":"1758639343032","source":"edge-function","timestampInMs":1758639343032,"requestMethod":"GET","requestPath":"/api/noise","domain":"vercel-gonzo-logs-demo-4xufftd83-jon-reeves-projects.vercel.app","responseStatusCode":-1}
3+
{"level":"error","message":"[noise] {\"ts\":\"2025-09-23T14:55:45.871Z\",\"level\":\"error\",\"service\":\"payments\",\"msg\":\"DB roundtrip\",\"reqId\":\"xe0ym5su\",\"value\":122}","messageTruncated":false,"rowId":"1758639345872","source":"edge-function","timestampInMs":1758639345872,"requestMethod":"GET","requestPath":"/api/noise","domain":"vercel-gonzo-logs-demo-4xufftd83-jon-reeves-projects.vercel.app","responseStatusCode":-1}
4+
{"level":"info","message":"[noise] {\"ts\":\"2025-09-23T14:55:45.871Z\",\"level\":\"info\",\"service\":\"search\",\"msg\":\"cache miss\",\"reqId\":\"4elsewf1\",\"value\":589}","messageTruncated":false,"rowId":"1758639345873","source":"edge-function","timestampInMs":1758639345873,"requestMethod":"GET","requestPath":"/api/noise","domain":"vercel-gonzo-logs-demo-4xufftd83-jon-reeves-projects.vercel.app","responseStatusCode":-1}
5+
{"level":"error","message":"[noise] {\"ts\":\"2025-09-23T14:55:45.871Z\",\"level\":\"error\",\"service\":\"orders\",\"msg\":\"user not authorized\",\"reqId\":\"nhzuzj1d\",\"value\":281}","messageTruncated":false,"rowId":"1758639345875","source":"edge-function","timestampInMs":1758639345875,"requestMethod":"GET","requestPath":"/api/noise","domain":"vercel-gonzo-logs-demo-4xufftd83-jon-reeves-projects.vercel.app","responseStatusCode":-1}
6+
{"level":"error","message":"[noise] {\"ts\":\"2025-09-23T14:55:45.871Z\",\"level\":\"error\",\"service\":\"orders\",\"msg\":\"user not authorized\",\"reqId\":\"nhzuzj1d\",\"value\":281}","messageTruncated":false,"rowId":"1758639345875","source":"edge-function","timestampInMs":1758639345875,"requestMethod":"GET","requestPath":"/api/noise","domain":"vercel-gonzo-logs-demo-4xufftd83-jon-reeves-projects.vercel.app","responseStatusCode":-1}
7+
{"level":"error","message":"[noise] {\"ts\":\"2025-09-23T14:55:45.871Z\",\"level\":\"error\",\"service\":\"orders\",\"msg\":\"user not authorized\",\"reqId\":\"nhzuzj1d\",\"value\":281}","messageTruncated":false,"rowId":"1758639345875","source":"edge-function","timestampInMs":1758639345875,"requestMethod":"GET","requestPath":"/api/noise","domain":"vercel-gonzo-logs-demo-4xufftd83-jon-reeves-projects.vercel.app","responseStatusCode":-1}
8+
{"level":"error","message":"[noise] {\"ts\":\"2025-09-23T14:55:46.885Z\",\"level\":\"error\",\"service\":\"checkout\",\"msg\":\"user not authorized\",\"reqId\":\"u4av8ykf\",\"value\":479}","messageTruncated":false,"rowId":"1758639346887","source":"edge-function","timestampInMs":1758639346887,"requestMethod":"GET","requestPath":"/api/noise","domain":"vercel-gonzo-logs-demo-4xufftd83-jon-reeves-projects.vercel.app","responseStatusCode":-1}
9+
{"level":"error","message":"[noise] {\"ts\":\"2025-09-23T14:55:46.885Z\",\"level\":\"error\",\"service\":\"checkout\",\"msg\":\"user not authorized\",\"reqId\":\"qisbo1la\",\"value\":36}","messageTruncated":false,"rowId":"1758639346888","source":"edge-function","timestampInMs":1758639346888,"requestMethod":"GET","requestPath":"/api/noise","domain":"vercel-gonzo-logs-demo-4xufftd83-jon-reeves-projects.vercel.app","responseStatusCode":-1}
10+
{"level":"warning","message":"[noise] {\"ts\":\"2025-09-23T14:55:47.870Z\",\"level\":\"warn\",\"service\":\"search\",\"msg\":\"retrying upstream\",\"reqId\":\"lwcoxt2p\",\"value\":802}","messageTruncated":false,"rowId":"1758639347871","source":"edge-function","timestampInMs":1758639347871,"requestMethod":"GET","requestPath":"/api/noise","domain":"vercel-gonzo-logs-demo-4xufftd83-jon-reeves-projects.vercel.app","responseStatusCode":-1}
11+
{"level":"error","message":"[noise] {\"ts\":\"2025-09-23T14:55:47.870Z\",\"level\":\"error\",\"service\":\"payments\",\"msg\":\"timeout talking to dependency\",\"reqId\":\"v8acmom6\",\"value\":462}","messageTruncated":false,"rowId":"1758639347872","source":"edge-function","timestampInMs":1758639347872,"requestMethod":"GET","requestPath":"/api/noise","domain":"vercel-gonzo-logs-demo-4xufftd83-jon-reeves-projects.vercel.app","responseStatusCode":-1}
12+
{"level":"error","message":"[noise] {\"ts\":\"2025-09-23T14:55:48.880Z\",\"level\":\"error\",\"service\":\"search\",\"msg\":\"processing request\",\"reqId\":\"kjo3hhlu\",\"value\":771}","messageTruncated":false,"rowId":"1758639348882","source":"edge-function","timestampInMs":1758639348882,"requestMethod":"GET","requestPath":"/api/noise","domain":"vercel-gonzo-logs-demo-4xufftd83-jon-reeves-projects.vercel.app","responseStatusCode":-1}
13+
{"level":"warning","message":"[noise] {\"ts\":\"2025-09-23T14:55:48.881Z\",\"level\":\"warn\",\"service\":\"orders\",\"msg\":\"cache miss\",\"reqId\":\"wyhbzr0x\",\"value\":588}","messageTruncated":false,"rowId":"1758639348885","source":"edge-function","timestampInMs":1758639348885,"requestMethod":"GET","requestPath":"/api/noise","domain":"vercel-gonzo-logs-demo-4xufftd83-jon-reeves-projects.vercel.app","responseStatusCode":-1}
14+
{"level":"warning","message":"[noise] {\"ts\":\"2025-09-23T14:55:48.881Z\",\"level\":\"warn\",\"service\":\"orders\",\"msg\":\"cache miss\",\"reqId\":\"wyhbzr0x\",\"value\":588}","messageTruncated":false,"rowId":"1758639348885","source":"edge-function","timestampInMs":1758639348885,"requestMethod":"GET","requestPath":"/api/noise","domain":"vercel-gonzo-logs-demo-4xufftd83-jon-reeves-projects.vercel.app","responseStatusCode":-1}
15+
{"level":"info","message":"[noise] {\"ts\":\"2025-09-23T14:55:49.876Z\",\"level\":\"debug\",\"service\":\"orders\",\"msg\":\"retrying upstream\",\"reqId\":\"2db09kdd\",\"value\":766}","messageTruncated":false,"rowId":"1758639349878","source":"edge-function","timestampInMs":1758639349878,"requestMethod":"GET","requestPath":"/api/noise","domain":"vercel-gonzo-logs-demo-4xufftd83-jon-reeves-projects.vercel.app","responseStatusCode":-1}
16+
{"level":"info","message":"[noise] {\"ts\":\"2025-09-23T14:55:49.876Z\",\"level\":\"debug\",\"service\":\"payments\",\"msg\":\"DB roundtrip\",\"reqId\":\"qohl2swi\",\"value\":52}","messageTruncated":false,"rowId":"1758639349879","source":"edge-function","timestampInMs":1758639349879,"requestMethod":"GET","requestPath":"/api/noise","domain":"vercel-gonzo-logs-demo-4xufftd83-jon-reeves-projects.vercel.app","responseStatusCode":-1}
17+
{"level":"error","message":"[noise] {\"ts\":\"2025-09-23T14:55:49.876Z\",\"level\":\"error\",\"service\":\"auth\",\"msg\":\"processing request\",\"reqId\":\"ilnpnvrj\",\"value\":367}","messageTruncated":false,"rowId":"1758639349880","source":"edge-function","timestampInMs":1758639349880,"requestMethod":"GET","requestPath":"/api/noise","domain":"vercel-gonzo-logs-demo-4xufftd83-jon-reeves-projects.vercel.app","responseStatusCode":-1}
18+
{"level":"warning","message":"[noise] {\"ts\":\"2025-09-23T14:55:53.884Z\",\"level\":\"warn\",\"service\":\"checkout\",\"msg\":\"user not authorized\",\"reqId\":\"mmttqrxf\",\"value\":797}","messageTruncated":false,"rowId":"1758639353889","source":"edge-function","timestampInMs":1758639353889,"requestMethod":"GET","requestPath":"/api/noise","domain":"vercel-gonzo-logs-demo-4xufftd83-jon-reeves-projects.vercel.app","responseStatusCode":-1}
19+
{"level":"warning","message":"[noise] {\"ts\":\"2025-09-23T14:55:53.884Z\",\"level\":\"warn\",\"service\":\"checkout\",\"msg\":\"user not authorized\",\"reqId\":\"mmttqrxf\",\"value\":797}","messageTruncated":false,"rowId":"1758639353889","source":"edge-function","timestampInMs":1758639353889,"requestMethod":"GET","requestPath":"/api/noise","domain":"vercel-gonzo-logs-demo-4xufftd83-jon-reeves-projects.vercel.app","responseStatusCode":-1}
20+
{"level":"error","message":"[noise] {\"ts\":\"2025-09-23T14:55:54.879Z\",\"level\":\"error\",\"service\":\"search\",\"msg\":\"validated payload\",\"reqId\":\"xttk3vh1\",\"value\":672}","messageTruncated":false,"rowId":"1758639354881","source":"edge-function","timestampInMs":1758639354881,"requestMethod":"GET","requestPath":"/api/noise","domain":"vercel-gonzo-logs-demo-4xufftd83-jon-reeves-projects.vercel.app","responseStatusCode":-1}
21+
{"level":"warning","message":"[noise] {\"ts\":\"2025-09-23T14:55:55.879Z\",\"level\":\"warn\",\"service\":\"auth\",\"msg\":\"validated payload\",\"reqId\":\"1nkor85z\",\"value\":697}","messageTruncated":false,"rowId":"1758639355881","source":"edge-function","timestampInMs":1758639355881,"requestMethod":"GET","requestPath":"/api/noise","domain":"vercel-gonzo-logs-demo-4xufftd83-jon-reeves-projects.vercel.app","responseStatusCode":-1}
22+
{"level":"info","message":"[noise] {\"ts\":\"2025-09-23T14:55:56.898Z\",\"level\":\"info\",\"service\":\"search\",\"msg\":\"validated payload\",\"reqId\":\"mdv8ntee\",\"value\":24}","messageTruncated":false,"rowId":"1758639356899","source":"edge-function","timestampInMs":1758639356899,"requestMethod":"GET","requestPath":"/api/noise","domain":"vercel-gonzo-logs-demo-4xufftd83-jon-reeves-projects.vercel.app","responseStatusCode":-1}
23+
{"level":"info","message":"[noise] {\"ts\":\"2025-09-23T14:55:56.898Z\",\"level\":\"info\",\"service\":\"payments\",\"msg\":\"user not authorized\",\"reqId\":\"xnz72ol5\",\"value\":979}","messageTruncated":false,"rowId":"1758639356900","source":"edge-function","timestampInMs":1758639356900,"requestMethod":"GET","requestPath":"/api/noise","domain":"vercel-gonzo-logs-demo-4xufftd83-jon-reeves-projects.vercel.app","responseStatusCode":-1}
24+
{"level":"error","message":"[noise] {\"ts\":\"2025-09-23T14:55:56.898Z\",\"level\":\"error\",\"service\":\"auth\",\"msg\":\"validated payload\",\"reqId\":\"wn6r3lph\",\"value\":817}","messageTruncated":false,"rowId":"1758639356901","source":"edge-function","timestampInMs":1758639356901,"requestMethod":"GET","requestPath":"/api/noise","domain":"vercel-gonzo-logs-demo-4xufftd83-jon-reeves-projects.vercel.app","responseStatusCode":-1}
25+
{"level":"error","message":"[noise] {\"ts\":\"2025-09-23T14:55:56.898Z\",\"level\":\"error\",\"service\":\"auth\",\"msg\":\"validated payload\",\"reqId\":\"wn6r3lph\",\"value\":817}","messageTruncated":false,"rowId":"1758639356901","source":"edge-function","timestampInMs":1758639356901,"requestMethod":"GET","requestPath":"/api/noise","domain":"vercel-gonzo-logs-demo-4xufftd83-jon-reeves-projects.vercel.app","responseStatusCode":-1}

0 commit comments

Comments
 (0)