python实时分析用户登录

通过nginx日志

#!/usr/local/bin/python3
# coding:utf-8

# ====================================================
# Author: chang - EMail:[email protected]
# Last modified: 2017-5-8
# Filename: nginxanalysis.py
# Description: real time analysis nginx log,base time, os, thread
# blog:http://www.cnblogs.com/changbo
# ====================================================

"""
需求:每隔1分钟读取nginx日志文件
notice:
模拟日志切割过程中初始化脚本参数
cp access.log access2017xxxx.log  && echo > access.log && echo ‘0‘> offset.txt
"""

import time
import os
import re
import pymysql
from threading import Thread
# from django.db import connection

keypage = [‘/sys/get_user.do‘, ‘/hmcsapiV1.0.7/user/login‘]
engdate = {‘Jan‘: ‘1‘, ‘Feb‘: ‘2‘, ‘Mar‘: ‘3‘, ‘Apr‘: ‘4‘, ‘May‘: ‘5‘, ‘Jun‘: ‘6‘, ‘Jul‘: ‘7‘, ‘Aug‘: ‘8‘, ‘Sept‘: ‘9‘,
           ‘Oct‘: ‘10‘, ‘Nov‘: ‘11‘, ‘Dec‘: ‘12‘}

def dateformat(nginxdate):
    day = (nginxdate.split(‘[‘)[1]).split(‘/‘)[0]
    month = engdate[(nginxdate.split(‘[‘)[1]).split(‘/‘)[1]]
    year = (nginxdate.split(‘[‘)[1]).split(‘/‘)[2]

    return year + ‘-‘ + month + ‘-‘ + day

# write log offset
def writeoffset(number):
    with open(‘offset.txt‘, ‘w+‘) as f3:
        f3.write(number)
        f3.flush()

# get log offset
def getoffset():
    with open(‘offset.txt‘) as f2:
        offset = f2.readline()
        return offset

db = pymysql.connect("xxxxxx", "xxxx", "xxxx", "xxxx")
cursor = db.cursor()
# cleantable = ‘TRUNCATE abnormal‘

listtime = []
listuser = []

def analysisdb():
    while True:
        time.sleep(60)
        try:
            sql3 = ‘SELECT user,time FROM userlogin‘
            cursor.execute(sql3)
            results = cursor.fetchall()
            for row in results:
                listuser.append(row[0])
                listtime.append(row[1])

            # 统计1分钟内用户登录次数
            sql1 = "SELECT count(*) from userlogin where time=‘%s‘ and user=‘%s‘" % (listtime[0], listuser[0])
            # 如果不满足条件则删除该条记录
            sql2 = "DELETE from userlogin where time=‘%s‘ and user=‘%s‘" % (listtime[0], listuser[0])

            print(listtime[0], listuser[0])
            cursor.execute(sql3)
            cursor.execute(sql1)
            datad = cursor.fetchone()
            print(datad)
            if datad[0] < 3:
                cursor.execute(sql2)
                db.commit()
                print(‘-----delete success -------‘)
            del listtime[0]
            del listuser[0]
        except Exception as e:
            time.sleep(60)
            print(e)

def handleline(logline):
    susptmp = logline.split(" ")
    if len(susptmp) > 2:
        if susptmp[6] == keypage[0]:
            del susptmp[1:3]
            del susptmp[7:]
            del susptmp[2:6]
            if len(susptmp) > 2:
                ip = susptmp[0]
                time1 = ((susptmp[1].split(‘:‘, 1))[1])[0:5]
                date = dateformat((susptmp[1].split(‘:‘, 1))[0])
                _, _, user, _, passd, _ = re.split(r‘[&="]‘, susptmp[2])

                # print(ip + ‘---‘, time1 + ‘---‘, date + ‘---‘, user + ‘---‘, passd + ‘---‘)
                sql = "INSERT INTO userlogin(ip, time, user, passd, date) VALUES(‘%s‘, ‘%s‘, ‘%s‘, ‘%s‘, ‘%s‘)" % (ip, time1, user, ‘*****‘, date)
                try:
                    cursor.execute(sql)
                    db.commit()
                    print(‘Insert success!‘)
                except Exception as e:
                    print(e)

# online analysis log
def analysislog():
    with open(‘access.log‘) as f1:
        while True:
            # get offset
            lastoffset = getoffset()
            # jump the Specify log line
            f1.seek(int(lastoffset))
            # 获取该行偏移量
            where = f1.tell()
            line = f1.readline()
            writeoffset(str(where))
            if not line:
                time.sleep(10)
                f1.seek(where)
            else:
                # 处理该行,并获取改行的偏移量且写入文件
                handleline(line)
                nowoffset = f1.tell()
                writeoffset(str(nowoffset))

if __name__ == ‘__main__‘:
    if not os.path.exists(‘offset.txt‘):
        with open("offset.txt", ‘w‘) as f:
            f.write(‘0‘)

    t1 = Thread(target=analysislog)
    t2 = Thread(target=analysisdb)
    t1.start()
    t2.start()

END!

时间: 2024-08-24 14:49:07

python实时分析用户登录的相关文章

python之用户登录三次锁定

基于文件存储的用户登录程序(3次登录失败,锁定用户) 思路:1.login.user是存放用户id及密码的文件,也就是白名单:2.lock.user是存放被锁定的用户id的文档,默认为空,也就是黑名单:3.程序会先检查输入的用户名是否存在于黑名单中,如果有,则退出,并提示此用户被锁定,否则继续检查白名单:4.程序先对login.user里的合法用户id进行判断,若连续输入用户id错误达三次程序直接退出:4.程序最后会对输入的id,对应的密码进行判断,输入密码有3次机会,连续三次错误则会锁定用户i

【Python】用户登录三次锁定

需求说明: 用户登录,对密码进行三次校验,三次均失败后,将锁定用户名,不允许登录. 解决方案: 1.明确可成功登录的用户名和密码: 2.用户黑名单,三次登录失败后,将用户名写入黑名单: 3.检测黑名单的内容,如果与当前登录名一致,则不允许继续输入密码,直接提示用户已锁定. 代码实现: 1 # -*- coding:utf-8 -*- 2 3 #登录三次锁定用户 4 5 #用于计数(循环三次的判断) 6 count = 0 7 8 #真实用户名和密码 9 real_username = "iamx

python实现用户登录界面

要求 输入用户名密码正确,提示登录成功, 输入三次密码错误,锁定账户. 实现原理: 创建两个文件accout,accout_lock accout记录用户名,密码 accout root 1qazxsw2 wxp qwerty osadmin 123456 accout_lock记录锁定用户,默认为空 代码: #!/use/bin/env python #-*- coding:utf-8 -*- import sys,os import getpass #os.system('clear') i

python作业用户登录_day01

作业要求: 输入用户名和密码 认证成功之后弹出登录欢迎信息 密码输入错误三次锁定账户 思路: 先画流程图,可以吧逻辑搞清楚. 创建了user_file是用户文件,lock_file是被锁用户文件 主程序: 1 #_*_ coding:utf-8 _*_ 2 __author__ = 'zhangkai' 3 print('****************欢迎来到英雄联盟******************') 4 login_user = input('请输入您的账号:') 5 6 lock_f

python 模拟用户登录代码

需求:输入用户名,判断用户是否被锁定,锁定则退出,否则进入密码验证,输入三次错误密码之后此用户被锁定. userlist.txt里,用":"将用户名.密码.状态码分开: [[email protected] ~]# cat userlist.txt 张三:123:0 李四:456:0 admin:123:0 qqq:123:0 代码: 1 #!/usr/bin/env python 2 # -*- coding=utf-8 -*- 3 __author__ = 'gmk' 4 5 im

使用python模拟用户登录

说明 模拟用户登陆 1.判断用户名是否输入超过3 输入超过三次后给出提示退出 2.输入用户名和密码判断是否输入正确 输入正确用户名或密码 提示登录成功 输入错误用户名或密码 提示用户名或密码错误,请重新输入并返回判断用户名是否输入超过3次 user_info = { "kira":"123", "jack":"456", "lucy":"789", "lilei":&

python案例-用户登录

要求: •输入用户名密码 •认证成功后显示欢迎信息 •输错三次后锁定 1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 4 """ 5 用户登陆功能实例 6 1.获取db文件中所有的用户信息 7 2.比较用户信息 8 如果用户名不存在,则直接退出 9 如果用户名存在 10 检测密码,如果密码存在,则提示登陆成功,并将登陆错误次数重置为 0 ,修改内存中的字典中记录的登陆错误次数.(并写入文件) 11 如果密码不存在 12 修

Python 编写用户登录接口

附有流程图可以看一看,第一次画会慢慢改进的. 代码如下: 1.User    用户名存储文件 王二  123 张三    1234 李四    123456 2.Lock_User    被锁用户文件 3. Land.py    主程序文件 sys i=i<:     ()     account = ()  /用户账户输入     Lock_list = (,)           /打开加锁文件(读写方式)     Lock_user = Lock_list.readlines()     

Python判断用户登录状态,并返回结果

username = "Anker" passward = "Abc123" number =2 for i in range(1,4,1): _username = input("username:") _passward = input("passward:") if _username==username and _passward==passward: print("登录成功") break els