Much thanks for the insights, clarifications, and solution possibilities. Will chew on this for a bit ...
On Wed, Jun 27, 2018 at 10:40 PM, Willy Tarreau <[email protected]> wrote: > On Wed, Jun 27, 2018 at 04:08:27PM -0600, Jim Freeman wrote: > > With a configuration having many 'redirect's (and wanting to know which > > 'Location' a given request was redirected to), I configured > > > > capture response header Location len 64 > > log-format %hs > > > > , but see no log entries for redirects I know haproxy is generating. > > captures work for input data, not generated data. > > > With further testing, I know that Location responses from downstream are > > being logged - just not those generated on-host via 'redirect'. > > exactly. > > > I've scoured the docs for insight/reasoning re: this behavior, but can't > > find anything. > > Assuming this is as-designed, I'd appreciate any further illumination ... > > Is there a way to log Location from haproxy redirects ? > > There could be a solution I guess, involving a variable, though it would > require you to either double the number of redirect rules, or add a > condition to each rule. The principle would be the following : > > http-request set-var(txn.location) string(/path/to/location) if ! { > var(txn.location) -m found } { your condition here } > ... many other such rules ... > http-request redirect location %[var(txn.location)] if { > var(txn.location) -m found } > > Then you can add a field for var(txn.location) in your log-format. > > The only thing is that it only supports sample expressions so you don't > have > the flexibility you currently have with log-format in the redirect header. > You should be able to achieve the same by using the concat() converter in > the expression but I agree that it's less readable. > > Note that there is a "set-var()" converter so if your redirect expressions > are simple, you could as well set the variable on the fly. It will just not > take the result of the log-format. Example : > > http-request redirect location > %[string("/path/to/location"),set-var(txn.location)] > if { your condition here } > > It should be able to always replace my other example above and be more > efficient. But the example below won't do what you expect : > > http-request redirect location > /path/to/location/?src=%[src,set-var(txn.location)] > if { your condition here } > > as it would only capture the output of the "src" fetch function instead of > the whole line. Maybe it could be useful to support an extra "redirect" > option to duplicate the output into a variable. I don't think it would > be very complicated to have this : > > http-request redirect location /path/to/foo code 302 > set-var(txn.location) > > But I could be wrong as I remember that variable allocation at config > parsing > time is tricky. > > Regards, > Willy >

