This module adds logging encoder named transform. The module accepts a template with the placeholders are surrounded
by
braces {} and filled by values extracted from the stucture of the JSON log encoder. The JSON configuration looks like
this:
{
"encoder": "transform",
"template": "{...}"
}The nesting is traversed using >. For example, to print the uri field, the traversal is templated as {request>uri}
.
{
"request": {
"method": "GET",
"uri": "/",
"proto": "HTTP/2.0",
...
}The Caddyfile configuration accepts the template immediately following the encoder name, and can be ommitted to assume
Apache Common Log Format. The body of the block accepts the custom placeholder property in addition to all the properties listed within the format modules section.
log {
format transform [<template>] {
placeholder <string>
unescape_strings
# other fields accepted by JSON encoder
}
}The syntax of template is defined by the package github.com/buger/jsonparser.
Objects are traversed using the key name. Arrays can be traversed by using the format [index], as in [0]. For
example, to get the first element in the User-Agent array, the template is {request>headers>User-Agent>[0]}.
The module comes with one special value of {common_log} for the Apache Common Log format to simplify configuration
format transform "{common_log}"The more spelled out way of doing it is:
format transform `{request>remote_ip} - {user_id} [{ts}] "{request>method} {request>uri} {request>proto}" {status} {size}` {
time_format "02/Jan/2006:15:04:05 -0700"
}The more spelled out way of doing it is:
format transform `{request>remote_ip} - {user_id} [{ts}] "{request>method} {request>uri} {request>proto}" {status} {size} "{request>headers>Referer>[0]}" "{request>headers>User-Agent>[0]}"` {
time_format "02/Jan/2006:15:04:05 -0700"
}You can use an alternative value by using the following syntax {val1:val2}. For example, to show the X-Forwarded-For
header as remote_ip replacement you can do the following
format transform `{request>headers>X-Forwarded-For>[0]:request>remote_ip} - {user_id} [{ts}] "{request>method} {request>uri} {request>proto}" {status} {size} "{request>headers>Referer>[0]}" "{request>headers>User-Agent>[0]}"` {
time_format "02/Jan/2006:15:04:05 -0700"
}The character : act as indicator for alternative value if the preceding key is not set.
For example, {request>headers>X-Forwarded-For>[0]:request>remote_ip} means that if X-Forwarded-For first array value is not empty use that otherwise fallback on remote_ip.
First, the xcaddy command:
$ go install github.com/caddyserver/xcaddy/cmd/xcaddy@latestThen build Caddy with this Go module plugged in. For example:
$ xcaddy build --with github.com/caddyserver/transform-encoderAlternatively, Caddy 2.4.4 and up supports adding a module directly:
$ caddy add-package github.com/caddyserver/transform-encoderNote that in all cases Caddy should be stopped and started to get the module loaded, and future updates should be conducted through either xcaddy (if built with xcaddy) or caddy upgrade (if added with add-package).