python 将增量文件日志存入数据库

python操作日志保存到数据库 文章目录 项目中日志持久化一般是保存到文件,但是这种方式下如果对日志进行查找、聚合、统计等操作不太方便,当然大项目可以采用ELK,但是一些小项目可能直接存到数据库就足够了,基于此,笔者开发了log2db 项目,开源地址在: github,项目比较简单,因为日志写入可能比较频繁,因此选用了消息队列用于非阻塞式写入,对代码运行效率影响最小化,如果觉得好用的话不妨给个 star。 安装方式: git clone https://github.com/xiaodongxiexie/log2db pip instal 阅读详情

    我们在操作数据的时候经常遇到这样的情况,需要对一些产生环境的日志数据进行分析,而某些大公司的朋友,经常没有服务器的管理权限,因此,我们就需要将数据自动导入的mysql中,本内容就是基于。

文章重点:

1 日志文件按行读取,防止日志数据过大,操作时使用行读取,不占用内存空间

2 数据库使用长链接,进行写操作,mysql的长连接文章在我们的“python mysql 长连接一篇有写到” 【http://blog.youkuaiyun.com/wzm112/article/details/7745835】

3 日志数据统一归并到一个日志目录下,由于我在实际生产环境中使用log作为日志目录这里不做调整

4 在指定数据库中自动创建和日志文件相同的表名,自动进行数据导入工作,当然可以进行自己的改进,做成规则,根据你定义的规则进行导入,比如某个或某几个后缀的文件进行导入,数据存储的方式这些都可以事先定义成规则。

5 对增量日志,从增量点开始读取,记录增量位置是文件名.seek的文件

6 定时删除任务,每晚三点(根据log.time中的时间来操作)删除日志中的日志文件(txt)和文件名.seek(统计读到的文件位置)

7 整个操作基本都是基于文件,这里操作的日志文件后缀都为txt,各人可根据各人情况进行调整

8 执行方式,将此文件作为守护进程,使用nohup 方式,在服务器上挂起

