Per-user vhost logging

Posted on

Per-user vhost logging – Managing your servers can streamline the performance of your team by allowing them to complete complex tasks faster. Plus, it can enable them to detect problems early on before they get out of hand and compromise your business. As a result, the risk of experiencing operational setbacks is drastically lower.

But the only way to make the most of your server management is to perform it correctly. And to help you do so, this article will share nine tips on improving your server management and fix some problem about apache-2.2, logging, virtualhost, , .

I have a working per-user virtual host configuration with Apache, but I would like each user to have access to the logs for his virtual hosts. Obviously the ErrorLog and CustomLog directives don’t accept the wildcard syntax that VirtualDocumentRoot does, but is there a way to achieve logs in each user’s directory?

<VirtualHost *:80>
    ServerName *
    VirtualDocumentRoot /home/%2/projects/%1
    <Directory /home/*/projects/>
        Options FollowSymlinks Indexes
        IndexOptions FancyIndexing FoldersFirst
        AllowOverride All
        Order Allow,Deny
        Allow From All
        Satisfy Any

    Alias /favicon.ico /var/www/default/favicon.ico
    Alias /robots.txt /var/www/default/robots.txt

    LogLevel warn
    # ErrorLog /home/%2/logs/%1.error.log
    # CustomLog /home/%2/logs/%1.access.log combined

Resolution: Based on @cjc’s fine answer I realized I needed to do some scripting to solve this, so here’s what I came up with:


# Write whatever comes through stdin to the log directory in each user's home directory.

# The first field in the incoming log must be the vhost name
# (%V in the Apache LogFormat).
while read vhost fields; do
        # vhost names take the form $project.$user.$host.         
        project="${vhost%%.*}" # Strip off everything after the first dotted name.
        user="${vhost#*.}" # Strip off the first dotted name.
        user="${user%%.*}" # Strip off everything but the first (remaining) dotted name.
        printf -v cmd "mkdir -p '/home/%s/log' && printf '%%sn' '%s' >> '/home/%s/log/%s.log'" "$user" "$fields" "$user" "$project"
        sudo -u "$user" -- bash -c "$cmd"

Solution :

I don’t believe you can accomplish this within Apache itself, but you can have logs piped to a script that can split it in the way you’re trying to do:

Look at this part of the Apache documentation:

So you’ll have a line like:

CustomLog "|/usr/local/bin/" combined

where /usr/local/bin/ is, say, a Perl script that will append to the right per-user log.

Leave a Reply

Your email address will not be published.