目录

  • 错误日志【ErrorLog】
  • 错误日志级别【LogLevel】
  • 访问日志
  • LogFormat
  • LogFormat参数说明
  • CustomLog
  • TransferLog
  • 日志切割 rotatelogs.exe


错误日志【ErrorLog】

错误日志是由apache核心模块mod_core提供的,用来记录apache服务器产生的错误信息,比如:模块装载错误,CGI脚本错误等,通常这种日志默认是打开的,你不必专门去维护错误日志,因为这种日志一般很小。

ErrorLog
可以通过ErrorLog指令来指定错误日志的存放位置,其格式如下:

ErrorLog file-path|syslog[:facility]

当file-path不是以“/”开头时,指的是相对于ServerRoot目录(conf和logs所在目录)的文件名;如果是以"/"开头,指的是存放错误文件的绝对路径。

当file-path是以"|"开头时,表示错误日志需要通过管道先由一个程序来处理。

如果系统支持,你还可以用syslog替代文件名,采用系统日志机制来记录错误日志。

错误日志级别【LogLevel】

LogLevel
还可以用LogLevel指令来指定错误级别,其格式如下:

LogLevel level
Apache中提供了8种level,分别是:

emerg:紧急(系统无法使用)
alert:必须立即采取措施
crit:致命情况
error:错误情况
warn:警告情况
notice:一般重要情况
info:普通信息
debug:调试信息
默认是warn,这时debug、info级别的日志是不会记录在日志文件中的,如果是初期调试,可以设置为debug便于排错,线上环境还是用warn比较合理。

访问日志

访问日志是由apache的mod_log_config模块来实现的,该模块提供了三个指令:

  • TransferLog指令用来指定日志文件
  • LogFormat指令用来定义日志格式
  • CustomLog指令可以同时完成指定日志文件和定义日志格式

TransferLog和CustomLog指令在每个服务器上都可以被多次使用,以便将同一个请求记录到多个文件中。

LogFormat

其格式如下:

LogFormat format|nickname [nickname]

有两种形式:

1、带一个参数,供后面的TransferLog使用,如

LogFormat "%h %l %u %t \"%r\" %>s %b"
Transferlog logs/acccess_log

2、另一种是带两个参数,为日志格式起一个别名,供后面的CustomLog指令直接使用,如

LogFormat "%h %l %u %t \"%r\" %>s %b" common
CustomLog logs/acccess_log common

LogFormat参数说明

