前端学HTTP之日志记录

前面的话

  几乎所有的服务器和代理都会记录下它们所处理的HTTP事务摘要。这么做出于一系列的原因:跟踪使用情况、安全性、计费、错误检测等等。本文将谥介绍日志记录

记录内容

  大多数情况下,日志的记录出于两种原因:査找服务器或代理中存在的问题(比如,哪些请求失败了),或者是生成Web站点访问方式的统计信息。统计数据对市场营销、计费和容量规划(比如,决定是否需要增加服务器或带宽)都非常有用

  可以把一个HTTP事务中所有的首部都记录下来,但对每天要处理数百万个事务的服务器和代理来说,这些数据的体积超大,很快就会失控。不应该记录实际上并不感兴趣,甚至从来都不会去看一眼的数据

  通常,只记录事务的基本信息就行了。通常会记录下来的几个字段示例为:HTTP方法;客户端和服务器的HTTP版本;所请求资源的URL;响应的HTTP状态码;请求和响应报文的尺寸(包含所有的实体主体部分);事务开始时的时间戳;Referer首部和User-Agent首部的值

  HTTP方法和URL说明了请求试图做些什么——比如,GET某个资源或POST某个订单。可以用URL来记录Web站点上页面的受欢迎程度

  版本字符串给出了与客户端和服务器有关的一些提示,在客户端和服务器之间出现一些比较奇怪或非预期的交互动作时,它会非常有用。比如,如果请求的失败率高于预期,那版本信息指向的可能是一个无法与服务器进行交互的新版浏览器

  HTTP状态码说明了请求的执行状况:是否成功执行,认证请求是否失败,资源是否找到等

  请求/响应的大小和时间戳主要用于记账——记录流入、流出或流经应用程序的字节有多少。还可用时间戳将观察到的问题与当时发起的一些请求关联起来

日志格式

  大部分商用和开源的HTTP应用程序都支持以一种或多种常用格式进行日志记录。很多这样的应用程序都支持管理者配置日志格式,创建自定义的格式

  应用程序支持管理者使用这些更标准的格式的主要好处之一在于,可以充分利用那些已构建好的工具处理这些日志,并产生基本的统计信息。有很多开源包和商用包都可用来压缩日志,以进行汇报。使用标准格式,应用程序及其管理员就都可以利用这些包了

【常见日志格式】

  现在,最常见的日志格式之一就是常用日志格式。这种日志格式最初由NCSA定义,很多服务器在默认情况下都会使用这种日志格式。可以将大部分商用及开源服务器配置为使用这种格式,有很多商用及免费工具都可辅助解析常用日志格式的文件。下表按序列出了常用日志格式中的字段

  下面列出了几个常见日志格式条目

  在这些例子中,字段的分配如下所示

  [注意]remotehost字段可以是http-guide.com那样的主机名,也可以是209.1.32.44这样的IP地址

  第二个(usemame)和第三个(auth-username)字段之间的破折号说明字段为空。这说明要么是没有进行ident査找(第二个字段为空),要么是没有进行认证(第三 个字段为空)

【组合日志格式】

  另一种常用日忐格式为组合日志格式(Combined Log Format),例如Apache服务器就支持这种格式。组合日志格式与常用日志格式很类似。实际上,它就是常用日志格式的精确镜像,只是添加了两个字段。User-Agent字段用于说明是哪个HTTP客户端应用程序在发起已被记录的请求,而Referer字段则提供了更多与请求端在何处找到这个URL的有关信息

  下面列出了新加的组合日志格式字段

字段                描述
Referer            Referer首部的内容
User-Agent         User-Agent首部的内容    

  下例给出了一个组合日志格式的条目

  Referer字段和User-Agent字段的值如下所示


  上面的组合日志格式条目示例中的前七个字段和常用日志格式中的完全一样。两个新字段Referer和User-Agent附加在日志条目的末尾

