日志文件切分讲解

咱们继续讲下一个小知识点,这些都是非常细粒度的小知识点,Nginx入门的时候都会有一个小的例子,你做Nginx

刚刚入门的时候,官网上会有一个很经典的例子,Nginx里面有三个很经典的例子,刚开始学的时候,我刚开始接触Nginx的时候,

有3个非常经典的hello world的例子,第一个例子就相当于把nginx搭建好,看到welcome use nginx这个东西,然后第二个例子就是

你要做log的一个切分,就是一个分割log split,第三个就是做upstream这个东西,就是负载均衡的Hello world,基本上这三个hello 

world示例,你要是做好了之后,基本上你nginx就已经入门了,大概就已经入门了,现在就来做第二个小例子,就是日志的切分,这块是

一个什么样的概念呢,看我的PPT

其实很简单,花不了几分钟就完事了,知道日志对于互联网是很重要的,你的访问量啊,在我们日常生活中,对nginx日志的分析

非常的重要,通常运维要对nginx的日志进行切分和处理,比如比较大的网站,一天可能就会有好多的访问量,就是一过来,

就你一个日志文件log的话,就太大了,一般我们可能都要做拆分,每隔一小时,每隔一天,因为你一天可能就是几百兆,有时候

可能就是一个G的日志,这是很有可能的,你像天猫那种服务器,他都不是每天备份日志,基本上我估计,就是压力大的时候,

基本上一个小时就得来一次,就是备份日志文件,备份几份,放到hadoop上啊,放在storm上啊,做一些分析处理,根据你format

里面配的一些东西,做一些什么分析啊,很简单,那我们的nginx日志你会发现呢,咱们来看一下我们刚才的日志文件,

cd 到logs下,日志文件就那这个为例

第一天访问量都放在log里了,第二天也都放到这里了,第三天也都放到这里了,那如果你并发很大的话,是不是所有请求的

日志信息都会放到这个logs里,这个很不好,一般小型网站需要一两天备份一次,然后中型网站就是一天备份一次,那这个怎么

去做备份呢,就是写一些简单的shell,可以去完成这个事情,那我们去把日志做切分,做分析处理,备份到你的磁盘上,怎么去做呢

很简单,首先去写一个shell,把这个日志文件移动到其他的地方,然后重新生成一个就OK了,第二个就是定时的去crontab,就是定时

的去做备份,基本上就是这两件事,首先我们看第一件事,这个代码我已经写好了,你最好去熟悉一下,我这里有一个log.sh,

我直接给他放在sbin目录下,sbin下就是一个nginx,我直接把log.sh这个文件直接拽到这里,我们看看这个文件里面到底写了啥

直接vim log.sh

基本上行就是一个非常简单easy的shell,首先我定义了一个directory,就是BASE_DIR,这是一个变量,就是一个局部变量,

脚本内部有效的,shell脚本的话你自己去做一个复习,BASE_DIR是一个key,对应的value是/usr/loca/nginx,这是我的最基础路径,

然后有一个BASE_FILE_NAME,然后我去写了一个fileName,那这个fileName应该和我的什么fileName一致呢,基本上114我们来看一下,

我感觉我这里不需要太改,cd /usr/loca/nginx,基本上cd到logs,我这个叫做这个名字

叫做bhz.com.access.log,就是这四个,就是这个文件名要和你生成的文件名一样,这是我要进行备份的一个log日志,我要把它

备份,接下来你CURRENT_PATH,就是用$BASE_DIR把这个变量取过来了,其实这个就相当于什么啊,其实就相当于

/usr/local/nginx/logs,就是这个很简单,BAK_PATH,这个我是需要再BASE_DIR下建立一个datalogs,这个就是我要备份的地方,

BASE_DIR是什么啊,就是/usr/local/nginx这个位置,就是/usr/local/nginx下我要建立一个文件夹,叫做datalogs,

咱们先不管,也不用退出,这个就是我的BASE_DIR

我去mkdir一下他,mkdir datalogs

这个文件夹建立好,就是多出一个datalogs文件夹,以后要把正常的日志文件备份到datalogs,这个文件夹下面,

接下来就是我的CURRENT_FILE了,前面的CURRENT_PATH,$CURRENT_PATH就是/usr/local/nignx/logs,然后加上

BASE_FILE_NAME再加上bhz.com.access.log,其实他就是logs下的这个文件,就是直接找到了这个文件,

/usr/local/nignx/logs,然后是bhz.com.access.log,这个就是你当前的文件,然后接下来就是你的BAK_TIME,

就是你每次备份日志的时候,总得有一个时间,

