解决不断更新的csv文件到Mysql数据库的转存,(解决Kiwi转存数据库问题)

不断更新的csv文件到Mysql数据库转存代码

配置Kiwi(不用Kiwi的小伙伴可自行跳过)

不断更新的csv文件到Mysql数据库转存代码

先说核心思路: 由于csv文件是不断更新的所以我们要设置一个游标,在这里我利用了一个txt文件,第一次读取的时候进行检测,没有就创建一个新的txt文件,并将已读行数设置为0。之后在进行读取文件的时候利用pands的skiprows参数进行跳过。

//这里我们利用cl参数也就是记录的已读代码行数来传参数,表示跳过多少行。
        df = pd.read_csv(r'文件位置+文件名.csv', skiprows=int(cl),
                         header=None,
                         encoding='gb18030',error_bad_lines=False)

读取数据部分最底下有,在说一下游标的写入,也同样是个txt文本文件,这样能长久保存,每次写的时候选w参数这样能够直接覆盖掉之前的数据。 下面展示一些 内联代码片。

file2 = open(r'文本文件', 'w')

当然我知道这样并不能完全实现自动化,所以还需要利用进程或线程来解决。

下面展示 全部代码。

import pandas as pd
import datetime
import sqlalchemy


# 读取数据当前已经读了多少数据
def countline():
    # Python获取系统日期
    data = datetime.datetime.now()
    data = data.strftime('%Y-%m-%d')

    # 判断文件是否存在
    try:
        file1 = open(r'D:\graduation project\kiwisyslog\Syslogd\Logs\NewSyslogCatchAll-' + data + '-cl.txt', 'r')
        print("文件存在,不需要创建")
    except:
        print('文件不存在创建一个新的文件')
        file1 = open(r'D:\graduation project\kiwisyslog\Syslogd\Logs\NewSyslogCatchAll-' + data + '-cl.txt', 'w+')

    countline = str(file1.read())
    file1.close()
    if countline == '':
        countline = 0
    print(countline)
    return countline


# 读法有点粗暴,改用pands来读取数据
# with open('C:/Users/nuo/Desktop/shiyan/log/SyslogCatchAll-2022-10-24_1.csv')as f:
#     f_csv = csv.reader(f)
#     for row in f_csv:
#         print(row)

def cvs_to_mysql():
    # Python获取系统日期
    data = datetime.datetime.now()
    data = data.strftime('%Y-%m-%d')

    cl = countline()#获取当前已经读到的行数

    try:#这里加try是为了避免没有新的日志出现的时候报错,skiprows跳过全部行后报错。
        df = pd.read_csv(r'D:\graduation project\kiwisyslog\Syslogd\Logs\NewSyslogCatchAll-' + data + '.csv', skiprows=int(cl),
                         header=None,
                         encoding='gb18030',error_bad_lines=False)
        a = len(df)
        b = int(cl) + a
        writeline(b)
        print(cl)
        print(df)

        #con 参数为数据库的连接,这里不能用pymysql,pymysql只会傻傻 的一行一行写。可以用sqlalchemy,它能把一整个DataFrame一把梭哈掉。
        #if_exists 参数判断是否有重复表名,该参数有3个值:fail表示如果表名重复则不写入,replace表示如果表名重复覆盖原表,append表示追加写入。
        #engine = sqlalchemy.create_engine("mysql+pymysql://root:******@localhost:3306/数据库名?charset=utf8")
        # df.to_sql(name='表名', con=engine, if_exists='replace', index=True)

        engine = sqlalchemy.create_engine("mysql+pymysql://root:admin@localhost:3306/syslog?charset=utf8")
        df.columns = ['Date','Time','Priority','Hostname','MsgText']
        df.to_sql(name='syslogd6', con=engine, if_exists='append', index=False)

    except:
        print('当前日志已经全部被读取')



def writeline(countline):
    # Python获取系统日期
    data = datetime.datetime.now()
    data = data.strftime('%Y-%m-%d')
    file2 = open(r'D:\graduation project\kiwisyslog\Syslogd\Logs\NewSyslogCatchAll-' + data + '-cl.txt', 'w')

    file2.write(str(countline))
    file2.close()

cvs_to_mysql()

配置Kiwi(不用Kiwi的小伙伴可自行跳过)

本意是希望通过Kiwi直接将日志转存到数据库中,但是在和逗老师交流过程中发现该功能是付费功能,遂决定自己编写代码来实现该功能。 同时也解决了txt到数据库的转存问题。

在setup中添加一个new action选择log to file ,我在这里把最后的文件后缀改成了.csv。这样就可以生成csv文件了,格式format部分可以自行设定或选择后面带csv的,这里我自己定义了一个。

mysql 保存数据比较慢_mysql

这里我在Formatting里面的Custom file formats 添加了一个自己定义的format,大家可以自己按需选取想要的日志内容,Field delimiter记得选Comma Space。

mysql 保存数据比较慢_mysql_02