nginx 日志分析统计蜘蛛
{callout color="#f0ad4e"}
在线统计蜘蛛,分析网站日志 https://www.ycyaw.com/index.php/346.html
{/callout}
怎么完成的
其实是我的chatGPT帮我写的,十分的强大!
所以我代码就不解释了,直接上代码,如果有问题请找AI帮忙分析,需要使用AI可以在本网站右上角找到AI机器人点击使用
代码呈现
{message type="info" content="本代码是在typecho中新建独立页面用的,自行取舍即可"/}
<?php
/**
* 蜘蛛统计
*
* @package custom
*/
if (!defined('__TYPECHO_ROOT_DIR__')) exit;
$this->need('header.php');
?>
<title>在线网站日志分析-在线蜘蛛统计</title>
<meta name="description" content="这是一个方便统计网站蜘蛛的工具页面。上传日志文件后,可以快速显示各大搜索引擎蜘蛛的数量统计结果。">
<div style="background-color: #ffffff; padding: 20px;">
<h1>蜘蛛统计分析工具</h1>
<form method="post" enctype="multipart/form-data">
<input type="file" name="logfile" />
<button type="submit">上传日志文件</button>
</form>
<?php
if (isset($_FILES['logfile'])) {
$file = $_FILES['logfile'];
if ($file['error'] === 0) {
$pathinfo = pathinfo($file['name']);
if (strtolower($pathinfo['extension']) === 'log') {
$handle = fopen($file['tmp_name'], "r");
$count = ['Baiduspider' => 0, 'Googlebot' => 0, 'bingbot' => 0, 'Sogou' => 0];
while (($line = fgets($handle)) !== false) {
foreach ($count as $key => &$value) {
if (stripos($line, $key) !== false) {
$value++;
}
}
}
fclose($handle);
arsort($count);
$data = [];
foreach ($count as $key => $value) {
$data[] = [$key, $value];
}
?>
<div id="chart_div" style="width: 900px; height: 500px;"></div>
<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
<script type="text/javascript">
google.charts.load('current', {'packages':['corechart']});
google.charts.setOnLoadCallback(drawChart);
function drawChart() {
var data = google.visualization.arrayToDataTable([
['Browser', 'Visits'],
<?php foreach ($data as $item) { ?>
['<?php echo $item[0]; ?>', <?php echo $item[1]; ?>],
<?php } ?>
]);
var options = {
title: 'Spider Statistic',
pieHole: 0.4,
colors: ['#3366CC', '#DC3912', '#FF9900', '#109618']
};
var chart = new google.visualization.PieChart(document.getElementById('chart_div'));
chart.draw(data, options);
}
</script>
<?php
} else {
echo "<p>请上传.log格式的日志文件。</p>";
}
} else {
echo "<p>上传日志文件出错,请重新尝试。</p>";
}
}
?>
</div>
<?php $this->need('footer.php'); ?>
注意事项
文件上传最大限制会根据nginx或者PHP的配置所受到限制,建议不要改太大,虽然本代码中已经实现了使用逐行读取的方式进行处理。这样可以避免一次性将整个文件读入内存,从而减少内存占用
而我们一般网站的日志都很大,去文件中手动复制出来又很麻烦,所以我写了一段shell脚本去分割日志,把今天的日志单独存在一个文件中,而且多次执行的话会检测文件是否存在,在的话就往里面重写就行了
#!/bin/bash
log_path="/www/wwwlogs/www.xxxx.com.log"
log_dir="/www/wwwlogs"
current_date=$(date +%Y-%m-%d)
# 判断日志文件是否存在
if [ ! -f "$log_path" ]; then
echo "日志文件不存在"
exit 1
fi
# 判断备份目录是否存在,不存在则新建
if [ ! -d "$log_dir" ]; then
mkdir -p $log_dir
fi
# 判断今天的日志文件是否已经存在,存在则将日志内容追加到已存在的文件中,不存在则新建文件
if [ -f "$log_dir/$current_date.log" ]; then
grep $(date +"%d/%b/%Y") $log_path >> "$log_dir/$current_date.log"
else
grep $(date +"%d/%b/%Y") $log_path > "$log_dir/$current_date.log"
fi
记得修改位置,然后使用宝塔的计划任务每天执行几次或者隔几小时执行一次即可
更新方向
这只是简单的实现了而已,还能美化界面,包括统计方式只实现了蜘蛛的累计抓取数量,没有统计抓的页面和有多少单独蜘蛛等等,后面有需要我会更新。
版权申明
本文系作者 @亦秋先生 原创发布在亦秋先生博客站点。未经许可,禁止转载。
全部评论 1
忆江南
FireFox Windows 10