python版的服务器大文件log文件读取方法

服务器上面的tail 很好用,想在线使用找个python版的,搜了一堆,发现很多的实际调试都有问题,没办法,自己找了个改进吧。

class Tail():
    def __init__(self, file_name):
        self.file_name = file_name

    def follow(self,match, n=10):
        callback = []
        try:
            with open(self.file_name) as f:
                self._file = f
                self._file.seek(0, 2)
                self.file_length = self._file.tell()
                mv = self.showLastLine(n)
                while True:
                    line = self._file.readline()
                    if line:
                        if mv>0:
                            mv = mv - 1
                            continue
                        elif len(match)>0:
                            if line.find(match)>0:
                                callback.append(line)
                        else:
                            callback.append(line)
                    else:
                        break

        except Exception:
            print(Exception.args)

        return callback


    def showLastLine(self, n):
        len_line = 100
        read_len = len_line * n
        block = 1
        rest = 0
        while True:
            if read_len > self.file_length:
                self._file.seek(0)
                break

            self._file.seek(self.file_length - read_len*block)
            last_words = self._file.read(read_len)
            rest = rest + last_words.count('\n')
            if rest<n:
                block = block + 1
                continue
            else:
                self._file.seek(self.file_length - read_len*block)
                break
        return rest - n

#调用方法
log = Tail('/wwwlogs/www.17dingbao.com')
v = log.follow('Spider')

HTML页面:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Log</title>
    <style>
        * {font-size: 12px;color:#666;}
        p {width: 100%;}
        textarea {height: 500px;width: 100%;color: forestgreen;padding: 8px;}
    </style>
    <script src="https://apps.bdimg.com/libs/jquery/1.9.1/jquery.min.js"></script>
</head>
<body>
<p>path:<input type="text" placeholder="查找文件" id="key">
    <input type="text" placeholder="匹配字符" id="match">
    <input style="width: 50px" type="text" value="500" id="lines">
    <input type="button" value="查看" id="see">
    <select id="fls" style="display: none">
        <option>选择日志文件</option>
    </select>
</p>
<p><textarea id="log"></textarea></p>
<script>
    var path = "e:/";
    function seach(fname) {
        $.ajax({
            url:'/log',
            type:'post',
            data:JSON.stringify({
                file:fname,
                max:parseInt($("#lines").val()),
                match:$("#match").val()
            }),
            dataType:'json',
            success:function (o) {
                console.log(o);
                ov = '';
                for (m in o)
                    ov += o[m];
                $("#log").val(ov);
            }
        });
    }
    $("#see").click(function () {
       var fname = $("#key").val();
       seach(fname);
    });



    $.ajax({
        url:'/files?act=' + path,
        dataType: 'json',
        success:function (o) {
            console.log(o)
            if(o.length>0) {
                $("#fls").show()
                for(v in o) {
                    $("#fls").append('<option value="' + o[v] + '">' + o[v] + '</option>')
                }

                $("#fls").change(function (o) {
                    var pp = $(this).find(":selected").val();
                    seach(path + pp);
                });
            }
        }
    })
</script>
</body>
</html>

下面结合一下Flask,一个在线读大文件日志的Web就完成了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用Python服务器日志文件中统计每日登录人数的通用代码: ```python import re import pandas as pd from datetime import datetime, timedelta # 读取日志文件并解析出IP地址和时间 filename = 'your_log_file' pattern = r'\d+\.\d+\.\d+\.\d+.*\[(.*)\].*login.*' df = pd.read_csv(filename, sep='\n', header=None, names=['line']) df['ip'] = df['line'].str.extract(r'(\d+\.\d+\.\d+\.\d+)') df['time'] = df['line'].str.extract(pattern)[0].str[:11] df = df.dropna() # 统计每日登录人数 start = datetime.strptime(df['time'].min(), '%d/%b/%Y') end = datetime.strptime(df['time'].max(), '%d/%b/%Y') date_range = pd.date_range(start=start, end=end, freq='D') result = [] for date in date_range: mask = (df['time'].str.startswith(date.strftime('%d/%b/%Y'))) count = df.loc[mask]['ip'].nunique() result.append((date.date(), count)) # 输出结果 for date, count in result: print(f'{date}: {count} users') ``` 上述代码假设日志文件中包含有关用户登录的信息,并且该信息中包含了IP地址和时间。代码使用正则表达式从日志文件中解析出IP地址和时间,并使用pandas库将其转换为DataFrame格式。然后,代码对时间进行日期提取和去重,并使用nunique()函数统计每个日期内唯一登录的IP地址数,即为每日登录人数。 在实际应用中,需要根据日志文件的具体格式和内容进行调整和测试。同时,由于日志文件可能会很大,需要使用适当的方法来优化代码的效率和可扩展性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值