Please refer to the table below for currently defined variables :
+---+------+-----------------------------------------------+-------------+
- | H | var | field name (8.2.2 and 8.2.3 for description) | type |
+ | R | var | field name (8.2.2 and 8.2.3 for description) | type |
+---+------+-----------------------------------------------+-------------+
| | %o | special variable, apply flags on all next var | |
+---+------+-----------------------------------------------+-------------+
| | %Sp | server_port | numeric |
| | %T | gmt_date_time | date |
| | %Tc | Tc | numeric |
- | * | %Tq | Tq | numeric |
- | * | %Tr | Tr | numeric |
+ | H | %Tq | Tq | numeric |
+ | H | %Tr | Tr | numeric |
| | %Ts | timestamp | numeric |
| | %Tt | Tt | numeric |
| | %Tw | Tw | numeric |
| | %b | backend_name | string |
| | %bc | beconn | numeric |
| | %bq | backend_queue | numeric |
- | * | %cc | captured_request_cookie | string |
- | * | %rt | http_request_counter | numeric |
- | * | %cs | captured_response_cookie | string |
+ | H | %cc | captured_request_cookie | string |
+ | H | %rt | http_request_counter | numeric |
+ | H | %cs | captured_response_cookie | string |
| | %f | frontend_name | string |
| | %ft | frontend_name_transport ('~' suffix for SSL) | string |
| | %fc | feconn | numeric |
- | * | %hr | captured_request_headers default style | string |
- | * | %hrl | captured_request_headers CLF style | string list |
- | * | %hs | captured_response_headers default style | string |
- | * | %hsl | captured_response_headers CLF style | string list |
+ | H | %hr | captured_request_headers default style | string |
+ | H | %hrl | captured_request_headers CLF style | string list |
+ | H | %hs | captured_response_headers default style | string |
+ | H | %hsl | captured_response_headers CLF style | string list |
| | %ms | accept date milliseconds | numeric |
| | %pid | PID | numeric |
- | * | %r | http_request | string |
+ | H | %r | http_request | string |
| | %rc | retries | numeric |
| | %s | server_name | string |
| | %sc | srv_conn | numeric |
| | %sq | srv_queue | numeric |
- | * | %st | status_code | numeric |
+ | S | %sslc| ssl_ciphers (ex: AES-SHA) | string |
+ | S | %sslv| ssl_version (ex: TLSv1) | string |
+ | H | %st | status_code | numeric |
| | %t | date_time | date |
| | %ts | termination_state | string |
- | * | %tsc | termination_state with cookie status | string |
+ | H | %tsc | termination_state with cookie status | string |
+---+------+-----------------------------------------------+-------------+
-*: mode http only
+ R = Restrictions : H = mode http only ; S = SSL only
8.3. Advanced logging options
-----------------------------
{ "rt", LOG_FMT_COUNTER, PR_MODE_HTTP, LW_REQ, NULL }, /* HTTP request counter */
{ "H", LOG_FMT_HOSTNAME, PR_MODE_TCP, LW_INIT, NULL }, /* Hostname */
{ "ID", LOG_FMT_UNIQUEID, PR_MODE_HTTP, LW_BYTES, NULL }, /* Unique ID */
+ { "sslc", LOG_FMT_SSL_CIPHER, PR_MODE_TCP, LW_XPRT, NULL }, /* client-side SSL ciphers */
+ { "sslv", LOG_FMT_SSL_VERSION, PR_MODE_TCP, LW_XPRT, NULL }, /* client-side SSL protocol version */
{ 0, 0, 0, 0, NULL }
};
LOGCHAR('"');
last_isspace = 0;
break;
+#ifdef USE_OPENSSL
+ case LOG_FMT_SSL_CIPHER: // %sslc
+ src = NULL;
+ if (s->listener->xprt == &ssl_sock)
+ src = ssl_sock_get_cipher_name(&s->si[0].conn);
+ ret = lf_text(tmplog, src, dst + maxsize - tmplog, tmp);
+ if (ret == NULL)
+ goto out;
+ tmplog = ret;
+ last_isspace = 0;
+ break;
+ case LOG_FMT_SSL_VERSION: // %sslv
+ src = NULL;
+ if (s->listener->xprt == &ssl_sock)
+ src = ssl_sock_get_proto_version(&s->si[0].conn);
+ ret = lf_text(tmplog, src, dst + maxsize - tmplog, tmp);
+ if (ret == NULL)
+ goto out;
+ tmplog = ret;
+ last_isspace = 0;
+ break;
+#endif
case LOG_FMT_BACKEND: // %b
src = be->id;
ret = lf_text(tmplog, src, dst + maxsize - tmplog, tmp);
SSL_set_shutdown(conn->xprt_ctx, SSL_SENT_SHUTDOWN);
}
+/* used for logging, may be changed for a sample fetch later */
+const char *ssl_sock_get_cipher_name(struct connection *conn)
+{
+ if (!conn->xprt && !conn->xprt_ctx)
+ return NULL;
+ return SSL_get_cipher_name(conn->xprt_ctx);
+}
+
+/* used for logging, may be changed for a sample fetch later */
+const char *ssl_sock_get_proto_version(struct connection *conn)
+{
+ if (!conn->xprt && !conn->xprt_ctx)
+ return NULL;
+ return SSL_get_version(conn->xprt_ctx);
+}
+
/***** Below are some sample fetching functions for ACL/patterns *****/
/* boolean, returns true if client cert was present */