python多线程写日志_python 多线程日志切割+日志分析

楼主最近刚刚接触python,还是个小菜鸟,没有学习python之前可以说楼主的shell已经算是可以了,但用shell很多东西实现起来还是不可能的事情,例如最明显的一点大日志分析,由于楼主的公司,每天的日志量很大,用shell分析的会非常非常的慢。

通过学习python,楼主有了一种想法,想法如下

可不可以分割日志,把日志分割成很多的小块,利用多线程去分析日志,这个难点在哪,难点就在如何去分割日志,前几篇文件楼主写过日志分割的python版,但是存在很大的弊端,只能够针对小日志进行分割,因为上一篇是把日志先写到列表中,大家都知道列表时要站内存的,那如果说日志很大,岂不一下就把内存吃满了。废话就不多说了,楼主来阐明下如何解决此问题

首先创建一个文本,文本内容如下

1

2

3

1000

1.计算出文本一行的大小比如说是4B

2.用服务器的总内存数除以4B 计算出我的服务器可以一次性分析多大的文件,这个数就是我一个文本应该为多少行,也就是说我切割的日志,一个文件是多少行

下面奉献出日志切割的脚本

#!/usr/bin/python

from time import ctime

def splitFile(fileLocation, targetFoler):

file_handler = open(fileLocation, ‘r’)

block_size = 100   (为我每个文件的行数)

line = file_handler.readline()

temp = []

countFile = 1

while line:

for i in range(block_size):

if i == (block_size-1):

# write block to small files

file_writer = open(targetFoler + “file_”+str(countFile)+”.txt”, ‘a+’)

file_writer.writelines(temp)

file_writer.close()

temp = []

print ”  file ” + str(countFile) + ” generated at: ” + str(ctime())

countFile = countFile + 1

else:

temp.append(file_handler.readline())

if countFile == 11:

break;

file_handler.close()

if __name__ == ‘__main__’:

print “Start At: ” + str(ctime())

splitFile(“/home/python/test.txt”, “/tmp/”)

分割完日志后,下面就该进行日志分析了

脚本如下

#!/usr/bin/python

import os

import re

import threading

def chaFile(path):

a=os.listdir(path)

for i in range(len(a)):

b=a[i]

c=open(“/home/python/rizhifenge.txt”,”a+”)

kk=”\n”+b

c.writelines(kk)

c.close()

d=open(“/home/python/rizhifenge.txt”,”r”)

f=d.read()

e=re.findall(“file.*”,f)

return e

d.close()

def chaZhao(path):

aa=open(path,”r+”)

bb=aa.read()

cc=re.search(“\d.”,bb)

if cc:

print cc.group()

aa.close()

if __name__ == “__main__”:

ff=”/tmp/”

for i in chaFile(ff):

gg=ff+i

a=threading.Thread(target=chaZhao,args=(gg,))

a.start()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一份基于Python的socket通信代码,可以用于聊天,并支持多线程处理、记录日志和成熟的登录系统。以下是代码: ``` import socket import threading import logging logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(message)s') class ClientHandler(threading.Thread): def __init__(self, client_socket, client_address): threading.Thread.__init__(self) self.client_socket = client_socket self.client_address = client_address self.username = None def run(self): logging.debug(f"Connection from {self.client_address} has been established.") self.login() self.chat() self.client_socket.close() logging.debug(f"Connection from {self.client_address} has been closed.") def login(self): while True: self.client_socket.send(bytes("Please enter your username: ", "utf-8")) self.username = self.client_socket.recv(1024).decode("utf-8").strip() if self.username: logging.debug(f"{self.client_address} has logged in as {self.username}.") self.client_socket.send(bytes(f"Welcome, {self.username}!", "utf-8")) break else: self.client_socket.send(bytes("Invalid username, please try again.", "utf-8")) def chat(self): while True: try: message = self.client_socket.recv(1024).decode("utf-8").strip() except: break if message == "/quit": break logging.debug(f"{self.username}: {message}") for handler in handlers: if handler != self: try: handler.client_socket.send(bytes(f"{self.username}: {message}", "utf-8")) except: handlers.remove(handler) logging.debug(f"{self.client_address} has left the chat.") if __name__ == "__main__": handlers = [] server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.bind(('localhost', 8080)) server_socket.listen(5) logging.debug("Server is listening on port 8080.") while True: client_socket, client_address = server_socket.accept() handler = ClientHandler(client_socket, client_address) handler.start() handlers.append(handler) ``` 在这份代码中,我们定义了一个`ClientHandler`类,它继承自Python的`threading.Thread`类,因此可以用于多线程处理。每当有一个新的客户端连接时,我们会创建一个`ClientHandler`对象,并将其加入到`handlers`数组中。 在`ClientHandler`类中,我们定义了`login`和`chat`方法,用于处理登录和聊天的逻辑。在登录过程中,我们要求用户输入用户名,并将其存储到`ClientHandler`对象的`username`属性中。在聊天过程中,我们通过`handler.client_socket.send()`方法将消息发送给其他客户端。 在主程序中,我们创建了一个`server_socket`对象,并在端口8080上进行监听。每当有新的客户端连接时,我们创建一个`ClientHandler`对象,并将其加入到`handlers`数组中。 在这份代码中,我们还使用了Python的`logging`模块来记录日志。我们可以通过设置`logging.basicConfig()`的参数来控制日志的级别和格式。在这份代码中,我们将日志级别设置为DEBUG,并用时间戳和消息文本来格式化日志信息。 这份代码还包括一个成熟的登录系统。在登录过程中,我们要求用户输入用户名,并将其存储到`ClientHandler`对象的`username`属性中。如果用户名无效,我们会提示用户重新输入。如果用户名有效,我们会向客户端发送欢迎消息,并将其加入到聊天室中。 总之,这是一份基于Python的socket通信代码,可以用于聊天,并支持多线程处理、记录日志和成熟的登录系统。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值