The Log Namespace feature
Learn how the log namespacing works.
Before you begin, this guide assumes the following:
- You understand that this feature, and the global schemas are mutually exclusive.
- When log namespacing is enabled, the global schema settings are ignored.
- This feature is still in
betaso behavior might change.
Default Behavior
Vector Config
Show/Hide
schema:
log_namespace: true
sources:
s0:
type: demo_logs
format: shuffle
lines:
- Hello World!
interval: 10
sinks:
text_console:
type: console
inputs:
- s0
encoding:
codec: text
json_console:
type: console
inputs:
- s0
encoding:
codec: json
json:
pretty: true
stdout
Sample output from text_console:
Hello World!
Sample output from json_console:
"Hello World!"
Difference with global schema
If we switch this feature off:
schema:
log_namespace: false
Then we observe a big difference for these two encoders:
The text encoder only encodes the value that log_schema.message_key points to (which is .message by default).
Sample output from the text_console sink:
{"host":"localhost","message":"Hello World!","service":"vector","source_type":"demo_logs","timestamp":"2025-05-01T19:06:12.227425Z"}
The json encoder passes the whole log to Serde JSON for encoding.
Sample output from the json_console sink:
{
"host": "localhost",
"message": {
"host": "localhost",
"message": "Hello World!",
"service": "vector",
"source_type": "demo_logs",
"timestamp": "2025-05-01T19:06:12.227425Z"
},
"service": "vector",
"source_type": "demo_logs",
"timestamp": "2025-05-01T19:06:12.227425Z"
}
The following example helps illustrate the difference between the two encoders.
Consider the input "foo", which is a valid JSON string but not a JSON object.
Vector converts it into a structured object by wrapping it with the log_schema.message_key (e.g., "message"), resulting in: {"message": "foo"}.
Custom semantic meanings
Vector Config
Show/Hide
schema:
log_namespace: true
sources:
s0:
type: demo_logs
format: shuffle
lines:
- Hello World!
interval: 10
transforms:
t0:
type: remap
inputs:
- s0
source: |
set_semantic_meaning(.custom_field, "message")
# This becomes the new payload. The `.` is overwritten.
.custom_field = "foo"
t1:
type: remap
inputs:
- s0
source: |
# The value of `.` is `Hello World!` at this point, however the following line overwrites it.
. = "bar"
sinks:
text_console:
type: console
inputs:
- t0
encoding:
codec: text
json_console:
type: console
inputs:
- t1
encoding:
codec: json
json:
pretty: true
stdout
Sample output from text_console:
foo
Sample output from json_console:
"bar"