![自动为每个使用 ip 命名的客户端创建专用的 access_log](https://linux22.com/image/700448/%E8%87%AA%E5%8A%A8%E4%B8%BA%E6%AF%8F%E4%B8%AA%E4%BD%BF%E7%94%A8%20ip%20%E5%91%BD%E5%90%8D%E7%9A%84%E5%AE%A2%E6%88%B7%E7%AB%AF%E5%88%9B%E5%BB%BA%E4%B8%93%E7%94%A8%E7%9A%84%20access_log.png)
我们有一个内部应用程序,我想让 apache httpd 服务器根据每个客户端 ip 创建新的日志文件。在文档中我看到您可以有多个日志。
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"
但我真正想要的是这样的。
CustomLog logs/%h-access_log common
其中 %h 被推断为 ip 地址,即 1.1.1.1-access_log
我想象有一种 mod_perl 方法可以做到这一点,但我只是想知道在我编写模块之前是否有人知道通过标准配置来做这样的事情的方法。
答案1
使用 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
但即使有您的最新评论,我仍然认为后处理是更好的方法。YMMV。