00:00
那我们上节课讲的日志的记录呢,它可以以缓冲的方式去记录到我们的这个磁盘上,然后另外一个就是,呃,如果缓冲区的这个内容始终填不满的话,那么这里面还有一个强制的flash time。就是指定在多长时间内,你必须去给我刷新。以避免在运行的过程当中呢,呃,由于长期这个内存里边的这个缓冲区的堆积不满,然后造成它不往这个不往这个这个磁盘上去落地,那这个flash呢,呃,这个功能呢,就弥补了这个问题啊,我们可以看一下它后边跟的是time,也可以跟单位啊,具体多长时间呃,Flash。等于比如说我们在这填个1S,这就是一秒,每秒刷一次,一般来说我们都以分钟这个为计时的,比如说每五分钟啊,或者每半个小时去来一次。这个是强制刷新,为了让大家看见效果呢,我们在这配置成一秒,我们看一下保存,然后重启。
01:01
然后再看这日志啊,现在还在这跟着对吧。呃,然后我们刷新一下这个页面。对,他这好像是卡住了,然后再。哦,他这个这个日志文件,我们现在追踪的已经不是这个这个这个原来的那个地儿了啊,已经给他换地儿了嘛,是吧,这在NG X log下在这是吧,他现在应该是每每秒去帮我们刷新一次是吧,来看看。诶,你看动了,然后刷几次,它也是以秒为单位,在这帮我们去强行的这个落地,当然我刷这几下,它的这个缓冲区,它肯定是没有填满的啊。就刷这几件,咱们虽然配置的缓冲区不是特别大,32K,但也肯定填不满,那这个缓冲区和记录日志呢,现在都是以这个文本的方式去记录的,大家看出来了。那这个文本的记录方式啊,嗯。
02:00
是不是可以用一下这个GZ啊,因为我们在请求这个HTTP的时候,呃,是可以用这个g zip的,那我们记日志的时候能不能用这个对吧?那能让我们的这个日志文件呢,稍微的小一点,因为它是把每一条记录全部都给我们记录下来的。啊,我们现在这个日志呢,已经在NGX。嗯。这NG X log在这儿了,你看随便我们刷了几下,已经17K了。那一跑跑正常的服务器,跑一天这几个G的大小是肯定是有的。那这个文件越堆积越大,那你在这个存储的时候,它也很浪费空间,你又不能不记它,对吧,那这个呃,官方呢,就给我们提供了这么一种方式。通过g zip去压缩它的这个,呃,这个存储这个g zip在压缩的时候,它是在内存里边就经压缩了,就是在们缓冲区里就已经压缩了,那在缓冲区里压缩完之后,他也不会解压开,再去记录到我们的这个日志文件里,而是直接在这个日志文件里面去追加这个g zip的内容,也就是记录下来的。
03:07
内容呢,我们就不再可见了啊,就是呃,我们看见的都是这个这个压缩包了啊,大家看一下这个配置。在这呢,我再加一个GZ。呃,你如果什么都不写的话,它默认的压缩等级是一,也就是压缩的这个效率,压缩的速度非常高,但是压缩比非常低,它最大值呢,可以配置成九,也就是压缩比非常高,但压缩的速度就比较慢了,这也是比较极端的情况啊,然后我们再去重启一下。然后注意看这个日志,我们再请求。把它拉小一点。来,大家看。这会儿他在记录日志的时候,这都这都是不可读的了,已经大家看见了吧,啊,这非常非常乱的乱码,那这是啥东西啊,这就是已经压缩好的这个数据文件。
04:03
压缩好之后呢。它追加到我们原来这个access log文件里。那你看现在这就乱了嘛,前面是铭文的,那后边是这个加密后的,那如果我想看的话,怎么看,你这种情况下肯定是没法看,那你只能把原来这些铭文的全都给清除掉,只留这个加密后的这个文档,那如果你要是开启这个g zip的话,你要谨慎一些啊,最好是单独的去搞一个文件。呃,空文件从头开始记,那我们现在把这个原来记的这个日志文件的先给他给删了。那么接下来我们把这个文件给它给删掉啊,先给它删了,然后再他们重新生成一些这个纯粹的压缩文件,你注意你删完这个文件之后呢,它现在没有对吧,然后你现在刷几下呢。他也不出来。这文件也出不来,你需要重启一下,它得重新建立一下这个文件才可以,只有在重启的时候才会去检查这个文件啊,重启啊,这会儿文件出来,这会儿再重新再刷,它就会往里去写了。
05:04
啊,那这会儿呢,我们打开看看啊。这就是一个纯粹的压缩文件了,那这个压缩文件如果我们想看的话,怎么看,它就是以g zip的方式去压缩的啊,去把它这个给它解压缩开就可以了。呃,解压缩呢,它有个命令叫JZ啊,在命令行上。你找到这个日志文件。这文件在这对吧,我们想给它解解压开呢,我们先给它复制一份出来。然后access log点呃,G z g zip啊,它这后缀格式GZ,然后用j j zip命令去解压缩,这更低,这不是按zip,按zip是zip格式,J zip才是g zip格式啊。然后这个n.log.pz走。
06:02
那它解压缩出来呢,它是一个没有这个后缀的这么一个文件,微一下你看这个access。这就是解压好的啊,明文的内容在这儿呢,应该也能看得到,就是这个文件。这就是把这个呃,原来的这个呃。这个这个这个。压缩包给它给解开了,你看这个比例压缩比有多大。原本呢是700多B的压缩包,解出来的能到五个K啊对吧,这是五,这是五倍的差距啊,这个压缩比非常高的,那这就比较节省空间了,当然你把压缩比设置的太高,我们现在设置是九,对吧。它就会在压缩的时候比较消耗性能,但你解压缩时候可能就不着急了,对吧,但压的时候呢,就稍微的消耗一些性能,但一般来说我们记录日志呢,呃,也不太需要太过于纠结这个性能问题啊,日志服务器本来就是只处理日志的,他又不处理别的请求。
07:04
嗯,这个根据自己的场景,我们去设计去调整就可以了啊。那我们再看一下还有一些其他的配置啊,我们需要呃,关心的有哪些。嗯,这官方文档里边也写了啊,然后我们看看在这儿还有一个if后边跟这个,呃指令,这是做这个逻辑判断的。比如说来自。呃,什么样的客户端来自哪个IP的啊,如果匹配上之后呢,他就不记录了。然后还有就是下边还有一个命令是这个,呃。这个open log file catch,这个open log file catch和呃我们之前讲过的,对这个文件描述符,呃去做这个,呃去做缓冲其实是一样的。呃,在咱这儿做这个配置的,就是在咱这这个配置文件里啊,默默认呢,它没有这个开启这个open log file catch,也就是说在每次写日志的时候,他都得去重新打开磁盘上这个文件,然后追加,然后再可close掉,呃,对于这个文件IO的开销,如果要是高并发的写入的话,呃,其实是比较大的,那么那么如果我们要是把这个缓冲区设置的还OK的话啊,其实影响倒也还好啊,我设置的缓冲区稍微大那么一点点,然后flash的时间间隔呢,也稍微长一点。
08:27
啊,他也不会特别频繁的去往这个磁盘里边去做这个IO的开关操作,但这确实是可以一个优化的点,就是打开这个文件描述符啊,然后我就这个这个这个给它缓冲到我的这个内存里,然后不需要这个每次开关了,那这个的配置呢。呃,后边的跟据这个参数啊,就首先这个max指的是最大打开多少个文件描述符,反正一般来说我们写日志的话,也就这么几个日志文件,对吧,比如在这给他来个五,这就足够了啊,现在我们就一个日志文件嘛,对吧,它指的就是往这日志文件里边去写入,然后在读写的时候做缓冲是吧?然后这个inacive time啊,Mean user video data这三个参数是不是很熟。
09:13
对吧?Active time指的是啥?它活动时间mean user有多少个人?呃,请求了,然后再做缓冲是吧?呃,然后valid,呃,在缓冲区里边的一个过期时间。这很明显是复用了一些之前的一些代码,就在N内部是吧,也可以配置这几个参数,我们在这儿呢,给它配置一个max等于五啊就可以了,然后现在在这个,呃,这么做实验的话呢,其实我们现在看不太出来这个明显的效果,就是对于这个文件缓冲的这个效果啊。然后再有就是最后的这个比较重要的配置就是。Log format,这里边能记录的这些呃,变量啊,它都在这里边已经帮我们列出来了,有有这个有兴趣你可以自己再去仔细研究研究,每一个变量对应的这个功能是啥,然后现在我们输出的这个格式啊,日志格式是以文本的方式去输出的,它额外支持另外的方式就是以Jason的方式去输出。
10:15
大家看在这个log这儿啊,这就是一个字符串嘛,啊跟跟跟这个字符串,它还可以支持这个。Jason log for me,后面我们现在只跟了一个name对吧,那后边还可以跟一个这个Jason,如果要跟着Jason的话,他就会帮我们去处理一下这个字符串里的特殊字符,它不会把我们把我们的这个字符串呢,直接给我们转成这个Jason格式。他也不知道这个层级结构对吧,我们在这里边也没有写这个层级结构。那么它可以怎么做呢?帮我们去转移,做一些转移,比如说这个斜杠,然后这个一些这个制表符,换行符什么的啊,一些特殊字符可以可以帮我们去转移出来。呃,然后呢,我这儿有一个Jason格式的样例啊,大家可以参考看一下,我把它给直接给粘过来,我们看看。
11:08
就NGX的log啊。把这些删了啊,这原来的这个呢,先维持不动。这里边儿呢,我们需要自己手动去拼接这个Jason的这个大括号啊。呃,这是基本的一个格式,然后我们在这用这个N几。Log,这就是Jason格式的了。然后在这配置一下。把这个名字给他换了。然后把这JZ呢关了,要不看不见这个它输出的这个内容还得解压缩,挺麻烦的,然后保存,然后我们再重启一下服务器。然后重启一下。重启之后呢,我们看看这儿,然后重新再去跳一下。
12:10
哦,现在还是这个。JZ的呢,我们把这个j zip的给它给清了。清了之后,然后再重新的去。太啊,现在没有重启。然后tell。然后咱们再刷新一下这个这个图片。然后看看这儿的输出。给大家看,现在它已经变成了这个Jason格式的了。啊,我们给它打开看看。每一条啊,他不会把呃整个的这个呃这个这个这个。文件组成一个大的Jason,他没法加那样,而且加的时候他得找节点,对吧,他是把每一行给我们组织成了Jason,大家看。
13:01
啊,这样就是一个Jason格式的这个,呃,这个这个日志了啊。那这Jason格式的日志它有啥用啊,嗯,你像这个我们用这个mongo DB啊,或者是一些这种文本文档类型的这种数据库,我想着做去做一些简单数据分析的时候呢,就可以把这个。这个这个呃,日志直接导走导过去,或者是往erk里啊,Elastic search里往里去导的话,导这个jeson也是比较方便的,但是文本格式的这种日志,呃,它就更适用于一些大数据的这些框架,比如说往HDFS里去存,那么可以去设置它的这个边界符啊,或者是分隔符。啊,每一个这个字段中间的加一个风格,往这个op里,往HDFS里存,往op里去导,然后用这个一些have啊等等这种,呃,这种这种数仓的工具呢,就可以做数据分析了,那具体的格式一般也都是大数据的研发人员,呃,给我们这个标准的格式,然后我们去呃给他给。
14:02
呃,配置出来其实也就可以了,大家要注意就是在access log这记录的时候呢,它会默认情况下把所有的有效请求全部都给我们记录下来啊,所以你在配置它的时候,呃,这里边是没有任何的这种呃等级的,它不像是这个错误日志啊,或者咱们写Java代码的时候,比如我配置一个arrow等级的info等级等等等等。啊,这个里边是没有的,这是所有的访问日志,它全部都会给我们记录下来,呃,有一些不太重要的这些接口,其实我们是可以把这个日志直接给它关掉的。啊呃,这样呢,能够略微的提升一下NG的性能啊,但是尽可能还是不要滚啊,它好歹还有一个缓冲区,也就是多了一些磁盘的IO开销,嗯,多一些开销呢,多一丝的这个安全,我们可以去追溯一些之前的用户的一些行为,如果要是有一些非法的这种请求的话,来源于哪个IP?呃,配合一下防火墙去读这个日志啊,某一个IP极为频繁的去请求我的某一个接口,他都连别的什么都不访问,老在这刷这一个东西,我是不是就可以分析出来这是一个可疑行为,然后给他进入监控名单,接下来我可以把这IIP给办掉,对吧,尽可能还是不要把这个,呃日志呢,给它给关掉,那么这就是。
15:20
它的access log,那么接下来我们给大家讲这个error log啊,那是记录错误的。
我来说两句