6

I have two directories in /var/www (say, /var/www/app1 and /var/www/app2) whose error logs I want sent to different files. Both are under the same domain, so I think that I can't put them under different virtual hosts. So, for example, I would access them as:

http://localhost/app1

http://localhost/app2

I came across this page:

Generate access logs for different subdirectories in Apache

whose solution works perfectly for the access logs. However, the "env" argument doesn't seem to work with the ErrorLog directive.

Before this "discovery", I was working on this, which seems wrong:

<VirtualHost *:80>
  ServerAdmin ray@localhost

  DocumentRoot /var/www/app1

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

  ErrorLog ${APACHE_LOG_DIR}/app1/error.log

  LogLevel warn

  CustomLog ${APACHE_LOG_DIR}/app1/access.log combined
</VirtualHost>

I'm somewhat lost about what I should be doing. That is, if there is some way to get ErrorLog to work or if I should keep trying with configuring a virtual host for each directory. Any help would be appreciated! Thank you!

Community
  • 1
  • 1
Ray
  • 880
  • 1
  • 10
  • 18
  • I have the same question, I'm looking for solution and I think creating a virtualhost by each folder and proxying internally maybe it works, it's only a theory :D for example: http://PublicDomain.com/folder shows content of http://folder.localhost – ZiTAL Apr 30 '18 at 14:25
  • This is not OP's issue, but be aware - it can break when you have spaces in the path, if you do, you have to quote the path e.g. `/media/u/my super folder` => `"/media/u/my super folder"` – jave.web Aug 19 '22 at 11:35

3 Answers3

8

Why do you set Directory options for / in the VirtualHost context? Use <Directory /var/www/app1> instead of <Directory />

Due to the Apache ErrorLog directive docs its context is server config, virtual host - which means that it's only possible to define ErrorLog for the whole server or for a VirtalHost, not for a Directory. So if you want to send different logs to different files, try to use SetEnvIf to set an Env variable. Depeding on the directory where you are, it should be something like SetEnvIf Request_URI ^\/a1\/ a1 and SetEnvIf Request_URI ^\/a2\/ !a1. Then write logs depending on the a1 environment variable.

OskarD90
  • 613
  • 2
  • 8
  • 26
s.webbandit
  • 16,332
  • 16
  • 58
  • 82
  • Thanks for correcting my "Directory" mistake! As for the ErrorLog, I did find out how environments work for separating out the access log. But it doesn't seem to work for the error log. Is my understanding correct? (When I try, I get an error while Apache is parsing the configuration file.) I guess you are right -- the error log is for a whole server or virtual host. Based on the link that you sent, I suppose another option is to pipe each error log entry to a script... Thanks a lot for your help! – Ray May 07 '12 at 02:07
  • 1
    Yes, I've searched that too and seems like ErrorLog files can't be separated with SetEnvIf. You are welcome. – s.webbandit May 07 '12 at 12:21
3

Set custom ID for every Directory and you can separate logs by directories like this:

<Directory app1>
    SetEnv app1
</Directory>
<Directory app2>
    SetEnv app2
</Directory>
CustomLog ${APACHE_LOG_DIR}/site1.log combined env=app1
CustomLog ${APACHE_LOG_DIR}/site2.log combined env=app2
Feriman
  • 503
  • 8
  • 17
2

Finally I did it, first create internal subdomains per folder and with proxypass pass the subdomain content.

Enable apache mods:

a2enmod authz_core dir proxy proxy_http

/etc/hosts

127.0.0.1       localhost
127.0.0.1       a.localhost
127.0.0.1       b.localhost

/etc/apache2/sites-available/default.conf

<VirtualHost *:80>
        ServerName localhost
        ServerAdmin fake@mail.com
        DocumentRoot "/dev/null"

        ProxyPass /a http://a.localhost/
        ProxyPassReverse /a http://a.localhost/
        ProxyPass /b http://b.localhost/
        ProxyPassReverse /b http://b.localhost/

        LogLevel debug

        ErrorLog ${APACHE_LOG_DIR}/default-error.log
        CustomLog ${APACHE_LOG_DIR}/default-access.log combined

</VirtualHost>

/etc/apache2/sites-available/a.conf

<VirtualHost *:80>
        ServerName a.localhost
        ServerAdmin fake@mail.com
        DocumentRoot "/Publikoa/a"

        <Directory "/Publikoa/a">
                DirectoryIndex index.html
                Require all granted
        </Directory>

        LogLevel debug

        ErrorLog ${APACHE_LOG_DIR}/a-error.log
        CustomLog ${APACHE_LOG_DIR}/a-access.log combined

</VirtualHost>

/etc/apache2/sites-available/b.conf

<VirtualHost *:80>
        ServerName b.localhost
        ServerAdmin fake@mail.com
        DocumentRoot "/Publikoa/b"

        <Directory "Publikoa/b">
                DirectoryIndex index.html
                Require all granted
        </Directory>

        LogLevel debug

        ErrorLog ${APACHE_LOG_DIR}/b-error.log
        CustomLog ${APACHE_LOG_DIR}/b-access.log combined

</VirtualHost>

Enable sites:

a2ensite default a b

Restart apache:

/etc/init.d/apache2 restart
ZiTAL
  • 3,466
  • 8
  • 35
  • 50