突然想了解一下我们 SMTP 服务中的入栈邮件大小,于是写了点脚本分析一下。
先上结论:
日志提取
DATE=20190411
grep "message mid=" inbound.log-${DATE} > inbound.log-${DATE}.2
cat inbound.log-${DATE}.2 | awk '{print $9}' | awk -F'=' '{print $2}' > inbound.log-${DATE}.3
tar -czvf inbound.log-${DATE}.3.tgz inbound.log-${DATE}.3
scp 10.9.13.213:/opt/sendcloud/log/inbound.log-20190411.3.tgz .
scp 10.9.13.213:/opt/sendcloud/log/inbound.log-20190412.3.tgz .
scp 10.9.13.213:/opt/sendcloud/log/inbound.log-20190413.3.tgz .
find -iname inbound.log-2019041\*.3.tgz -exec tar -xzvf {} \;
统计分析
#!/usr/bin/env python3
import os
BASE_PATH = '~/Projects/Company/sendcloud/sc.inbound/'
for date in ('0411', '0412', '0413'):
log_path = os.path.expanduser(os.path.join(BASE_PATH, 'inbound.log-2019%s.3' % date))
result = {'~100KB': 0, '100KB~1M': 0, '1M~10M': 0, '10M~': 0}
with open(log_path) as fp:
for line in fp:
content = line.strip()
if not content.isdigit():
print('errline: %r' % content)
continue
size = int(content)/1024.0
if size <= 100:
size_n = '~100KB'
elif size <= 1024:
size_n = '100KB~1M'
elif size <= 10240:
size_n = '1M~10M'
else:
size_n = '10M~'
if size_n in result:
result[size_n] += 1
else:
result[size_n] = 1
print('%r: %r' % (date, result))
ECharts
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>ECharts</title>
<script src="https://lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/echarts/4.2.1/echarts.simple.js"></script>
</head>
<body>
<div id="main" style="width: 600px;height:400px;"></div>
<script type="text/javascript">
var _data = {
'0411': {'~100K': 475505, '100K~1M': 48008, '1M~10M': 7823, '10M~': 621},
'0412': {'~100K': 490741, '100K~1M': 35675, '1M~10M': 7004, '10M~': 492},
'0413': {'~100K': 332244, '100K~1M': 14217, '1M~10M': 3736, '10M~': 322},
};
var data = [['num'], ['~100K'], ['100K~1M'], ['1M~10M'], ['10M~']];
for (var date in _data) {
data[0].push(date);
data[1].push(_data[date][data[1][0]]);
data[2].push(_data[date][data[2][0]]);
data[3].push(_data[date][data[3][0]]);
data[4].push(_data[date][data[4][0]]);
}
console.log(data);
var option = {
legend: {},
tooltip : { trigger: 'item', formatter: "{d}%" },
dataset: { source: data },
series: [
{ type: 'pie', radius: 60, center: ['23%', '30%'] },
{ type: 'pie', radius: 60, center: ['53%', '30%'], encode: { itemName: 'num', value: '0412' } },
{ type: 'pie', radius: 60, center: ['83%', '30%'], encode: { itemName: 'num', value: '0413' } },
]
};
var myChart = echarts.init(document.getElementById('main'));
myChart.setOption(option);
</script>
</body>
</html>