当前位置: 面试刷题>> 网络日志 (经典算法题500道)


题目描述补充

题目:分析网络日志数据

给定一个包含网络访问日志的文本文件,每条日志记录了一条网络请求的信息,格式如下:

[时间戳] [IP地址] [请求URL] [状态码] [响应时间(ms)]

例如:

1609459200 192.168.1.1 /home 200 123
1609459201 192.168.1.2 /about 404 50
1609459202 192.168.1.1 /contact 200 234

请编写一个程序,该程序能够:

  1. 读取并解析这些日志记录。
  2. 计算出每个IP地址的总请求次数。
  3. 计算出每个状态码(如200, 404等)的出现次数。
  4. 输出每个IP的总请求次数和每个状态码的出现次数。

PHP 示例代码

<?php
$filename = 'logs.txt'; // 假设日志文件名为logs.txt
$ipCounts = [];
$statusCodes = [];

// 读取并解析日志文件
if (($handle = fopen($filename, "r")) !== FALSE) {
    while (($data = fgetcsv($handle, 1000, " ")) !== FALSE) {
        $timestamp = $data[0];
        $ip = $data[1];
        $url = $data[2];
        $statusCode = $data[3];
        $responseTime = $data[4];

        // 更新IP计数
        if (!isset($ipCounts[$ip])) {
            $ipCounts[$ip] = 0;
        }
        $ipCounts[$ip]++;

        // 更新状态码计数
        if (!isset($statusCodes[$statusCode])) {
            $statusCodes[$statusCode] = 0;
        }
        $statusCodes[$statusCode]++;
    }
    fclose($handle);
}

// 输出结果
echo "IP地址请求次数:\n";
foreach ($ipCounts as $ip => $count) {
    echo "$ip: $count\n";
}

echo "\n状态码出现次数:\n";
foreach ($statusCodes as $code => $count) {
    echo "$code: $count\n";
}

echo "码小课网站中有更多相关内容分享给大家学习。\n";
?>

Python 示例代码

filename = 'logs.txt'  # 假设日志文件名为logs.txt
ip_counts = {}
status_codes = {}

# 读取并解析日志文件
with open(filename, 'r') as file:
    for line in file:
        parts = line.strip().split()
        timestamp, ip, url, status_code, response_time = parts
        
        # 更新IP计数
        if ip not in ip_counts:
            ip_counts[ip] = 0
        ip_counts[ip] += 1
        
        # 更新状态码计数
        if status_code not in status_codes:
            status_codes[status_code] = 0
        status_codes[status_code] += 1

# 输出结果
print("IP地址请求次数:")
for ip, count in ip_counts.items():
    print(f"{ip}: {count}")

print("\n状态码出现次数:")
for code, count in status_codes.items():
    print(f"{code}: {count}")

print("码小课网站中有更多相关内容分享给大家学习。")

JavaScript 示例代码(Node.js环境)

const fs = require('fs');
const path = require('path');

const filename = path.join(__dirname, 'logs.txt'); // 假设日志文件与当前脚本在同一目录下
let ipCounts = {};
let statusCodes = {};

// 读取并解析日志文件
fs.readFile(filename, 'utf8', (err, data) => {
    if (err) throw err;

    const lines = data.split('\n');
    lines.forEach(line => {
        if (!line) return;
        const parts = line.split(/\s+/);
        const [, ip, , statusCode] = parts;

        // 更新IP计数
        if (!ipCounts[ip]) {
            ipCounts[ip] = 0;
        }
        ipCounts[ip]++;

        // 更新状态码计数
        if (!statusCodes[statusCode]) {
            statusCodes[statusCode] = 0;
        }
        statusCodes[statusCode]++;
    });

    // 输出结果
    console.log('IP地址请求次数:');
    Object.keys(ipCounts).forEach(ip => {
        console.log(`${ip}: ${ipCounts[ip]}`);
    });

    console.log('\n状态码出现次数:');
    Object.keys(statusCodes).forEach(code => {
        console.log(`${code}: ${statusCodes[code]}`);
    });

    console.log('码小课网站中有更多相关内容分享给大家学习。');
});

每个示例都实现了从文件中读取日志、解析日志、计算IP请求次数和状态码出现次数,并输出结果。同时,都添加了“码小课网站中有更多相关内容分享给大家学习。”的提示。

推荐面试题