在apache的配置文件httpd.conf里一般都有类似于LogFormat “%h %l %u %t “%r” %>s %b “%{Referer}i” “%{User-Agent}i”” common 的日志记录格式设置,那么这种格式里的各个参数都代表什么意思呢,怎样设置才能完全掌握网站的访问情况呢?下面我就参数意思,简单说下。

  • %a 远端IP地址 【202.65.145.2】
  • %A 本机IP地址 【214.52.63.35】
  • %B 除HTTP头以外传送的字节数
  • %b 以CLF格式显示的除HTTP头以外传送的字节数,也就是当没有字节传送时显示’-'而不是0。【4096】
  • %{Foobar}C 在请求中传送给服务端的cookieFoobar的内容。
  • %D 服务器处理本请求所用时间,以微为单位。
  • %{FOOBAR}e 环境变量FOOBAR的值
  • %f 文件名 【GET /static/common/js/public.js?t=1635213923 HTTP/1.1】
  • %h 远端主机 【127.0.0.1】
  • %H 请求使用的协议 【HTTP/1.1】
  • %{Foobar}i 发送到服务器的请求头Foobar:的内容。【%{Referer}i %{User-Agent}i】
  • %l 远端登录名(由identd而来,如果支持的话),除非IdentityCheck设为"On",否则将得到一个"-"。
  • %m 请求的方法【POST / GET】
  • %{Foobar}n 来自另一个模块的注解Foobar的内容。
  • %{Foobar}o 应答头Foobar:的内容。
  • %p 服务器服务于该请求的标准端口。
  • %P 为本请求提供服务的子进程的PID。
  • %{format}P 服务于该请求的PID或TID(线程ID),format的取值范围为:pid和tid(2.0.46及以后版本)以及hextid(需要APR1.2.0及以上版本)
  • %q 查询字符串(若存在则由一个"?"引导,否则返回空串)
  • %r 请求的第一行
  • %s 状态。对于内部重定向的请求,这个状态指的是原始请求的状态,—%>s则指的是最后请求的状态。【200 | 500 | 404 | ……】
  • %t 时间,用普通日志时间格式(标准英语格式)
  • %{format}t 时间,用strftime(3)指定的格式表示的时间。(默认情况下按本地化格式) %{%-%m-%d %H:%M:%S}t 【2021-10-26 08:56:56】
  • %T 处理完请求所花时间,以秒为单位。
  • %u 远程用户名(根据验证信息而来;如果返回status(%s)为401,可能是假的)
  • %U 请求的URL路径,不包含查询字符串。
  • %v 对该请求提供服务的标准ServerName。
  • %V 根据UseCanonicalName指令设定的服务器名称。
  • %X 请求完成时的连接状态:X= 连接在应答完成前中断。
  • += 应答传送完后继续保持连接。
  • -= 应答传送完后关闭连接。(在1.3以后的版本中,这个指令是%c,但这样就和过去的SSL语法:%{var}c冲突了)
  • %I 接收的字节数,包括请求头的数据,并且不能为零。要使用这个指令你必须启用mod_logio模块。
  • %O 发送的字节数,包括请求头的数据,并且不能为零。要使用这个指令你必须启用mod_logio模块。

修饰符
可以紧跟在"%“后面加上一个逗号分隔的状态码列表来限制记录的条目。例如,”%400,501{User-agent}i" 只记录状态码400和501发生时的User-agent头内容;不满足条件时用"-“代替。状态码前还可以加上”!“前缀表示否 定,”%!200,304,302{Referer}i"记录所有不同于200,304,302的状态码发生时的Referer头内容。

"<“和”>"修饰符可以用来指定对于已被内部重定向的请求是选择原始的请求还是选择最终的请求。默认情况下,%s, %U, %T, %D, %r 使用原始请求,而所有其他格式串则选择最终请求。例如,%>s 可以用于记录请求的最终状态,而 %<u 则记录一个已经被内部重定向到非认证资源的请求的原始认证用户。

