如何根据 mod_userdir 的用户拥有单独的 Apache2 日志文件?

Posted

技术标签:

【中文标题】如何根据 mod_userdir 的用户拥有单独的 Apache2 日志文件?【英文标题】:How to have separate Apache2 log files depending on the user of mod_userdir? 【发布时间】:2011-11-15 18:20:22 【问题描述】:

我在 Apache 2.2 上使用 mod_userdir 让多个用户访问 Web 服务器(用于他们的测试和其他内容)。

我想让我的用户访问 apache 日志(以便他们可以调试他们的脚本)但日志条目(ErrorLogCustomLogerror.log access.log)被组合在一起(无论“用户”目录是什么)。

有没有办法将日志分成多个文件(取决于用户)。

Apache 版本:2.2.16

/etc/apache2/sites-enabled/000-default”配置文件:

<VirtualHost *:80>
        ServerAdmin webmaster@localhost

        DocumentRoot /var/www
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
        <Directory /var/www/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride None
                Order allow,deny
                allow from all
        </Directory>

        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                AllowOverride None
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>

        ErrorLog $APACHE_LOG_DIR/error.log
        LogLevel warn
        CustomLog $APACHE_LOG_DIR/access.log combined

    Alias /doc/ "/usr/share/doc/"
    <Directory "/usr/share/doc/">
        Options Indexes MultiViews FollowSymLinks
        AllowOverride None
        Order deny,allow
        Deny from all
        Allow from 127.0.0.0/255.0.0.0 ::1/128
    </Directory>
</VirtualHost>

/etc/apache2/mods-enabled/userdir.conf”配置文件:

<IfModule mod_userdir.c>
        UserDir /home/*/public_html
        UserDir disabled root

        <Directory /home/*/public_html>
                AllowOverride FileInfo AuthConfig Limit Options
                Options MultiViews Indexes IncludesNoExec
                IndexOptions FoldersFirst FancyIndexing IgnoreCase
                php_admin_value open_basedir "..:/usr/share/php/"
        </Directory>

        ErrorLog /tmp/apache2-userdir-error.log

        LogLevel warn

        CustomLog /tmp/apache2-userdir-access.log
</IfModule>

【问题讨论】:

【参考方案1】:

嗯...我 99% 确定您可以在“SetEnvIf”上使用正则表达式捕获组来执行此操作...

我做了类似的事情——我使用以下方法将用户日志(全部)从网站日志中分离出来:

  SetEnvIf Request_URI "^/~.*$" useraccess=1

  CustomLog /var/www/logs/access.log combined env=!useraccess
  CustomLog /var/www/logs/user-access.log combined env=useraccess

你应该可以做到:

  SetEnvIf Request_URI "^/~([^/]+)/.*$" username=$1
  CustomLog /var/www/logs/$username.log combined

【讨论】:

我在SetEnvIfCustomLog 的实现中遗漏了一些东西...我的具体问题在这里:***.com/q/16154718/32836 并希望您的洞察力... 我正在获取名为“access_$username.log”的日志文件。它没有扩展变量。有什么想法吗? 我也无法让变量展开。我尝试了一堆 $、%e、引号和不带引号的组合。我在这里发现link 添加冒号可以消除警告,但它仍然没有扩展。【参考方案2】:

根据Apache CustomLog Directive manual (mod_log_config module),可以指定一个程序而不是一个文件,这个程序会将日志接收到它的STDIN。

然后可以轻松地解析该日志消息以检查消息来自哪个路径(因此是哪个用户)并将其写入特定文件(例如以用户名命名)。

【讨论】:

以上是关于如何根据 mod_userdir 的用户拥有单独的 Apache2 日志文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 laravel 中建立用户与用户的关系? [关闭]

MIDI 文件的结构是啥?

Case: 一个read-only 角色对某个schema下的新建的表,无需单独授权,直接拥有只读权

项目中同时拥有 GMS 和 HMS

9.5 授权系统

统一认证系统