#!/usr/bin/env python
#coding=utf-8
import os,sys,time,traceback
from libs.mysql import mysql
from libs.config import _config #调用配置文件,配置文件解析类
reload(sys)
sys.setdefaultencoding('utf8')
class read_log:
    def __init__ (self):
        self.dir_path    = os.path.dirname(os.path.dirname(os.path.dirname(__file__))) #找到项目的根目录
        self.logDbConfig =_config['db_config']    #读取数据库配置
        self.logDb       = None
        self.get_log_conn()                       #连接数据库
        pass

    def get_log_conn (self):
        host        = self.logDbConfig['host']
        user        = self.logDbConfig['user']
        passwd      = self.logDbConfig['passwd']
        db          = self.logDbConfig['db']
        self.logDb  = mysql(host, user, passwd, db)


    def write_time_log (self,itime = 0): #写入当前时间
        f = open(os.path.join(self.dir_path,'log_time_log.time'),'w')
        f.write(str(itime))
        f.close()

    def read_time_log (self):            #读出时间
        #return int(time.strftime('%H',time.localtime(time.time())))
        _f_name = os.path.join(self.dir_path,'log_time_log.time')
        if os.path.exists(_f_name):
            f = open(_f_name,'r')
            result = f.read()
            f.close()
            if result: return long(result)
        return 0

    def delete_txt_file (self):       #删除txt后缀的日志文件和txt.seek的后缀文件
        for filename in self.read_dir():
            idir  = '%s/log' % self.dir_path
            fname = '%s/%s' % (idir,filename)
            try:
                os.remove(fname)
                os.remove('%s.%s' % (fname,'seek'))
            except:
                pass

    def run (self):  #主执行程序
        while True:
            self.read_file_content() #将日志写入数据库
            if self.read_time_log()==0 and int(time.strftime('%H',time.localtime(time.time())))==3: #每晚3点进行日志清理
                self.delete_txt_file()
                self.write_time_log(int(time.time()))
            elif int(time.strftime('%H',time.localtime(time.time())))==3 and time.strftime('%Y%m%d',time.localtime(time.time())) != time.strftime('%Y%m%d',time.localtime(self.read_time_log())) :
                self.delete_txt_file()
                self.write_time_log(int(time.time()))
            time.sleep(60) #程序循环操作,每隔1分钟循环一次,时间根据自己情况而定


    def create_table (self,table_name = ''):   #创建日志写入的表结构
        if table_name:
            sql = '''
                CREATE TABLE IF NOT EXISTS `log_%s` (
                  `id` int(11) NOT NULL AUTO_INCREMENT,
                  `task_id` varchar(30) NOT NULL DEFAULT '0',
                  `entid` varchar(20) NOT NULL DEFAULT '0',
                  `source` varchar(20) NOT NULL DEFAULT '0',
                  `data` longtext NOT NULL,
                  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
                  PRIMARY KEY (`id`)
                ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1
            ''' % table_name
            self.logDb.query(sql)

    def write_seek (self,filename = '',seek = 0): #写入当前的seek位置
        f = open(os.path.join(self.dir_path,'%s.seek' % filename ),'w')
        f.write(str(seek))
        f.close()

    def read_seek (self,filename = '',seek = 0):  #读取文件的seek位置
        _f_name = os.path.join(self.dir_path,'%s.seek' % filename )
        if os.path.exists(_f_name):
            f = open(_f_name,'r')
            result = f.read()
            f.close()
            if result: return long(result)
        return 0

    def read_dir (self):    #读取日志目录的包含.txt后缀的不包含seek的文件
        print self.dir_path
        idir  = '%s/log' % self.dir_path
        print idir
        return [ row for row in os.listdir(idir) if '.txt' in row and 'seek' not in row ]

    def read_file_content (self): #将所有符合规则的文件读到对应的数据库
        for filename in self.read_dir():
            idir  = '%s/log' % self.dir_path
            fname = '%s/%s' % (idir,filename)
            if len(filename)>4: 
                table_name = filename[:-4]
                self.create_table(table_name)         #create table
                self._read_content(fname,table_name)  #read file name

    def _read_content (self,filename = '',table =''): #子方法,读取单个文件,单个行写入数据库
        file_seek = self.read_seek(filename)
        f = open(filename,'r')
        f.seek(file_seek) #找到上次读完的seek文件,从此位置继续往下读写
        while True:
            _row = f.readline()    #单行,循环
            file_seek +=len(_row)  #计算seek位置
            self.write_seek(filename,file_seek) #保持新的seek位置
            
            result_row = ''
            try:
                if _row.find('{')==0:  #查找符合条件的字典数据,这个根据自己情况,如果自己的日志内容根据固定可不需要校验
                    result_row = eval(_row) #字符转字典
                    task_id = result_row.get('msgId','')
                    entid   = result_row.get('entId','')
                    source  = result_row.get('source','')
                    data    = _row.replace("\\","\\\\").replace("'","\\'")
                    sql = "INSERT INTO  `log_%s` (`task_id` ,`entid` ,`source` ,`data` ) VALUES ('%s',  '%s',  '%s', '%s')" % (table,task_id,entid,source,data)
                    self.logDb.query(sql)
            except:
                pass
            if not _row: break
        f.close()

_read_log = read_log()
if __name__=='__main__':
    _read_log.run()


mysql增量同步oracle_利用kettle实现oracle到mysql数据库增量同步方案(自创) 近期涉及一个BI项目初期阶段,构建数据仓库时遇到很多问题,主要问题,来源已下几个方面:html1 不一样业务数据放在不一样类型的数据库(oracle和mysql的,excel等等)。python2 源端数据库种类不一样,表结构建立语句与设计不一,致使很差同步问题。mysql3 源端数据库只提供只读状态,没法对源端作起停和写操做。sql4 源数据库中没有定义和更新时间字段没法作到增量同步。数据库因而... 阅读详情

相关推荐

如何在 PostgreSQL 中实现数据的增量备份和恢复?

