Configuring Comprehensive Apache Logging

Configuring Comprehensive Apache Logging

Apache's flexible logging system allows detailed customization for security monitoring:

# /etc/apache2/sites-available/secure-logging.conf
<VirtualHost *:443>
    ServerName example.com
    
    # Custom log format for security analysis
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %D %{SSL_PROTOCOL}x %{SSL_CIPHER}x" security_combined
    
    # Detailed log format with additional security fields
    LogFormat "%{%Y-%m-%d %H:%M:%S}t.%{msec_frac}t %{remote}p %h %{SSL_CLIENT_S_DN}x %u \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %D %I %O %{UNIQUE_ID}e" detailed_security
    
    # Access logs with rotation
    CustomLog "|/usr/bin/rotatelogs -l /var/log/apache2/access.%Y%m%d.log 86400" security_combined
    CustomLog "|/usr/bin/rotatelogs -l /var/log/apache2/detailed.%Y%m%d.log 86400" detailed_security
    
    # Error log with increased verbosity for security events
    ErrorLog "|/usr/bin/rotatelogs -l /var/log/apache2/error.%Y%m%d.log 86400"
    LogLevel warn security:debug ssl:info
    
    # Forensic logging for detailed request analysis
    <IfModule mod_log_forensic.c>
        ForensicLog "|/usr/bin/rotatelogs -l /var/log/apache2/forensic.%Y%m%d.log 86400"
    </IfModule>
    
    # ModSecurity audit logging
    <IfModule mod_security2.c>
        SecAuditEngine RelevantOnly
        SecAuditLogRelevantStatus "^(?:5|4(?!04))"
        SecAuditLogType Serial
        SecAuditLog /var/log/apache2/modsec_audit.log
        SecAuditLogFormat JSON
    </IfModule>
    
    # Environment variables for enhanced logging
    SetEnvIf Request_URI "\.jpg$|\.jpeg$|\.gif$|\.png$|\.ico$|\.css$|\.js$" dontlog
    SetEnvIf Request_URI "^/health-check$" dontlog
    SetEnvIf Remote_Addr "^192\.168\." internal
    
    # Conditional logging
    CustomLog "|/usr/bin/rotatelogs -l /var/log/apache2/external.%Y%m%d.log 86400" security_combined env=!internal
    CustomLog "|/usr/bin/rotatelogs -l /var/log/apache2/internal.%Y%m%d.log 86400" security_combined env=internal
</VirtualHost>

# Global logging configuration
<IfModule mod_logio.c>
    LogIOTrackTTFB On
</IfModule>

# Log SSL/TLS handshake failures
SSLStaplingErrorCacheTimeout 600
LogLevel ssl:warn

Enable required modules:

sudo a2enmod log_forensic logio unique_id
sudo systemctl restart apache2