Skip to content

Commit e202948

Browse files
author
Kim Dowling
committed
Copies the referer/cookie code to allow a header to be specified for forwarding
1 parent d02fd57 commit e202948

File tree

3 files changed

+43
-19
lines changed

3 files changed

+43
-19
lines changed

README.md

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ CentOS:
3838
$ sudo rpm -i libapache2-mod-gelf-0.1.0-1.x86_64.rpm
3939
restart apache
4040
```
41-
41+
4242
# Configuration
4343

4444
Load the module in `/etc/apache2/mods-enabled/log_gelf.load`:
@@ -60,15 +60,16 @@ Configure the module in `/etc/apache2/mods-enabled/log_gelf.conf`:
6060
```
6161
On CentOS both files are combined in `/etc/httpd/conf.modules.d/02-gelf.conf`
6262

63-
| Parameter | Argument | Description |
64-
|--------------|------------------------|-----------------------------------------------|
65-
| GelfEnabled | On/Off | Load GELF logging module |
66-
| GelfUrl | Graylog server URL | Set IP and port of a UDP GELF input |
67-
| GelfSource | (Optional) | Overwrite source field |
68-
| GelfFacility | (Optional) | Overwrite logging facility |
69-
| GelfTag | (Optional) | Add a `tag` field to every log message |
70-
| GelfCookie | (Optional) cookie name | Extract cookie from web request |
71-
| GelfFields | (Optional) | Configures which information should be logged |
63+
| Parameter | Argument | Description |
64+
|--------------|------------------------|---------------------------------------------------|
65+
| GelfEnabled | On/Off | Load GELF logging module |
66+
| GelfUrl | Graylog server URL | Set IP and port of a UDP GELF input |
67+
| GelfSource | (Optional) | Overwrite source field |
68+
| GelfFacility | (Optional) | Overwrite logging facility |
69+
| GelfTag | (Optional) | Add a `tag` field to every log message |
70+
| GelfCookie | (Optional) cookie name | Extract cookie from web request, Use 'c' GelField |
71+
| GelfHeader | (Optional) header name | Extract header from web request, Use 'X' GelField |
72+
| GelfFields | (Optional) | Configures which information should be logged |
7273

7374
What does the `GelfFields` string mean:
7475

@@ -97,6 +98,7 @@ What does the `GelfFields` string mean:
9798
| u | Username |
9899
| V | Server name |
99100
| v | VirtualHost name |
101+
| X | Extract Header |
100102

101103
# Packages
102104

src/functions.h

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,11 +61,11 @@ static const char *extract_request_line(request_rec *r, char *a)
6161
* (note the truncation before the protocol string for HTTP/0.9 requests)
6262
* (note also that r->the_request contains the unmodified request)
6363
*/
64-
return (r->parsed_uri.password)
64+
return (r->parsed_uri.password)
6565
? apr_pstrcat(r->pool, r->method, " ",
6666
apr_uri_unparse(r->pool,
6767
&r->parsed_uri, 0),
68-
r->assbackwards ? NULL : " ",
68+
r->assbackwards ? NULL : " ",
6969
r->protocol, NULL)
7070
: r->the_request;
7171
}
@@ -148,6 +148,19 @@ static const char *extract_child_pid(request_rec *r, char *a)
148148
return a;
149149
}
150150