增量备份是基于上次备份(全量备份或增量备份)以来发生的数据更改进行的备份。这意味着每次增量备份只包含自上次备份以来新插入、更新或删除的数据。 在 PostgreSQL 中,可以通过以下几种方式来实现增量备份: 1. 基于时间点的备份:利用 PostgreSQL 的 WAL(Write-Ahead Logging)日志,根据特定的时间点来提取后续的 WAL 日志进行备份。 2. 基于事务 ID 的备份:通过跟踪事务的 ID,确定自上次备份以来的新事务,并备份相关数据和 WAL 日志

技术笔记 3160

python将日志导入数据库代码案例

(1) #!/usr/bin/env python #-*-coding:utf-8-*- import MySQLdb import os, sys, re,string import time, tarfile,getopt optmap = {                 'dbuser' : 'haoren',

chengxuyuanyonghu的专栏 1975

【python日记】binlog日志解析并关键信息入库操作

# -*- coding: utf-8 -*- # author:xiaoming time:2020/4/22 import re from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, String,...

weixin_42686604的博客 795

Python将日志写入MySQL数据库

今天开发需求:把某个日志里面的内容写入数据库存储,方便调阅。 日志类型,每天会生成一个,里面有6个字段: 第一个字段是时间,但是只有时分秒(xx:xx:xx) 第二个字段和第三个字段还有第五个字段只是个简单的数字id 第四个字段是名称 第六个字段是注释,写的比较多字段较长 日志每个字段有 | 符号隔开 接到需求后,首先决定用Python的split()函数做每列的切割 lists=line.split('|') 每个字段直接用lists[0] , lists[1]lists[2].

weixin_47237662的博客 4061

MySQL增量备份到S3

MySQL增量备份 https://github.com/zonezoen/MySQL_backup https://blog.youkuaiyun.com/qq_29142107/article/details/89766297 https://blog.youkuaiyun.com/zone_/article/details/81321431 https://www.cnblogs.com/kevingrace...

Ch_Chenjs的博客 1318

利用Python进行数据备份与恢复数据库与文件系统的策略

利用Python进行数据备份与恢复是一种常见的做法。对于数据库,你可以使用Python中的数据库连接库(如sqlite3、SQLAlchemy等)连接到数据库,然后执行备份操作,将数据库的内容保存到一个备份文件中。对于文件系统,你可以使用Python的os和shutil模块来复制文件和目录,实现文件系统的备份。备份时,通常需要考虑备份的频率、存储位置、数据压缩和加密等问题。在恢复数据时,你可以编写Python脚本来自动化恢复过程,以便在需要时快速恢复数据。定期测试备份数据的完整性和可恢复性也是很重要的。

BASK2312的博客 1161

python3利用pyinotify实现把日志实时写入数据库或用于监控error告警