【网景扩展日志格式】

  网景进入商用HTTP应用程序领域时,为其服务器定义了很多其他HTTP应用程序开发者已接纳的日志格式。网景的格式是基于NCSA的常用日志格式的,但它们扩展了该格式,以支持与代理和Web缓存这样的HTTP应用程序相关的字段

  网景扩展日志格式的前7个字段与常用日志格式中的那些字段完全相同。下表按序列出了网景扩展日志格式引入的新字段

  下面给出了一个网景扩展日志格式的条目

209.1.32.44    - - [03/Oct/2016:14:16:00-0400] "GET / HTTP/1.0" 200 1024 200 1024 0 0 215 260
279 254 3

  在这个例子中,扩展字段的值如下所示

  上面的网景扩展日志格式条目示例中的前7个字段是常用日志格式条目示例的镜像

  另一种网景日志格式,网景扩展2日志格式采用了扩展日志格式,并添加了一些与HTTP代理和Web缓存应用程序有关的附加信息。这些附加字段有助于更好地描绘HTTP客户端和HTTP代理应用程序间的交互图景

  网景扩展2日志格式是基于网景扩展日志格式的,初始字段与网景扩展日志的字段完全相同

  下表按序列出了网景扩展2日志格式新加的字段

  下例给出了一个网景扩展2日志格式的条目

209.1.32.44    - - [03/Oct/2016:14:16:00-0400] "GET / HTTP/1.0" 200 1024 200 1024 0 0 215 260
279 254 3 DIRECT FIN WRITTEN

  这个例子中拓展字段的值如下所示

  上面的网景扩展2日志格式条目中的前16个字段就是网景扩展日志格式示例条目的镜像

  下表列出了有效的网景路由代码

  下表列出了有效的网景完成状态码

  下表列出了有效的网景缓存代码

  与很多其他HTTP应用程序一样,网景应用程序也有其他的日志格式,包括一种灵活日志格式和一种管理者输出自定义日志字段的方式。这些格式给予管理者更大的控制权,并可以选择在日志中报告HTTP事务处理的哪些部分(首部、状态、尺寸等),以自定义其日志

  由于很难预测管理者希望从其日志中获取哪些信息,才添加了管理者配置自定义格式的能力。很多其他的代理和服务器都有发布自定义日志的能力

