mod_http_logging/mod_http_logging.lua
author Kim Alvefur <zash@zash.se>
Sun, 03 Mar 2024 11:23:40 +0100
changeset 5857 97c9b76867ca
parent 2975 c89be016a075
permissions -rw-r--r--
mod_log_ringbuffer: Detach event handlers on logging reload (thanks Menel) Otherwise the global event handlers accumulate, one added each time logging is reoladed, and each invocation of the signal or event triggers one dump of each created ringbuffer.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1886
99863a6a7b8c mod_http_logging: Produce HTTP logs in the style of Apache
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     1
-- mod_http_logging
99863a6a7b8c mod_http_logging: Produce HTTP logs in the style of Apache
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     2
--
99863a6a7b8c mod_http_logging: Produce HTTP logs in the style of Apache
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     3
-- Copyright (C) 2015 Kim Alvefur
99863a6a7b8c mod_http_logging: Produce HTTP logs in the style of Apache
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     4
--
1887
c625ed20ebda mod_http_logging: MIT
Kim Alvefur <zash@zash.se>
parents: 1886
diff changeset
     5
-- This project is MIT/X11 licensed. Please see the
c625ed20ebda mod_http_logging: MIT
Kim Alvefur <zash@zash.se>
parents: 1886
diff changeset
     6
-- COPYING file in the source package for more information.
c625ed20ebda mod_http_logging: MIT
Kim Alvefur <zash@zash.se>
parents: 1886
diff changeset
     7
--
1886
99863a6a7b8c mod_http_logging: Produce HTTP logs in the style of Apache
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     8
-- Produces HTTP logs in the style of Apache
99863a6a7b8c mod_http_logging: Produce HTTP logs in the style of Apache
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     9
--
99863a6a7b8c mod_http_logging: Produce HTTP logs in the style of Apache
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    10
-- TODO
99863a6a7b8c mod_http_logging: Produce HTTP logs in the style of Apache
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    11
-- * Configurable format?
99863a6a7b8c mod_http_logging: Produce HTTP logs in the style of Apache
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    12
99863a6a7b8c mod_http_logging: Produce HTTP logs in the style of Apache
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    13
module:set_global();
99863a6a7b8c mod_http_logging: Produce HTTP logs in the style of Apache
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    14
99863a6a7b8c mod_http_logging: Produce HTTP logs in the style of Apache
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    15
local server = require "net.http.server";
99863a6a7b8c mod_http_logging: Produce HTTP logs in the style of Apache
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    16
2970
678be8ea4d38 mod_http_logging: Factor out body length calculation
Kim Alvefur <zash@zash.se>
parents: 2969
diff changeset
    17
local function get_content_len(response, body)
678be8ea4d38 mod_http_logging: Factor out body length calculation
Kim Alvefur <zash@zash.se>
parents: 2969
diff changeset
    18
	local len = response.headers.content_length;
678be8ea4d38 mod_http_logging: Factor out body length calculation
Kim Alvefur <zash@zash.se>
parents: 2969
diff changeset
    19
	if len then return len; end
2975
c89be016a075 mod_http_logging: Fix typo [luacheck]
Kim Alvefur <zash@zash.se>
parents: 2973
diff changeset
    20
	if not body then body = response.body; end
2970
678be8ea4d38 mod_http_logging: Factor out body length calculation
Kim Alvefur <zash@zash.se>
parents: 2969
diff changeset
    21
	if body then return #tostring(body); end
678be8ea4d38 mod_http_logging: Factor out body length calculation
Kim Alvefur <zash@zash.se>
parents: 2969
diff changeset
    22
end
678be8ea4d38 mod_http_logging: Factor out body length calculation
Kim Alvefur <zash@zash.se>
parents: 2969
diff changeset
    23
2969
557c976735e1 mod_http_logging: Factor out logging into a function for future reuse
Kim Alvefur <zash@zash.se>
parents: 2167
diff changeset
    24
local function log_response(response, body)
2970
678be8ea4d38 mod_http_logging: Factor out body length calculation
Kim Alvefur <zash@zash.se>
parents: 2969
diff changeset
    25
	local len = tostring(get_content_len(response, body) or "-");
2969
557c976735e1 mod_http_logging: Factor out logging into a function for future reuse
Kim Alvefur <zash@zash.se>
parents: 2167
diff changeset
    26
	local request = response.request;
2972
569b98d6fca1 mod_http_logging: Be robust against missing connection object
Kim Alvefur <zash@zash.se>
parents: 2971
diff changeset
    27
	local ip = request.ip;
569b98d6fca1 mod_http_logging: Be robust against missing connection object
Kim Alvefur <zash@zash.se>
parents: 2971
diff changeset
    28
	if not ip and request.conn then
569b98d6fca1 mod_http_logging: Be robust against missing connection object
Kim Alvefur <zash@zash.se>
parents: 2971
diff changeset
    29
		ip = request.conn:ip();
569b98d6fca1 mod_http_logging: Be robust against missing connection object
Kim Alvefur <zash@zash.se>
parents: 2971
diff changeset
    30
	end
2969
557c976735e1 mod_http_logging: Factor out logging into a function for future reuse
Kim Alvefur <zash@zash.se>
parents: 2167
diff changeset
    31
	local req = string.format("%s %s HTTP/%s", request.method, request.path, request.httpversion);
557c976735e1 mod_http_logging: Factor out logging into a function for future reuse
Kim Alvefur <zash@zash.se>
parents: 2167
diff changeset
    32
	local date = os.date("%d/%m/%Y:%H:%M:%S %z");
2970
678be8ea4d38 mod_http_logging: Factor out body length calculation
Kim Alvefur <zash@zash.se>
parents: 2969
diff changeset
    33
	module:log("info", "%s - - [%s] \"%s\" %d %s", ip, date, req, response.status_code, len);
