Hey Jose, to save you some of the pain I just went through, I would like to add the following:
%Ts does not neccessarily give you the time of the processing of the request, which is what you would want for the typical X-Request-Start header (are you using NewRelic or a similar service?). This is very hard to deduce from the documentation, but as far as I can tell it is in fact: - the time of the accept() call for the connection when this is the first request on this connection (which is usually acceptable, but might not be sometimes) - something like the end time of the previous request for any subsequent requests on that connection. Thus, if you have long-lived connections that are not constantly churning out requests, the value of %Ts might significantly deviate from what you might expect. Maybe Willy can shed some light on when exactly the value of %Ts is set, but I encourage you do a small test before trusting it (I used a simple telnet session that I pasted some requests into, with a pause in between). In the end I resorted to calling date(), which only has second resolution but is at least never off by more than a second. Hope that helps, Conrad On 08/10/2015 06:24 PM, Jose Nunez wrote: > Hi Willy, > > thanks for your answer, it works perfectly, thanks! > > Jose > > On Sun, Aug 9, 2015 at 4:55 AM, Willy Tarreau <w...@1wt.eu> wrote: > >> Hi Jose, >> >> On Fri, Aug 07, 2015 at 01:28:13PM -0400, Jose Nunez wrote: >>> Hi, >>> >>> I need to express something similar to this: >>> >>> http-request set-header X-REQUEST-START t=%[Ts]%[ms]000 >>> >>> (to append three "0"s at the end of the timestamp with milliseconds). >>> >>> I have tried with other ways to append the three "0"s at the end: >>> >>> http-request set-header X-REQUEST-START t=%Ts%[ms]\x30\x30\x30 >>> >>> and >>> >>> http-request set-header X-REQUEST-START t=%Ts%ms\x30\x30\x30 >>> >>> and no avail either. >> >> You've met the limits of the log format which is not a language and >> which requires some delimiters to be detected. Unfortunately it doesn't >> have any delimiter which doesn't appear in the output. I found a way to >> abuse it using %[] to mark a new word (since %[] detects the end of the >> current block using the closing bracket). Using just "%[]" emits a warning >> and does exactly what you want. A cleaner method in 1.6 consists in >> emitting >> an empty string as a delimitor : %[str()]. In 1.5, there is no str(), but >> you can use %[env()] which will retrieve the contents of the environment >> variable with no name, it doesn't exist so it returns an empty string. Yes >> I know that's ugly, but the log format has gone far beyond its design goals >> already! >> >> Thus it will give you this in 1.5 : >> >> http-request set-header X-REQUEST-START t=%Ts%ms%[env()]000 >> >> In 1.6 you can also do that : >> >> http-request set-header X-REQUEST-START t=%Ts%ms%[str(000)] >> >> Also, please note that what you're doing above only works because %ms is >> left-padded with zeroes. I'm not seeing this documented anywhere though. >> >> Willy >> >> > -- Conrad Hoffmann Traffic Engineer SoundCloud Ltd. | Rheinsberger Str. 76/77, 10115 Berlin, Germany Managing Director: Alexander Ljung | Incorporated in England & Wales with Company No. 6343600 | Local Branch Office | AG Charlottenburg | HRB 110657B