
Security News
Software Engineering Daily Podcast: Feross on AI, Open Source, and Supply Chain Risk
Socket CEO Feross Aboukhadijeh joins Software Engineering Daily to discuss modern software supply chain attacks and rising AI-driven security risks.
github.com/caddyserver/format-encoder
Advanced tools
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@latest
Then build Caddy with this Go module plugged in. For example:
$ xcaddy build --with github.com/caddyserver/transform-encoder
Alternatively, Caddy 2.4.4 and up supports adding a module directly:
$ caddy add-package github.com/caddyserver/transform-encoder
Note 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).
FAQs
Unknown package
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
Socket CEO Feross Aboukhadijeh joins Software Engineering Daily to discuss modern software supply chain attacks and rising AI-driven security risks.

Security News
GitHub has revoked npm classic tokens for publishing; maintainers must migrate, but OpenJS warns OIDC trusted publishing still has risky gaps for critical projects.

Security News
Rust’s crates.io team is advancing an RFC to add a Security tab that surfaces RustSec vulnerability and unsoundness advisories directly on crate pages.