使用 ip 命名的每个客户端的自动专用 access_log

jbr*_*ahy 0 http configuration web mod-perl apache-2.2

我们有一个内部应用程序,我想让 apache httpd 服务器基于每个客户端 ips 创建新的日志文件。在文档中,我看到您可以有多个日志。

http://httpd.apache.org/docs/2.2/logs.html

LogFormat "%h %l %u %t \"%r\" %>s %b" common
CustomLog logs/access_log common
CustomLog logs/referer_log "%{Referer}i -> %U"
CustomLog logs/agent_log "%{User-agent}i"
Run Code Online (Sandbox Code Playgroud)

但我真正想要的是这样的。

CustomLog logs/%h-access_log common
Run Code Online (Sandbox Code Playgroud)

其中 %h 被外推到 IP 地址,即 1.1.1.1-access_log

我想有一种 mod_perl 方法可以做到这一点,但只是想知道在我编写模块之前是否有人知道通过标准配置来做这样的事情的方法。

Pat*_*zek 5

使用 Apache 日志管道功能:日志可以发送到外部进程。该过程将有充分的自由度来根据需要过滤事物并根据需要创建文件。见http://httpd.apache.org/docs/2.2/logs.html#piped

您只需要编写解析日志输入的小脚本以提取 IP 地址并将该行转发到适当的文件。

否则,如果您对客户端数量进行排序,则可以预先定义所有需要的文件,然后使用条件日志记录,通过特定变量,在同一 URL 上查看此示例:

# Mark requests from the loop-back interface
SetEnvIf Remote_Addr "127\.0\.0\.1" dontlog
# Mark requests for the robots.txt file
SetEnvIf Request_URI "^/robots\.txt$" dontlog
# Log what remains
CustomLog logs/access_log common env=!dontlog 
Run Code Online (Sandbox Code Playgroud)

但即使有你的最新评论,我仍然认为后处理是一条更好的路线。天啊。

  • 不,该过程启动一次并连续获取 STDIN 上的数据。如网页中所写:“Apache 将在服务器启动时启动管道日志进程,如果在服务器运行时崩溃,则会重新启动它。(这最后一个特性就是我们可以将这种技术称为“可靠管道日志”的原因“.)” (2认同)