apache的日志管理和配置。
LogFormat指令的语法
Description: Describes a format for use in a log file
Syntax: LogFormat format|nickname [nickname]
Default: LogFormat "%h %l %u %t \"%r\" %>s %b"
Context: server config, virtual host
Status: Base
Module: mod_log_config
CustomLog指令的语法
CustomLog Directive
Description: Sets filename and format of log file
Syntax: CustomLog file|pipe format|nickname [env=[!]environment-variable| expr=expression]
Context: server config, virtual host
Status: Base
Module: mod_log_config
所以先通过LogFormat定义一个format,然后在通过CustomLog指令来使用这个format配置。这里的文件是相对ServerRoot的,当然也可以写绝对路径。
例如:
LogFormat "%h %l %u %t \"%r\" %>s %b" myformat CustomLog logs/access_log myformat
也可以根据条件来决定要不要写入log, 如针对本地请求或某个特定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 myformat env=!dontlog
甚至还可以针对用户语音的不同而采用不同的日志文件。
SetEnvIf Accept-Language "en" english CustomLog logs/english_log common env=english CustomLog logs/non_english_log common env=!english
除此env=[!]以外还可以基于http响应在LogFormat中设置条件,过滤日志。
#响应码为400或501时,需要记录User-agent LogFormat "%400,501{User-agent}i" browserlog LogFormat "%!200,304,302{Referer}i" refererlog
如果不希望这个log长时间运行后变的很大很大,可以通过管道的方式来调用其他工具进行日志分割。管道符号| 。
CustomLog "|/usr/local/apache/bin/rotatelogs /var/log/access_log 86400" myformat
使用管道需要注意的是安全问题,因为这个程序会已httpd相同用户启动执行。
Security: If a program is used, then it will be run as the user who started httpd. This will be root if the server was started by root; be sure that the program is secure.
rotatelogs指令语法:
rotatelogs [ -l ] [ -L linkname ] [ -p program ] [ -f ] [ -t ] [ -v ] [ -e ] [ -c ] [ -n number-of-files ] logfile rotationtime|filesize(B|K|M|G) [ offset ]
还有一种就是备份重启的方法:
mv access_log access_log.old mv error_log error_log.old apachectl graceful sleep 600 gzip access_log.old error_log.old
如果单机多站点的情况下,正常都希望对每个虚拟机进行配置日志。只需要将日志命令放入VirtualHost中即可。
split-logfile 这个工具可以用来分隔多虚拟机日志。