一些说明
出于安全考虑,从2.0.46版本开始,%r, %i, %o 中的特殊字符,除了双引号(")和反斜线()分别用 " 和 \ 进行转义、空白字符用C风格(\n, \t 等)进行转义以外,非打印字符和其它特殊字符使用 \xhh 格式进行转义(hh是该字符的16进制编码)。在2.0.46以前的版本中,这些内容会被完整的按原样记录。这种做法将导致客户端可以在日志中插入控制字 符,所以你在处理这些日志文件的时候要特别小心。

在2.0版本中(不同于1.3),%b 和 %B 格式字符串并不表示发送到客户端的字节数,而只是简单的表示HTTP应答字节数(在连接中断或使用SSL时与前者有所不同)。mod_logio提供的 %O 格式字符串将会记录发送的实际字节数。

示例
一些常见的格式串:

通用日志格式(CLF)
“%h %l %u %t “%r” %>s %b”

带虚拟主机的通用日志格式
“%v %h %l %u %t “%r” %>s %b”

NCSA扩展/组合日志格式
“%h %l %u %t “%r” %>s %b “%{Referer}i” “%{User-agent}i””

Referer日志格式
“%{Referer}i -> %U”

Agent(Browser)日志格式
“%{User-agent}i”

CustomLog

其格式如下:

CustomLog file|pipe format|nickname [env=[!]environment-variable]

第一部分是一个文件名,也可以是一个管道(类似ErrorLog),第二部分是日志格式,如果未指定则采用默认的日志格式,第三部分是记录日志的条件,比如

SetEnvIf Request_URI \.gif$ gif-image
CustomLog gif-requests.log common env=gif-image
CustomLog nongif-requests.log common env=!gif-image

如果请求的是一个gif文件,则记录到gif-requests.log文件中,否则记录到nongif-requests.log文件中

TransferLog

其格式如下:

TransferLog file|pipe

与CustomLog类似,可以指定文件也可以指定管道,不同的是不能指定日志格式,采用最近的LogFormat指令指定的日志格式,如果没有,则使用通用日志格式。

日志切割 rotatelogs.exe

apache内置的日志切割工具,可以按时间、日志大小切割

ErrorLog "|/path/to/bin/rotatelogs logs/errorlog.%Y-%m-%d-%H_%M_%S 20M +480"
CustomLog "|/path/to/bin/rotatelogs logs/accesslog.%Y-%m-%d-%H_%M_%S 20M +480" common

意义如下:

errorlog.%Y-%m-%d-%H_%M_%S为生成日志的格式,类似于这样:errorlog.2011-04-16-16_22_10 ,以年月日时分秒为单位的,其他支持的日志格式参数如下:

  • %A 星期名全称(本地的)
  • %a 3个字符的星期名(本地的)
  • %B 月份名的全称(本地的)
  • %b 3个字符的月份名(本地的)
  • %c日期和时间(本地的)
  • %d 2位数的一个月中的日期数
  • %H 2位数的小时数(24小时制)
  • %I 2位数的小时数(12小时制)
  • %j3位数的一年中的日期数
  • %M 2位数的分钟数
  • %m 2位数的月份数
  • %p am/pm 12小时制的上下午(本地的)
  • %S 2位数的秒数
  • %U 2位数的一年中的星期数(星期天为一周的第一天)
  • %W 2位数的一年中的星期数(星期一为一周的第一天)
  • %w1位数的星期几(星期天为一周的第一天)
  • %X 时间 (本地的)
  • %x 日期 (本地的)
  • %Y 4位数的年份

  • 20M 为日志的大小,即为日志达到多大后生成新的日志文件,支持的单位为K,M,G,本处为20M
  • +480 为时差,文件的时间为美国时间,中国的时差要比美国多8个小时也就是480分钟,所以要加上480分钟

还有其他的设置方法如下:

每天生成一个错误日志文件

ErrorLog "|/path/to/bin/rotatelogs.exe -l logs/error-%Y-%m-%d.log 86400"

其中86400为轮转的时间单位为秒

#示例
windows下vhost.conf中的一个站点配置

<VirtualHost *:80>
	DocumentRoot "G:\web\public_html\public"
	ServerName web.com
    ServerAlias 
	#LogFormat "%a {%Y%m%d %H%M%S}%t %s %b %U" common
	LogFormat "%{%Y%m%d %H%M%S}t %h %l %u  \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
	# 使用rotatelogs进行日志切割
	ErrorLog "|bin/rotatelogs.exe G:/web/logfiles/error_%Y%m%d%H%M%S.log 20 480"
    TransferLog "|bin/rotatelogs.exe G:/web/logfiles/access_%Y%m%d%H%M%S.log 20 480"
    #CustomLog "|bin/rotatelogs.exe G:/web/logfiles/ssl_request_%Y%m%d%H%M%S.log 20 480"   \
          "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
    CustomLog "|bin/rotatelogs.exe G:/web/logfiles/ssl_request_%Y%m%d%H%M%S.log 20 480"   \
         "[%{%Y-%m-%d %H:%M:%S}t] %s %a \"%r\" %{SSL_PROTOCOL}x %{SSL_CIPHER}x %b"
  <Directory "G:\web\public_html\public">
      Options FollowSymLinks ExecCGI
      AllowOverride All
      Order allow,deny
      Allow from all
      Require all granted
  </Directory>
</VirtualHost>