安装库pyinotify pip3 install pyinotify 先使用pyinotify实现一个tail -f 的功能:(来来实时提取日志)``` import pyinotify import time import os import sys class ProcessTransientFile(pyinotify.ProcessEvent): def process_...

打卤的博客 2730

Python实时获取日志增量数据demo

python获取日志文件增量信息的完整代码,有详细的注释说明。

python访问数据库日志文件_python利用inotify实现把nginx日志实时写入数据库

利用了pyinotify库,我用的是这里的这个,外链网址已屏蔽其实网上yum上也有pyinotify库可以安装。写入数据库是pymysql这里做一下记录,先务pyinotify实现一个tail -f 的功能:#!/opt/python3/bin/python3#import pyinotifyimport timeimport osimport sysclass ProcessTransientF...

weixin_39960503的博客 380

Python多线程超大日志文件解析转储写入mysql/postgresql

Python多线程超大日志文件解析转储,实现几十G超大文件并发处理。 实现功能如下: 1.多线程分块解析某超大日志文件,实现超大文件多线程分块处理 2.多线程写入数据到数据库postgresql/mysql 3.线程之间通过队列queue通讯 4.出错消息通过logging写日志 @author: ray ----------web日志格式如下----------------- 21.106.138.118 - - [02/Mar/2015:16:27:22 +0800] "GET / HTTP/1.1" 200 53 21.106.138.118 - - [02/Mar/2015:16:27:22 +0800] "GET /login.jsp HTTP/1.1" 200 5464 21.106.138.118 - - [02/Mar/2015:16:27:22 +0800] "GET /CMFKMProject/KMProjectWeb/KMProWeb_Css/CM.css HTTP/1.1" 200 5941

LiveKit 本地部署实战:从零搭建安全实时通信环境(Caddy+HTTPS)

本文详细介绍了如何从零开始搭建LiveKit本地部署环境,结合Caddy服务器实现HTTPS安全通信。通过环境准备、证书生成、服务配置到前端客户端集成的完整流程,帮助开发者快速构建实时音视频应用,特别适合需要安全实时通信的场景。

weixin_29227585的博客 675

Python 分析Nginx 日志并存入MySQL数据库(单线程)

使用Python 分析Nginx access 日志,根据Nginx日志格式进行分割并存入MySQL数据库。(参考网上一些文章) Nginx access日志格式如下: #使用的nginx默认日志格式$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent ...

weixin_33831196的博客 316

ArcGIS-裁剪遥感影像及dem图像

6、选择【工具箱】-【数据管理工具】-【栅格】-【裁剪】。在【输入栅格】里选择要裁剪的dem,在【输出范围】里选择刚创建的裁剪范围。选择一个输出路径,其他参数保存默认。2、起一个名称,要素类型选择【面】。点击【编辑】选择与要裁剪的dem一致的地理坐标系。1、创建需要裁剪区域的面层shp,右击选择【新建】-【shapefile】3、点击编辑器,选择开始编辑。4、选择【裁剪范围】,点击确定。5、画出想要裁剪的范围并保存。

siwenaiyou的博客 1万+

python增量更新数据_datax增量更新

前言:最近一直在做datax的增量更新,算是对datax有了一点新的认识吧。因为公司需要以greenplum为核心来搭建自己的数仓平台,以满足业务上的多维快速查询(以前多维查询用到是kylin,但随着数据量的增加,kylin越来越难以满足我们的需求了)。然而,greenplum的数据导入方面并不是很友好,通常,需要使用copy或者是gpfdist才能快速的往GP里面导入数据。我们试了kettle来...

weixin_39747755的博客 1553

cst-python联合仿真的问题解决

cst与python联合仿真出现无法调用CST的问题解决

ayihu_的博客 2370

同一台电脑使用模拟ModbusTcp主从通讯的时候,Wireshark抓取不到包

在使用ModBus Slave和Poll模拟主从通讯的时候,发现Wireshark怎么都抓取不到包怎么排查和解决?

HUJIANGMING的博客 703

mongo数据增量备份php,python mongodb增量备份脚本

python mongodb增量备份脚本首先,需要搭建mongodb副本集,才能进行增量备份,此过程略过本人的构想是每天进行一次备份,这次备份是全量备份还是增量备份取决于最后一次全量备份的时间节点的日志是否已被覆盖(因为oplog的大小是有上限的,所以新的操作会覆盖旧的),如果已被覆盖,则进行全量备份,否则从该时间节点开始进行增量备份。为了方便,每次全量备份完成后会将oplog.bson放到固定的...

weixin_35245427的博客 319

告别手动打卡:逍遥模拟器+宥马运动自动跑步脚本配置全流程

本文详细介绍了如何利用逍遥模拟器和自动化脚本实现宥马运动的自动跑步功能,告别手动打卡的繁琐。从环境准备、脚本部署到定位配置和智能调度,全流程指导用户完成自动化设置,提升效率并确保运动数据的真实性。

weixin_42532473的博客 537

3步快速上手Whale:打造智能数据仓库元数据管理系统的终极指南

Whale是一款专为数据工程师设计的轻量级CLI工作空间,它通过自动化ETL工作流简化了数据仓库的元数据管理过程。这个开源项目让您能够轻松地从各种数据源提取表结构、列信息和注释等元数据,并将其转换为可搜索、可编辑的Markdown文件,为团队提供统一的数据目录管理方案。 ## 🚀 为什么选择Whale进行数据管理? 在当今数据驱动的时代,元数据管理已成为数据团队面临的核心挑战之一。Whale

gitblog_01047的博客 935

手把手安装GNN必备库 —— pytorch_geometric

PyG全称是Pytorch Geometric,它是一个基于Pytorch构建的库,可以帮助用户快速构建和训练自己的图神经网络模型。PyG中实现了很多先进(state of the art)的GNN模块,例如GCN、GraphSage、GAT、SGC、GIN等等。此外,PyG中还包含了大量的benchmark图数据集、丰富的图数据操作方法、支持多GPU。

m0_51339444的博客 2380

AI快速变现之路,AI视频创作

初期投入$3000(工具订阅+样片制作),重点攻克跨境电商和本地生活服务市场。关注2025年AIGC视频工具的API降价趋势(如Pika企业版折扣可达50%),建议与云服务商签订长期合作协议。

qq_29896351的博客 1981

python 本地数据库增量到云数据库_Python 生产环境MySQL数据库增量备份脚本

标签:MySQL数据库常用的办法是通过MySQLdump导出sql进行备份,但是不适合数据量很大的数据库,速度,锁表是两个严重的问题。前面写了一遍文章介绍xtrabackup的热备工具,见http://www.linuxidc.com/Linux/2015-02/113058.htm。下面的脚本是基于xtrabackup实现自动备份数据库的功能。需求描述:每天晚上23点,对数据库进行一次完整备份...

weixin_39889788的博客 96

手把手教你学Simulink--基于Simulink的机械臂工业装配任务仿真建模

特点高精度要求:装配过程通常需要非常高的位置精度。多步骤操作:一个完整的装配任务可能包含多个连续的子任务,如抓取零件、移动到特定位置、装配等。动态环境:工作环境可能是动态变化的,例如其他机器人或人员在同一空间内工作。挑战复杂性管理:需要处理复杂的运动学和动力学问题,以及可能的碰撞避免。实时性:某些应用场景下需要快速响应以保证生产效率。集成度:需要与其他系统(如传感器、PLC等)无缝集成。首先明确要模拟的装配任务内容。零件的位置和尺寸。装配顺序。

MHD0815的博客 239

datax增量更新

前言: 最近一直在做datax的增量更新,算是对datax有了一点新的认识吧。 因为公司需要以greenplum为核心来搭建自己的数仓平台,以满足业务上的多维快速查询(以前多维查询用到是kylin,但随着数据量的增加,kylin越来越难以满足我们的需求了)。 然而,greenplum的数据导入方面并不是很友好,通常,需要使用copy或者是gpfdist才能快速的往GP里面导入数据。...

weixin_30621919的博客 6046

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

数据仓库的数据库容错与自动恢复:实现高可用性的关键技术

1.背景介绍 数据仓库是一种用于存储和管理大量历史数据的系统,它广泛应用于企业、政府和组织等各个领域。数据仓库的数据库容错与自动恢复是实现高可用性的关键技术,因为在数据仓库中,数据量巨大,业务关键性强,故障可能导致严重后果。因此,了解数据仓库的数据库容错与自动恢复技术是非常重要的。 在这篇文章中,我们将从以下几个方面进行阐述: 背景介绍 核心概念与联系 核心算法原理和具体操作步骤以及数学模...

AI天才研究院 850

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Python3增量备份目录中的文件(读取文件修改时间方式)

## V 1.0 ## 增量备份目录中的文件 ## 当文件修改时间改变时备份文件 ## 忽略被删除的文件 ## 文件重命名作为新增文件处理

PanDD_0_1的博客 582

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

上一篇: python mysql使用持久链接
下一篇: python的PEXPECT模块进行交换机配置文件的自动备份
wzm112
博客等级 码龄19年 47粉丝 96原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值