【Squid代理日志格式】

  Squid代理缓存(http://www.squid-cache.org)是Web上一个很古老的部分。其起源可以回溯到一个早期的Web代理缓存项目(ftp://ftp.cs.colorado.edu/pub/techreports/schwartz/Harvest.Conf.ps.Z)。Squid是开源社团多年来扩展增强的一个开源项目。有很多工具可以用来辅助管理Squid应用程序,包括一些有助于处理、审核及开发其日志的工具。很多后继代理缓存都为自己的日志使用了Squid格式,这样才能更好地利用这些工具

  Squid日志条目的格式相当简单。下表总结了该日志格式的字段

  下面给出了一个Squid日志格式条目的例子

  这些字段的值如下所示

  下表列出了各种Squid结果代码

命中率测量

  原始服务器通常会出于计费的目的保留详细的日志记录。内容提供者需要知道URL的受访频率,广告商需要知道广告的出现频率,网站作者需要知道所编写的内容的受欢迎程度。客户端直接访问Web服务器时,日志记录可以很好地跟踪这些信息

  但是,缓存服务器位于客户端和服务器之间,用于防止服务器同时处理大量访问请求(这正是缓存的目的)。缓存要处理很多HTTP请求,并在不访问原始服务器的情况下满足它们的请求,服务器中没有客户端访问其内容的记录,导致日志文件中出现遗漏

  由于日志数据会遗失,所以,内容提供者会对其最重要的页面进行缓存清除(cache bust)。缓存清除是指内容提供者有意将某些内容设置为无法缓存,这样,所有对此内容的请求都会被导向原始服务器。于是,原始服务器就可以记录下访问情况了。不使用缓存可能会生成更好的日志,但会减缓原始服务器和网络的请求速度,并增加其负荷

  由于代理缓存(及一些客户端)都会保留自己的日志,所以如果服务器能够访问这些日志(或者至少有一种粗略的方式可以判断代理缓存会以怎样的频率提供其内容),就可以避免使用缓存清除。命中率测量协议是对HTTP的一种扩展,它为这个问题提供了一种解决方案。命中率测量协议要求缓存周期性地向原始服务器汇报缓存访问的统计数据

  命中率测量协议定义了一种HTTP扩展,它提供了一些基本的功能,缓存和服务器可以实现这些功能来共享访问信息,规范已缓存资源的可使用次数

  缓存给日志访问带来了问题,命中率测量并不是这个问题的完整解决方案,但它确实提供了一种基本方式,以获取服务器希望跟踪的度量值。命中率测量协议并没有(而且可能永远都不会)得到广泛的实现或应用。也就是说,在维护缓存性能增益的同时,像命中率测量这样的合作方案会给出一些提供精确访问统计信息的承诺。希望这会推动命中率测量协议的实现,而不是把内容标记为不可缓存的

【Meter 首部】

  命中率测量扩展建议使用新增加的首部Meter,缓存和服务器可以通过它在相互间传输与用法和报告有关的指令,这与用来进行缓存指令交换的Cache-Control首部很类似

  下表列出了定义的各种指令和谁可以在Meter首部传输这些指令

  下图给出了一个执行中的命中串测量实例。事务的第一部分就是客户端和代理缓存之间一个普通的HTTP事务,但在代理请求中,要注意有插入的Meter首部和来自服务器的响应。这里,代理正在通知服务器它可以进行命中率测量。作为回应,服务器则请求代理报告它的命中次数

  从客户端的角度来看,请求正常结束了,代理开始代表服务器跟踪该请求资源的命中次数。稍后,代理会尝试与服务器再次验证资源。代理会在发送给服务器的条件请求中嵌入它跟踪记录的计量信息

隐私

  日志记录实际上就是服务器和代理执行的一项管理功能,所以整个操作对用户来说都是透明的。通常,用户甚至都不清楚他们的HTTP事务已被记录

  Web应用程序的开发者和管理者要清楚跟踪用户的HTTP事务可能带来的影响。他可以根据获取的信息收集很多有关用户的情况。很显然,这些信息可以用于不良目的——歧视、骚扰、勒索等。进行日志记录的Web服务器和代理一定要注意保护其终端用户的隐私

  有些情况下,比如在工作环境中,跟踪某用户的使用情况以确保他没有偷懒是可行的,但管理员也应该将监视大家事务处理的事情公之于众

  简单来说,日志记录对管理者和开发者来说都是很有用的工具。只是要清楚在没有获得用户许可,或在其不知情的情况下,使用记录其行为的日志可能会存在侵犯隐私的问题

时间: 2024-10-12 14:39:24

前端学HTTP之日志记录的相关文章

跟王老师学异常(八):开源日志记录工具log4j的使用案例

开源日志记录工具log4j的使用 主讲人:王少华  QQ群号:483773664 学习目标 掌握Log4J在java项目中的应用 一.日志分类及log4j介绍 (一)日志及分类 1 日志 主要用来记录系统运行中一些重要操作信息 便于监视系统运行情况,帮助用户提前发现和避开可能出现的问题,或者出现问题后根据日志找到原因 2.分类 SQL日志:记录系统执行的SQL语句 异常日志:记录系统运行中发生的异常事件 业务日志:记录系统运行过程.如用户登录.操作记录 (二)Log4j介绍 Log4j是Apac

转:使用log4net完成程序异常日志记录(使用SQLite数据库记录和普通文本记录)

http://www.cnblogs.com/kyo-yo/archive/2010/06/11/use-log4net-to-log-exception.html 在前端时间开发的时候由于需要将异常保存到数据库中,所以就到网上搜了下专门的日志记录工具,一搜果然很多,比如:log4net,NLog,EntLib Logging等等,但是还是log4net名气最大,所以就下载下来试用了一番,果然很方便,其涵盖了所有常用的日志记录方式具体的可以看下表: AdoNetAppender 将日志记录到数据

Spring MVC异常统一处理(异常信息的国际化,日志记录)

JAVA EE项目中,不管是对底层的数据操作,还是业务层的处理过程,还是控制层的处理,都不可避免的会遇到各种可预知的(业务异常主动抛出).不可预知的异常需要处理.一般dao层.service层的异常都会直接抛出,最后由controller统一进行处理,每个过程都单独处理异常,且要考虑到异常信息和前端的反馈,代码的耦合度高,不统一,后期维护的工作也多. 同时还必须考虑异常模块和日志模块.国际化的支持. 因此需要一种异常处理机制将异常处理解耦出来,这样保证相关处理过程的功能单一,和系统其它模块解耦,

SLF4J - 一个允许你统一日志记录API的抽象层

一.什么是SLF4J 我们在做Java开发时,如果需要记录日志,有很多日志API可供选择,如: java.util.logging Apache log4j logback SLF4J又是个什么东东呢?为什么使用SLF4J比使用log4j或者java.util.logging更好呢?这是因为与所有提到的这些日志记录库相比,SLF4J没有真正地实现日志记录,相反它只是一个允许你使用任何处于后端的日志记录库的 抽象层 . 如果你正在编写内部或者外部使用的API或者应用库的话,那么你真的不需要让使用你

Spring AOP进行日志记录

在java开发中日志的管理有很多种.我一般会使用过滤器,或者是Spring的拦截器进行日志的处理.如果是用过滤器比较简单,只要对所有的.do提交进行拦截,然后获取action的提交路径就可以获取对每个方法的调用.然后进行日志记录.使用过滤器的好处是可以自己选择性的对某一些方法进行过滤,记录日志.但是实现起来有点麻烦. 另外一种就是使用Spring的AOP了.这种方式实现起来非常简单,只要配置一下配置文件就可以了.可是这种方式会拦截下所有的对action的每个操作.使得效率比较低.不过想做详细日志

sqlmap批量扫描burpsuite拦截的日志记录

1.功能上,sqlmap具备对burpsuite拦截的request日志进行批量扫描的能力 python sqlmap.py -l hermes.log --batch -v 3 --batch:会自动选择yes -l : 指定日志文件 -v: 调试信息等级,3级的话,可以看大注入的payload信息 2.如何配置burpsuite拦截扫描对象? 4.其他方式拦截的request日志文件,也可以 5.使用--smart智能探测效果不是很好,还是采用一些配置,加深扫描比较好 python sqlm

巧用CurrentThread.Name来统一标识日志记录

先看下面的日志: 2017/5/21 18:00:01 [OrderQuery_180001914_C72FF]请求支付中心参数:{"order_no":"KB201705210000165","sign":"e6c3559cd4b36458b180f15bfcd9b5a5"} 2017/5/21 18:00:01 [OrderQuery_180001914_C72FF]支付中心验签通过. 2017/5/21 18:00:01

Haproxy 开启日志记录

CentOS 7上yum安装的Haproxy,默认没有记录日志.需要做一下配置才能记录日志.(不知道其他版本是否需要,已经忘记了)主要是用到了Haproxy,以前貌似没有这么麻烦,今天配置出了一些问题查日志才发现原来Haproxy需要自己手工开启日志记录功能.因此作为相关记录! 1. 创建记录日志文件 mkdir /var/log/haproxy chmod a+w /var/log/haproxy 2. 开启rsyslog记录haproxy日志功能 编辑"/etc/rsyslog.conf&q

PHP 错误与异常的日志记录

提到 Nginx + PHP 服务的错误日志,我们通常能想到的有 Nginx 的 access 日志.error 日志以及 PHP 的 error 日志.虽然看起来是个很简单的问题,但里面其实又牵扯到应用配置以及日志记录位置的问题,如果是在 ubuntu 等系统下使用 apt-get 的方式来安装,其自有一套较为合理的的配置文件可用.再者运行的应用程序中的配置也会影响到日志记录的方式及内容. 错误与异常的区别 关于错误与异常,我们可以用一个简单的例子来理解: <?php try { 1 / 0;