151+
static const char *extract_header(request_rec *r, char *a)
152+
{
153+
const char *tempref;
154+
155+
tempref = apr_table_get(r->headers_in, a);
156+
if (!tempref)
157+
{
158+
return "-";
159+
} else {
160+
return tempref;
161+
}
162+
}
163+
151164
static const char *extract_referer(request_rec *r, char *a)
152165
{
153166
const char *tempref;

src/mod_log_gelf.c

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
#define DEFAULT_LOG_FMT "ABDhmsvRti"
1818
#define UDP 0
19-
#define TCP 1
19+
#define TCP 1
2020
//#define RECONNECT_INTERVAL 120000000 // reconnect every 2min
2121
#define RECONNECT_INTERVAL 0
2222
#define MIN_CONNECTIONS 1
@@ -50,6 +50,7 @@ typedef struct {
5050
const char *tag; /* Optional tag field */
5151
const char *fields; /* String with fields of interest */
5252
const char *cookie; /* Log this cookie */
53+
const char *header; /* Log this header */
5354
log_item **parsed_fields; /* Link fields to extractor function */
5455
apr_pool_t *parse_pool; /* memory pool for option parsing */
5556
apr_reslist_t *connection_pool; /* Connection pool, with min, max and ttl settings */
@@ -98,7 +99,7 @@ void log_gelf_register_item(server_rec *server, apr_pool_t *p,
9899
item->field_name = field_name;
99100
if (arg)
100101
item->arg = arg;
101-
102+
102103
length = strlen(config->fields);
103104
for (i = 0; i<length; i++) {
104105
char *pos;
@@ -182,6 +183,12 @@ static const char *set_gelf_cookie(cmd_parms *cmd, void *cfg, const char *arg) {
182183
config->cookie = arg;
183184
return NULL;
184185
}
186+
/* Override log format string */
187+
static const char *set_gelf_header(cmd_parms *cmd, void *cfg, const char *arg) {
188+
gelf_config *config = ap_get_module_config(cmd->server->module_config, &log_gelf_module);
189+
config->header = arg;
190+
return NULL;
191+
}
185192

186193
static const command_rec log_gelf_directives[] = {
187194
AP_INIT_FLAG("GelfEnabled", set_gelf_enabled, NULL, RSRC_CONF, "Enable or disable GELF logging"),
@@ -191,6 +198,7 @@ static const command_rec log_gelf_directives[] = {
191198
AP_INIT_TAKE1("GelfTag", set_gelf_tag, NULL, RSRC_CONF, "Set a identification tag"),
192199
AP_INIT_TAKE1("GelfFields", set_gelf_fields, NULL, RSRC_CONF, "List of fields that should be logged"),
193200
AP_INIT_TAKE1("GelfCookie", set_gelf_cookie, NULL, RSRC_CONF, "Add this cookie the log message"),
201+
AP_INIT_TAKE1("GelfHeader", set_gelf_header, NULL, RSRC_CONF, "Add this header the log message"),
194202
{ NULL }
195203
};
196204

@@ -399,7 +407,8 @@ static int log_gelf_post_config(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *pte
399407
log_gelf_register_item(server,p,'u', extract_remote_user, NULL, "_remote_user");
400408
log_gelf_register_item(server,p,'V', extract_server_name, NULL, "_server_name");
401409
log_gelf_register_item(server,p,'v', extract_virtual_host, NULL, "_virtual_host");
402-
410+
log_gelf_register_item(server,p,'X', extract_header, config->header, "_header");
411+
403412
return OK;
404413
}
405414

@@ -444,7 +453,7 @@ char * log_gelf_make_json(request_rec *request) {
444453

445454
/* init json object */
446455
json_object* object = json_object_new_object();
447-
456+
448457
/* attach field pairs to json root */
449458
json_add_string(object, "version", "1.1");
450459
json_add_string(object, "host", config->source);
@@ -562,7 +571,7 @@ void log_gelf_send_message_udp(const transferData* payload, request_rec *request
562571
if (!con) {
563572
return;
564573
}
565-
574+
566575
if (verbose > 0) {
567576
log_error(APLOG_MARK, APLOG_ERR, 0, request->server,
568577
"mod_log_gelf: Sending GELF message: %s", (char*)payload->data);
@@ -600,7 +609,7 @@ void log_gelf_send_message_tcp(const transferData* payload, request_rec *request
600609
if (!con || !con->s) {
601610
return;
602611
}
603-
612+
604613
if (verbose > 0) {
605614
log_error(APLOG_MARK, APLOG_ERR, 0, request->server,
606615
"mod_log_gelf: Sending GELF message: %s", gelf_payload);
@@ -656,7 +665,7 @@ static void register_hooks(apr_pool_t *p) {
656665
ap_hook_log_transaction(log_gelf_transaction, NULL, NULL, APR_HOOK_LAST);
657666
}
658667

659-
module AP_MODULE_DECLARE_DATA log_gelf_module = {
668+
module AP_MODULE_DECLARE_DATA log_gelf_module = {
660669
STANDARD20_MODULE_STUFF,
661670
NULL, /* Per-directory configuration handler */
662671
NULL, /* Merge handler for per-directory configurations */

0 commit comments

Comments
 (0)