ApacheæœåŠ¡å™¨Access_log日志指令详解
访问日志ä¸ä¼šè®°å½•æœåŠ¡å™¨æ‰€å¤„ç†çš„所有请求,其文件åå’Œä½ç½®å–决于CustomLog指令,LogFormat指令å¯ä»¥ç®€åŒ–日志的内容。
如何é…ç½®æœåŠ¡å™¨çš„访问日志?
é€šç”¨æ—¥å¿—æ ¼å¼(Common Log Format)组åˆæ—¥å¿—æ ¼å¼(Combined Log Format)多文件访问日志(æ¡ä»¶æ—¥å¿—æ¤å¤„ä¸ä½œä»‹ç»ï¼‰
Common Log Format:
LogFormat "%h %l %u %t "%r" %>s %b" common
CustomLog logs/access_log common
它定义了一ç§ç‰¹å®šçš„è®°å½•æ ¼å¼å—符串,并给它起了个别åå« common,其ä¸çš„"%"指示æœåŠ¡å™¨ç”¨æŸç§ä¿¡æ¯æ›¿æ¢ï¼Œå…¶ä»–å—符则ä¸ä½œæ›¿æ¢ã€‚引å·(")å¿…é¡»åŠ åæ–œæ 转义,以é¿å…被解释为å—符串的结æŸã€‚æ ¼å¼å—符串还å¯ä»¥åŒ…å«ç‰¹æ®Šçš„控制符,如æ¢è¡Œç¬¦"n" ã€åˆ¶è¡¨ç¬¦"t"。
CustomLog
指令建立一个使用指定别å的新日志文件,除éžå…¶æ–‡ä»¶å是以斜æ 开头的ç»å¯¹è·¯å¾„,å¦åˆ™å…¶è·¯å¾„就是相对于ServerRoot的相对路径。
上述é…置是一ç§è¢«ç§°ä¸ºé€šç”¨æ—¥å¿—æ ¼å¼(CLF)çš„è®°å½•æ ¼å¼ï¼Œå®ƒè¢«è®¸å¤šä¸åŒçš„WebæœåŠ¡å™¨æ‰€é‡‡ç”¨ï¼Œå¹¶è¢«è®¸å¤šæ—¥å¿—分æžç¨‹åºæ‰€è¯†åˆ«ï¼Œå®ƒäº§ç”Ÿçš„记录形如:
127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET /apache_pb.gif HTTP/1.0" 200 2326
一ã€Apache访问日志信æ¯
当æµè§ˆå™¨è¯·æ±‚æœåŠ¡å™¨æ—¶ï¼Œå¦‚果在æœåŠ¡å™¨ä¸Šè®¾ç½®äº†è®¿é—®æ—¥å¿—,就会记录下用户的访问记录。
127.0.0.1(%h)
这是å‘é€è¯·æ±‚到æœåŠ¡å™¨çš„客户的IP地å€ï¼Œå³è¿œç¨‹ä¸»æœºçš„地å€ï¼Œå³å®ƒè¡¨æ˜Žè®¿é—®ç½‘站的究竟是è°ã€‚(å¯ä»¥è¦æ±‚apache查出所有的主机åå—,并在日志文件ä¸ç”¨ä¸»æœºåå—æ¥æ›¿ä»£ï¼©ï¼°åœ°å€ï¼Œä½†è¿™ç§åšæ³•ä¼šæžå¤§çš„å½±å“æœåŠ¡å™¨è®°å½•æ—¥å¿—的速度,从而é™ä½Žæ•´ä¸ªç½‘站的效率,ä¸å€¼å¾—推è)。
然而,如果确实有必è¦è®©apache找出远程主机的åå—,å¯ä»¥ä½¿ç”¨æŒ‡ä»¤ï¼šHostNameLookups on,如果HostNameLookups设置æˆdouble而ä¸æ˜¯on,日志记录程åºå°†å¯¹å®ƒæ‰¾åˆ°çš„主机åå—进行åå‘查找,验è¯è¯¥ä¸»æœºåå—确实指å‘了原æ¥å‡ºçŽ°çš„IP地å€ã€‚如果HostnameLookups设为On,则æœåŠ¡å™¨ä¼šå°è¯•è§£æžè¿™ä¸ªIP地å€çš„主机å并替æ¢æ¤å¤„çš„IP地å€ï¼Œä½†å¹¶ä¸æŽ¨èè¿™æ ·åšï¼Œå› 为它会显著拖慢æœåŠ¡å™¨ï¼Œæœ€å¥½æ˜¯ç”¨ä¸€ä¸ªæ—¥å¿—åŽç»å¤„ç†å™¨æ¥åˆ¤æ–主机å,比如logresolve。如果客户和æœåŠ¡å™¨ä¹‹é—´å˜åœ¨ä»£ç†ï¼Œé‚£ä¹ˆè®°å½•ä¸çš„这个IP地å€å°±æ˜¯é‚£ä¸ªä»£ç†çš„IP地å€ï¼Œè€Œä¸æ˜¯å®¢æˆ·æœºçš„真实IP地å€ã€‚
-(%l)
日记记录的第二项是空白,用一个“-”å ä½ç¬¦æ›¿ä»£ã€‚实际上ç»å¤§å¤šæ•°æ—¶å€™è¿™ä¸€é¡¹éƒ½æ˜¯å¦‚æ¤ã€‚这是由客户端identd进程判æ–çš„RFC1413身份(identity),输出ä¸çš„符å·"-"表示æ¤å¤„çš„ä¿¡æ¯æ— 效。除éžåœ¨ä¸¥æ ¼æŽ§åˆ¶çš„内部网络ä¸ï¼Œæ¤ä¿¡æ¯é€šå¸¸å¾ˆä¸å¯é ,ä¸åº”该被使用。åªæœ‰åœ¨å°†IdentityCheck指令设为On时,Apacheæ‰ä¼šè¯•å›¾å¾—到这项信æ¯ã€‚
frank(%u)
日记记录的第三项是frank。这个ä½ç½®ç”¨äºŽè®°å½•æµè§ˆè€…进行身份验è¯æ—¶æ供的åå—。当然,如果网站的æŸäº›å†…容è¦æ±‚用户进行身份验è¯ï¼Œé‚£ä¹ˆè¿™é¡¹ä¿¡æ¯å®¤ä¸ä¼šç©ºç™½çš„。但是,对于大多数网站æ¥è¯´ï¼Œæ—¥å¿—文件的大多数记录ä¸è¿™ä¸€é¡¹ä»æ—§æ˜¯ç©ºç™½çš„。这是HTTP认è¯ç³»ç»Ÿå¾—åˆ°çš„è®¿é—®è¯¥ç½‘é¡µçš„å®¢æˆ·æ ‡è¯†(userid),环境å˜é‡REMOTE_USER会被设为该值并æ供给CGI脚本。如果状æ€ç 是401,表示客户未通过认è¯ï¼Œåˆ™æ¤å€¼æ²¡æœ‰æ„义。如果网页没有设置密ç ä¿æŠ¤ï¼Œåˆ™æ¤é¡¹å°†æ˜¯"-"。
[10/Oct/2000:13:55:36 -0700](%t)
日志记录的第四项是请求的时间。这是æœåŠ¡å™¨å®Œæˆè¯·æ±‚处ç†æ—¶çš„æ—¶é—´ï¼Œå…¶æ ¼å¼æ˜¯ï¼š
[日/月/年:时:分:秒 时区]
æ—¥= 2æ•°å—
月= 3å—æ¯
å¹´= 4æ•°å—
æ—¶= 2æ•°å—
分= 2æ•°å—
秒= 2æ•°å—
时区= (+|-)4æ•°å—
å¯ä»¥åœ¨æ ¼å¼å—符串ä¸ä½¿ç”¨%{format}tæ¥æ”¹å˜æ—¶é—´çš„输出形å¼ï¼Œå…¶ä¸çš„format与Cæ ‡å‡†åº“ä¸çš„strftime()用法相åŒã€‚
"GET /apache_pb.gif HTTP/1.0"("%r")
日志记录的第五项信æ¯æˆ–许是整个日志记录ä¸æœ€æœ‰ç”¨çš„ä¿¡æ¯ï¼Œå®ƒå‘Šè¯‰æˆ‘们æœåŠ¡å™¨å—åˆ°çš„æ˜¯ä¸€ä¸ªä»€ä¹ˆæ ·çš„è¯·æ±‚ã€‚è¯¥é¡¹ä¿¡æ¯çš„å…¸åž‹æ ¼å¼æ˜¯“METHOD RESOURCE PROTOCOL”峓方法 èµ„æº åè®®”(通常进行日志监控的时候,主è¦ä¹Ÿæ˜¯çœ‹è¿™é¡¹å†…容)。引å·ä¸æ˜¯å®¢æˆ·ç«¯å‘出的包å«è®¸å¤šæœ‰ç”¨ä¿¡æ¯çš„请求行。å¯ä»¥çœ‹å‡ºï¼Œè¯¥å®¢æˆ·çš„动作是GET,请求的资æºæ˜¯/apache_pb.gif,使用的å议是HTTP/1.0。å¦å¤–,还å¯ä»¥è®°å½•å…¶ä»–ä¿¡æ¯ï¼Œå¦‚ï¼šæ ¼å¼å—符串"%m %U %q %H"会记录动作(方法)ã€è·¯å¾„ã€æŸ¥è¯¢å—符串ã€å议,其输出和"%r"ä¸€æ ·ã€‚
200(%>s)
日志记录的第å…项信æ¯æ˜¯çŠ¶æ€ä»£ç 。这是æœåŠ¡å™¨è¿”回给客户端的状æ€ç 。这个信æ¯éžå¸¸æœ‰ä»·å€¼ï¼Œå› 为它指示了请求的结果,或者是被æˆåŠŸå“应了(以2开头),或者被é‡å®šå‘了(以3开头),或者出错了(以4开头),或者产生了æœåŠ¡å™¨ç«¯é”™è¯¯(以5开头)。完整的状æ€ç 列表å‚è§HTTP规范(RFC2616第10ç« )。
2326(%b)
日志记录的第七项表示å‘é€å®¢æˆ·ç«¯çš„总å—èŠ‚æ•°ã€‚å®ƒå‘Šè¯‰æˆ‘ä»¬ä¼ è¾“æ˜¯å¦è¢«æ‰“æ–(å³è¯¥æ•°å€¼æ˜¯å¦å’Œæ–‡ä»¶çš„大å°ç›¸åŒï¼‰ã€‚这项是返回给客户端的ä¸åŒ…括å“应头的å—节数。如果没有信æ¯è¿”回,则æ¤é¡¹åº”该是"-",如果希望记录为"0"çš„å½¢å¼ï¼Œå°±åº”该用%B。
Combined Log Format:
LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-agent}i"" combined
CustomLog log/access_log combined
è¿™ç§æ ¼å¼ä¸Žé€šç”¨æ—¥å¿—æ ¼å¼ç±»ä¼¼ï¼Œä½†æ˜¯å¤šäº†ä¸¤ä¸ª %{header}i 项,其ä¸çš„headerå¯ä»¥æ˜¯ä»»ä½•è¯·æ±‚头。这ç§æ ¼å¼çš„记录形如:
127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET /apache_pb.gif HTTP/1.0" 200 2326 "http://www.example.com/start.html" "Mozilla/4.08 [en] (Win98; I ;Nav)"
å…¶ä¸ï¼Œå¤šå‡ºæ¥çš„项是:
"http://www.example.com/start.html" ("%{Referer}i")
"Referer"请求头。æ¤é¡¹æŒ‡æ˜Žäº†è¯¥è¯·æ±‚是被从哪个网页æ交过æ¥çš„,这个网页应该包å«æœ‰/apache_pb.gif或者其连接。
"Mozilla/4.08 [en] (Win98; I ;Nav)" ("%{User-agent}i")
"User-Agent"请求头。æ¤é¡¹æ˜¯å®¢æˆ·ç«¯æ供的æµè§ˆå™¨è¯†åˆ«ä¿¡æ¯ã€‚
多文件访问日志
å¯ä»¥ç®€å•åœ°åœ¨é…置文件ä¸ç”¨å¤šä¸ªCustomLog指令æ¥å»ºç«‹å¤šæ–‡ä»¶è®¿é—®æ—¥å¿—。如下例,既记录基本的CLFä¿¡æ¯ï¼Œåˆè®°å½•æ交网页和æµè§ˆå™¨çš„ä¿¡æ¯ï¼Œæœ€åŽä¸¤è¡ŒCustomLog示范了如何模拟ReferLogå’ŒAgentLog指令的效果。
LogFormat "%h %l %u %t "%r" %>s %b" common
CustomLog logs/access_log common
CustomLog logs/referer_log "%{Referer}i -> %U"
CustomLog logs/agent_log "%{User-agent}i"
æ¤ä¾‹ä¹Ÿè¯´æ˜Žäº†ï¼Œè®°å½•æ ¼å¼å¯ä»¥ç›´æŽ¥ç”±CustomLog指定,而并ä¸ä¸€å®šè¦ç”¨LogFormat起一个别å(相当于上é¢ç¬¬ä¸€äºŒè¡Œç»„åˆï¼Œå³ï¼šCustomLog logs/access_log "%h %l %u %t "%r" %>s %b")。
这里需è¦æ到的是 关于多个虚拟机之间的日记记录管ç†ï¼š
如果æœåŠ¡å™¨é…æœ‰è‹¥å¹²è™šæ‹Ÿä¸»æœºï¼Œé‚£ä¹ˆè¿˜æœ‰å‡ ä¸ªæŽ§åˆ¶æ—¥å¿—æ–‡ä»¶çš„åŠŸèƒ½ã€‚é¦–å…ˆï¼Œå¯ä»¥æŠŠæ—¥å¿—指令放在<VirtualHost>段之外,让它们与主æœåŠ¡å™¨ä½¿ç”¨åŒä¸€ä¸ªè®¿é—®æ—¥å¿—和错误日志æ¥è®°å½•æ‰€æœ‰çš„è¯·æ±‚å’Œé”™è¯¯ï¼Œä½†æ˜¯è¿™æ ·å°±ä¸èƒ½æ–¹ä¾¿çš„获得æ¯ä¸ªè™šæ‹Ÿä¸»æœºçš„ä¿¡æ¯äº†ã€‚
如果把CustomLog或ErrorLog指令放在<VirtualHost>段内,所有对这个虚拟主机的请求和错误信æ¯ä¼šè¢«è®°å½•åœ¨å…¶ç§æœ‰çš„日志文件ä¸ï¼Œé‚£äº›æ²¡æœ‰åœ¨<VirtualHost>段内使用日志指令的虚拟主机将ä»ç„¶å’Œä¸»æœåŠ¡å™¨ä½¿ç”¨åŒä¸€ä¸ªæ—¥å¿—。这ç§æ–¹æ³•å¯¹è™šæ‹Ÿä¸»æœºè¾ƒå°‘çš„æœåŠ¡å™¨å¾ˆæœ‰ç”¨ï¼Œä½†è™šæ‹Ÿä¸»æœºéžå¸¸å¤šæ—¶ï¼Œå°±ä¼šå¸¦æ¥ç®¡ç†ä¸Šçš„困难,还ç»å¸¸ä¼šäº§ç”Ÿæ–‡ä»¶æ述符çŸç¼ºçš„问题。
对于访问日志,有一个很好的折衷方案,在åŒä¸€ä¸ªè®¿é—®æ—¥å¿—文件ä¸è®°å½•å¯¹æ‰€æœ‰ä¸»æœºçš„访问,而æ¯æ¡è®°å½•éƒ½æ³¨æ˜Žè™šæ‹Ÿä¸»æœºçš„ä¿¡æ¯ï¼Œæ—¥åŽå†æŠŠè®°å½•æ‹†å¼€å˜å…¥ä¸åŒçš„文件。例如:
LogFormat "%v %l %u %t "%r" %>s %b" comonvhost
CustomLog logs/access_log comonvhost
%v用æ¥é™„åŠ è™šæ‹Ÿä¸»æœºçš„ä¿¡æ¯ã€‚
有个split-logfile程åºå¯ä»¥æ ¹æ®ä¸åŒçš„虚拟主机信æ¯å¯¹æ—¥å¿—进行拆分,并将结果å˜å…¥ä¸åŒçš„文件。
二ã€Apache访问日志é…ç½®
在apacheçš„é…置文件httpd.confä¸ï¼Œæœ‰ä¸€è¡Œæ˜¯è¿™ä¹ˆé…置的:
指定了日志的目录路径./logs/ï¼ŒæŒ‡å®šäº†æ—¥å¿—çš„æ ¼å¼ï¼Œé»˜è®¤common。
commonæ ¼å¼æ˜¯é€šè¿‡ï¼šLogFormat "%h %l %u %t \"%r\" %>s %b" common定义的。
åŒå¼•å·é‡Œé¢çš„æ ¼å¼å—符串代表特定的信æ¯ã€‚
apacheæ ¼å¼å—符串åŠå…¶å«ä¹‰ï¼š
%a 远端IP地å€
%A 本机IP地å€
%B 除HTTPå¤´ä»¥å¤–ä¼ é€çš„å—节数
%b 以CLFæ ¼å¼æ˜¾ç¤ºçš„除HTTPå¤´ä»¥å¤–ä¼ é€çš„å—节数,也就是当没有å—èŠ‚ä¼ é€æ—¶æ˜¾ç¤º'-'而ä¸æ˜¯0。
%{Foobar}C 在请求ä¸ä¼ é€ç»™æœåŠ¡ç«¯çš„cookieFoobar的内容。
%D æœåŠ¡å™¨å¤„ç†æœ¬è¯·æ±‚所用时间,以微为å•ä½ã€‚
%{FOOBAR}e 环境å˜é‡FOOBAR的值
%f 文件å
%h 远端主机
%H 请求使用的åè®®
%{Foobar}i å‘é€åˆ°æœåŠ¡å™¨çš„请求头Foobar:的内容。
%l 远端登录å(ç”±identd而æ¥ï¼Œå¦‚果支æŒçš„è¯),除éžIdentityCheck设为"On",å¦åˆ™å°†å¾—到一个"-"。
%m 请求的方法
%{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则指的是最åŽè¯·æ±‚的状æ€ã€‚
%t æ—¶é—´ï¼Œç”¨æ™®é€šæ—¥å¿—æ—¶é—´æ ¼å¼(æ ‡å‡†è‹±è¯æ ¼å¼)
%{format}t 时间,用strftime(3)æŒ‡å®šçš„æ ¼å¼è¡¨ç¤ºçš„时间。(é»˜è®¤æƒ…å†µä¸‹æŒ‰æœ¬åœ°åŒ–æ ¼å¼)
%T 处ç†å®Œè¯·æ±‚所花时间,以秒为å•ä½ã€‚
%u 远程用户å(æ ¹æ®éªŒè¯ä¿¡æ¯è€Œæ¥ï¼›å¦‚果返回status(%s)为401,å¯èƒ½æ˜¯å‡çš„)
%U 请求的URL路径,ä¸åŒ…å«æŸ¥è¯¢å—符串。
%v 对该请求æä¾›æœåŠ¡çš„æ ‡å‡†ServerName。
%V æ ¹æ®UseCanonicalName指令设定的æœåŠ¡å™¨å称。
ã€è¡¥å……】"<"å’Œ">"修饰符å¯ä»¥ç”¨æ¥æŒ‡å®šå¯¹äºŽå·²è¢«å†…部é‡å®šå‘的请求是选择原始的请求还是选择最终的请求。默认情况下,%s, %U, %T, %D, %r ä½¿ç”¨åŽŸå§‹è¯·æ±‚ï¼Œè€Œæ‰€æœ‰å…¶ä»–æ ¼å¼ä¸²åˆ™é€‰æ‹©æœ€ç»ˆè¯·æ±‚。例如,%>så¯ä»¥ç”¨äºŽè®°å½•è¯·æ±‚的最终状æ€ï¼Œè€Œ %<u 则记录一个已ç»è¢«å†…部é‡å®šå‘到éžè®¤è¯èµ„æºçš„请求的原始认è¯ç”¨æˆ·ã€‚
如果在“%”å’Œå˜é‡ä¹‹é—´æ”¾å…¥äº†ä¸€ä¸ªæˆ–者多个HTTP状æ€ä»£ç ,则åªæœ‰å½“请求返回的状æ€ä»£ç 属于指定的状æ€ä»£ç 之一时,å˜é‡æ‰€ä»£è¡¨çš„内容æ‰ä¼šè¢«è®°å½•ã€‚
例如,如果è¦è®°å½•çš„æ˜¯ç½‘ç«™çš„æ‰€æœ‰æ— æ•ˆé“¾æŽ¥ï¼Œå¯ä»¥ä½¿ç”¨ï¼š
å之,如果è¦è®°å½•é‚£äº›çŠ¶æ€ä»£ç ä¸ç‰äºŽæŒ‡å®šå€¼çš„请求,åªéœ€åŠ 入一个“!”符å·å³å¯ï¼š
è‡ªå®šä¹‰æ—¥å¿—æ ¼å¼ï¼Œä¾‹å¦‚:
定义了combineæ ¼å¼ å…¶ä¸\"%{Referer}i\" \"%{User-Agent}i\" 是å‘é€åˆ°æœåŠ¡å™¨çš„求情头和Referer链接。