记录你当前日志的节点是多少时间,你可以随便来一个,取昨天的,在工作中,一般是一天一备份,什么时间,一般是选择后半夜,

凌晨一两点,凌晨两点钟你去备份,备份什么日志啊,备份昨天的日志,备份昨天一天的日志,这样的话,你就得这样去写了,

date -d yesterday,去找到昨天,然后什么时候,到哪一个节点为止,然后这个路径,这个TIME就是你要备份文件的具体内容,

一般是不加这个的,一般我要把这个去掉,因为我要给你做一个例子,要把小时和分钟去掉,其实就是昨天,昨天给我记录一下

比如昨天是2016年0424,基本上前面就是这样,就是20160424,基本上BAK_TIME就是一天的,不用考虑这个分钟,他基本上一分钟一备份

能看到这个效果,其实工作中一天一备份就够了,所以不用考虑这一块,把昨天备份的日志日期给我输出一下,就OK了,然后我接下来

BAK_FILE,备份的文件叫啥名,在BAK_PATH下,PATH就是datalogs下的,叫做BAK_TIME-$BASE_FILE_NAME,这块可能就是

20140424-bhz.com.access.log,就会产生这样的一个文件,然后把BAK_FILE输出一下,看一下是什么样子的,

其实这块写不写都无所谓,主要看这块怎么去做这个也很简单,你备份之前先把nginx停掉,就是敲这个命令,-s stop停掉,

停掉以后mv,把CURRENT_FILE移动到BAK_FILE,这个BAK_FILE就是移动到这个位置,就是把当前CURRENT_FILE,

这个CURRENT_FILE是什么啊,在这里我写一下吧,这个CURRENT_FILE其实是这样的,就是mv空格,把这个文件移动到哪块,

移动到带PATH下的这个路径,这个BAK_PATH叫做什么啊,正常工作中时分秒去掉了,

那可能就是这样了,加上你这个BASE_FILE_PATH,其实我这个命令其实就是这么长的一个意思,先把nginx停掉,然后把输出的日志移动到

这下面,要把这个日志改一下名字,当天备份的时间,差不多就是这个意思,最后mv完了以后,重启nginx,停一下就重启,还会再次

生成一个日志文件,能理解我说的意思吧,这个你回去敲敲,这个很简单,分析这个shell脚本,变量倒来倒去的,为什么要这么导来导去的,

就为了更方便,就是为了更好用,这个是一个命令赋值,就是把这个执行的结果赋给BAK_TIME这个,当然你也可以用${,你可以代替这个

命令执行的结果赋给前面的变量,也可以$(你的命令),这个小点和小括号是相等的,也是表示执行的意思,差不多就是这个概念,

保存退出,现在我们的脚本写完了,脚本在哪啊,在这个sbin下面,cd到sbin下

这个你要执行还得授权,这块是不是没赋权,你这个命令要调到crontab里面去执行的话,你得赋权,简单的赋权一下

chmod 777 log.sh

我就满了这个权限

现在就放心大胆的去crontab -e,这个回去忘了就复习,这个是定时job的文件夹,crontab -e,就是这个crontab -e,

这个要是不理解就去复习去,*/1就是每一分钟去执行这个脚本,就是每一分钟去备份一份就OK了,然后粘贴

写完了,就是sh /usr/local/nginx/sbin/log.sh,我已经赋权777满了,现在我就去保存,你就会发现每一分钟就会执行一次

那我就cd到datalogs,当前已经有了一个日志了

你会当前已经有了一个日志了,这个是22点11分,1分钟备一次,现在是一个,我刚刚刷了三次,

现在有两个了

直接一分钟给我来一次吗

这里面是有4次,我换一个2

我现在就刷一次,看日志能不能来cd到logs下,其实刚才已经刷了两次了,cat bhz.com.access.log

我刷三次

这里面就多了一次了,你自己回去试试吧,再看

多了一个文件了,在去cat一个3

每分钟来几个备份,你不能copy,只能mv,能不停机备份吗,一般都会停的,其实怎么说呢,多个nginx,

10个nginx,你做keepalived高可用,主备,很多种形式,总之你不会丢数据的,再说nginx启动也非常的快,有个一两秒钟

我的服务就起来了,nginx一般都是可以stop然后start,大体能理解我这个意思吧,就是一个很简单的配合shell,

日志备份的这一块,移动端APP访问nginx吗,移动端一般不走,这块我不太熟,移动端其实不是很安全的,因为我没有

做过移动端开发

 


版权声明:本文为Leon_Jinhai_Sun原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。