2969
557c976735e1 mod_http_logging: Factor out logging into a function for future reuse
Kim Alvefur <zash@zash.se>
parents: 2167
diff changeset
    34
end
557c976735e1 mod_http_logging: Factor out logging into a function for future reuse
Kim Alvefur <zash@zash.se>
parents: 2167
diff changeset
    35
1886
99863a6a7b8c mod_http_logging: Produce HTTP logs in the style of Apache
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    36
local send_response = server.send_response;
99863a6a7b8c mod_http_logging: Produce HTTP logs in the style of Apache
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    37
local function log_and_send_response(response, body)
99863a6a7b8c mod_http_logging: Produce HTTP logs in the style of Apache
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    38
	if not response.finished then
2969
557c976735e1 mod_http_logging: Factor out logging into a function for future reuse
Kim Alvefur <zash@zash.se>
parents: 2167
diff changeset
    39
		log_response(response, body);
1886
99863a6a7b8c mod_http_logging: Produce HTTP logs in the style of Apache
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    40
	end
2167
88fec2b2bd58 mod_http_logging: Fix endless loop on 0.9.x (Thanks Mint)
Kim Alvefur <zash@zash.se>
parents: 1887
diff changeset
    41
	return send_response(response, body);
1886
99863a6a7b8c mod_http_logging: Produce HTTP logs in the style of Apache
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    42
end
99863a6a7b8c mod_http_logging: Produce HTTP logs in the style of Apache
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    43
2973
8681729a47d5 mod_http_logging: Wrap API for sending data from file handles
Kim Alvefur <zash@zash.se>
parents: 2972
diff changeset
    44
local send_file = server.send_file;
8681729a47d5 mod_http_logging: Wrap API for sending data from file handles
Kim Alvefur <zash@zash.se>
parents: 2972
diff changeset
    45
local function log_and_send_file(response, f)
8681729a47d5 mod_http_logging: Wrap API for sending data from file handles
Kim Alvefur <zash@zash.se>
parents: 2972
diff changeset
    46
	if not response.finished then
8681729a47d5 mod_http_logging: Wrap API for sending data from file handles
Kim Alvefur <zash@zash.se>
parents: 2972
diff changeset
    47
		log_response(response);
8681729a47d5 mod_http_logging: Wrap API for sending data from file handles
Kim Alvefur <zash@zash.se>
parents: 2972
diff changeset
    48
	end
8681729a47d5 mod_http_logging: Wrap API for sending data from file handles
Kim Alvefur <zash@zash.se>
parents: 2972
diff changeset
    49
	return send_file(response, f);
8681729a47d5 mod_http_logging: Wrap API for sending data from file handles
Kim Alvefur <zash@zash.se>
parents: 2972
diff changeset
    50
end
8681729a47d5 mod_http_logging: Wrap API for sending data from file handles
Kim Alvefur <zash@zash.se>
parents: 2972
diff changeset
    51
1886
99863a6a7b8c mod_http_logging: Produce HTTP logs in the style of Apache
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    52
if module.wrap_object_event then
99863a6a7b8c mod_http_logging: Produce HTTP logs in the style of Apache
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    53
	-- Use object event wrapping, allows clean unloading of the module
99863a6a7b8c mod_http_logging: Produce HTTP logs in the style of Apache
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    54
	module:wrap_object_event(server._events, false, function (handlers, event_name, event_data)
99863a6a7b8c mod_http_logging: Produce HTTP logs in the style of Apache
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    55
		if event_data.response then
99863a6a7b8c mod_http_logging: Produce HTTP logs in the style of Apache
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    56
			event_data.response.send = log_and_send_response;
2973
8681729a47d5 mod_http_logging: Wrap API for sending data from file handles
Kim Alvefur <zash@zash.se>
parents: 2972
diff changeset
    57
			event_data.response.send_file = log_and_send_file;
1886
99863a6a7b8c mod_http_logging: Produce HTTP logs in the style of Apache
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    58
		end
99863a6a7b8c mod_http_logging: Produce HTTP logs in the style of Apache
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    59
		return handlers(event_name, event_data);
99863a6a7b8c mod_http_logging: Produce HTTP logs in the style of Apache
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    60
	end);
99863a6a7b8c mod_http_logging: Produce HTTP logs in the style of Apache
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    61
else
99863a6a7b8c mod_http_logging: Produce HTTP logs in the style of Apache
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    62
	-- Fall back to monkeypatching, unlikely to behave nicely in the
99863a6a7b8c mod_http_logging: Produce HTTP logs in the style of Apache
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    63
	-- presence of other modules also doing this
99863a6a7b8c mod_http_logging: Produce HTTP logs in the style of Apache
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    64
	server.send_response = log_and_send_response;
2973
8681729a47d5 mod_http_logging: Wrap API for sending data from file handles
Kim Alvefur <zash@zash.se>
parents: 2972
diff changeset
    65
	server.send_file = log_and_send_file;
1886
99863a6a7b8c mod_http_logging: Produce HTTP logs in the style of Apache
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    66
	function module.unload()
99863a6a7b8c mod_http_logging: Produce HTTP logs in the style of Apache
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    67
		server.send_response = send_response;
2973
8681729a47d5 mod_http_logging: Wrap API for sending data from file handles
Kim Alvefur <zash@zash.se>
parents: 2972
diff changeset
    68
		server.send_file = send_file;
1886
99863a6a7b8c mod_http_logging: Produce HTTP logs in the style of Apache
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    69
	end
99863a6a7b8c mod_http_logging: Produce HTTP logs in the style of Apache
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    70
end