nginx访问日志按日期分割打包并根据访问日志进行邮件打开率统计

1. 日志分割打包

以下为日志分割打包脚本,详细的注释在脚本中(/root/access_log_pack.sh)

#!/bin/sh
# 按日期定义文件名
d=`date -d "-1 day" +%Y%m%d`
# nginx的pid位置
nginxPid="/run/nginx.pid"
# nginx访问日志所在目录
cd /var/log/nginx
# 根据日期重命名日志文件
mv access.log access.log-$d
# 打包
gzip access.log-$d
# 热启动nginx
kill -HUP `cat $nginxPid`
# 删除10天前打包的日志
find . -name access.log-*.gz -type f -mtime +10 -exec rm -rf {} \;

然后定义crontab定时执行,每天0点整执行

0 0 * * * /root/access_log_pack.sh > /dev/null 2>&1

这样每天0点将会把头一天的日志进行打包,新的一天就生成新的访问日志

2. 邮件打开率统计分析

邮件打开率统计的原理我们是这样设定的:在邮件模板里面加一张长宽皆为一像素的图片,肉眼看不出来,当用户打开邮件时将访问该图片,访问日志中就记录该请求,我们在图片的后面加两个参数,email和time,分别为收邮件的邮箱地址和发送时的时间戳,这样可以避免用户重复打开同一邮件造成的误差。本实例中需要统计两种类型的邮件,图片分别命名为verification_type_1.png和verification_type_2.png。记录的日志格式如下

127.0.0.1 - - [25/Jun/2019:16:38:02 +0800] "GET /[email protected]&time=1398006871 HTTP/1.1" 200 15221 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36"
127.0.0.1 - - [25/Jun/2019:16:30:06 +0800] "GET /admin/system_period_actions HTTP/1.1" 200 5 "-" "curl/7.43.0"
127.0.0.1 - - [25/Jun/2019:16:38:02 +0800] "GET /[email protected]&time=1397006871 HTTP/1.1" 200 15221 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36"
127.0.0.1 - - [25/Jun/2019:16:32:16 +0800] "POST /admin/stats/add_activation_email_open_stats HTTP/1.1" 200 5 "-" "curl/7.43.0"
127.0.0.1 - - [25/Jun/2019:16:38:02 +0800] "GET /[email protected]&time=1397006871 HTTP/1.1" 200 15221 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36"

如统计类型1类的邮件打开率的核心脚本为

cat access.log-* | grep '/verification_type_*' | awk '{print $7}' | sort | uniq | grep -c 'verification_type_1.png'

下面详细解释一下上面这行脚本的执行过程

  1. cat access.log-*
    取到所有名字以access.log-开头的文件的内容,如果有打包的先解压
  2. cat access.log-* | grep ‘/verification_type_*’
    根据/verification_type_字符串过滤文件内容的每一行
  3. cat access.log-* | grep ‘/verification_type_*’ | awk ‘{print $7}’
    获取过滤后的文件内容的每一行的第七列,awk的列默认是以空格分隔
    第一行的第七列为“/[email protected]&time=1398006871”
  4. cat access.log-* | grep ‘/verification_type_*’ | awk ‘{print $7}’ | sort
    将前面的内容进行排序
  5. cat access.log-* | grep ‘/verification_type_*’ | awk ‘{print $7}’ | sort | uniq
    对排序过后的内容进行去重,因为uniq只能将相邻的行进行去重,所以要进行排序
  6. cat access.log-* | grep ‘/verification_type_*’ | awk ‘{print $7}’ | sort | uniq | grep -c ‘verification_type_1.png’
    将去重后的内容进行以包含“verification_type_1.png”字符串的行进行统计

类似的统计类型2类的邮件打开率的核心脚本为

cat access.log-* | grep '/verification_type_*' | awk '{print $7}' | sort | uniq | grep -c 'verification_type_2.png'

你可能感兴趣的:(solution)