1
0
mirror of https://github.com/apache/httpd.git synced 2025-08-08 15:02:10 +03:00

Adding a simple logging hook for mod_lua, which allows users to create their own logs or bypass the generic logging on a per-request basis.

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1519277 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Daniel Gruno
2013-09-01 15:10:32 +00:00
parent 659017cc53
commit 1ad63fbb73
2 changed files with 75 additions and 2 deletions

View File

@@ -269,9 +269,10 @@ performing access control, or setting mime types:</p>
</tr> </tr>
<tr> <tr>
<td>Logging</td> <td>Logging</td>
<td>(none)</td> <td><directive module="mod_lua">LuaHookLog</directive></td>
<td>Once a request has been handled, it enters several logging phases, <td>Once a request has been handled, it enters several logging phases,
which logs the request in either the error or access log</td> which logs the request in either the error or access log. Mod_lua
is able to hook into the start of this and control logging output.</td>
</tr> </tr>
</table> </table>
@@ -1453,6 +1454,55 @@ processing</description>
</usage> </usage>
</directivesynopsis> </directivesynopsis>
<directivesynopsis>
<name>LuaHookLog</name>
<description>Provide a hook for the access log phase of a request
processing</description>
<syntax>LuaHookLog /path/to/lua/script.lua log_function_name</syntax>
<contextlist><context>server config</context><context>virtual host</context>
<context>directory</context><context>.htaccess</context>
</contextlist>
<override>All</override>
<usage>
<p>
This simple logging hook allows you to run a function when httpd enters the
logging phase of a request. With it, you can append data to your own logs,
manipulate data before the regular log is written, or prevent a log entry
from being created. To prevent the usual logging from happening, simply return
<code>apache2.DONE</code> in your logging handler, otherwise return
<code>apache2.OK</code> to tell httpd to log as normal.
</p>
<p>Example:</p>
<highlight language="config">
LuaHookLog /path/to/script.lua logger
</highlight>
<highlight language="lua">
-- /path/to/script.lua --
function logger(r)
-- flip a coin:
-- If 1, then we write to our own Lua log and tell httpd not to log
-- in the main log.
-- If 2, then we just sanitize the output a bit and tell httpd to
-- log the sanitized bits.
if math.random(1,2) == 1 then
-- Log stuff ourselves and don't log in the regular log
local f = io.open("/foo/secret.log", "a")
if f then
f:write("Something secret happened at " .. r.uri .. "\n")
f:close()
end
return apache2.DONE -- Tell httpd not to use the regular logging functions
else
r.uri = r.uri:gsub("somesecretstuff", "") -- sanitize the URI
return apache2.OK -- tell httpd to log it.
end
end
</highlight>
</usage>
</directivesynopsis>
<directivesynopsis> <directivesynopsis>
<name>LuaHookMapToStorage</name> <name>LuaHookMapToStorage</name>
<description>Provide a hook for the map_to_storage phase of request processing</description> <description>Provide a hook for the map_to_storage phase of request processing</description>

View File

@@ -1155,6 +1155,11 @@ static void lua_insert_filter_harness(request_rec *r)
/* ap_log_rerror(APLOG_MARK, APLOG_WARNING, 0, r, "LuaHookInsertFilter not yet implemented"); */ /* ap_log_rerror(APLOG_MARK, APLOG_WARNING, 0, r, "LuaHookInsertFilter not yet implemented"); */
} }
static int lua_log_transaction_harness(request_rec *r)
{
return lua_request_rec_hook_harness(r, "log_transaction", APR_HOOK_FIRST);
}
static int lua_quick_harness(request_rec *r, int lookup) static int lua_quick_harness(request_rec *r, int lookup)
{ {
if (lookup) { if (lookup) {
@@ -1219,6 +1224,15 @@ static const char *register_map_to_storage_hook(cmd_parms *cmd, void *_cfg,
return register_named_file_function_hook("map_to_storage", cmd, _cfg, return register_named_file_function_hook("map_to_storage", cmd, _cfg,
file, function, APR_HOOK_MIDDLE); file, function, APR_HOOK_MIDDLE);
} }
static const char *register_log_transaction_hook(cmd_parms *cmd, void *_cfg,
const char *file,
const char *function)
{
return register_named_file_function_hook("log_transaction", cmd, _cfg,
file, function, APR_HOOK_FIRST);
}
static const char *register_map_to_storage_block(cmd_parms *cmd, void *_cfg, static const char *register_map_to_storage_block(cmd_parms *cmd, void *_cfg,
const char *line) const char *line)
{ {
@@ -1226,6 +1240,7 @@ static const char *register_map_to_storage_block(cmd_parms *cmd, void *_cfg,
line); line);
} }
static const char *register_check_user_id_hook(cmd_parms *cmd, void *_cfg, static const char *register_check_user_id_hook(cmd_parms *cmd, void *_cfg,
const char *file, const char *file,
const char *function, const char *function,
@@ -1783,6 +1798,10 @@ command_rec lua_commands[] = {
AP_INIT_TAKE2("LuaHookInsertFilter", register_insert_filter_hook, NULL, AP_INIT_TAKE2("LuaHookInsertFilter", register_insert_filter_hook, NULL,
OR_ALL, OR_ALL,
"Provide a hook for the insert_filter phase of request processing"), "Provide a hook for the insert_filter phase of request processing"),
AP_INIT_TAKE2("LuaHookLog", register_log_transaction_hook, NULL,
OR_ALL,
"Provide a hook for the logging phase of request processing"),
AP_INIT_TAKE123("LuaScope", register_lua_scope, NULL, OR_ALL, AP_INIT_TAKE123("LuaScope", register_lua_scope, NULL, OR_ALL,
"One of once, request, conn, server -- default is once"), "One of once, request, conn, server -- default is once"),
@@ -1983,6 +2002,10 @@ static void lua_register_hooks(apr_pool_t *p)
/* ivm mutex */ /* ivm mutex */
apr_thread_mutex_create(&lua_ivm_mutex, APR_THREAD_MUTEX_DEFAULT, p); apr_thread_mutex_create(&lua_ivm_mutex, APR_THREAD_MUTEX_DEFAULT, p);
/* Logging catcher */
ap_hook_log_transaction(lua_log_transaction_harness,NULL,NULL,
APR_HOOK_FIRST);
} }
AP_DECLARE_MODULE(lua) = { AP_DECLARE_MODULE(lua) = {