触动精灵远程Log模块
一、功能
lua log方法能够自动发现同一网段下面的log服务器
lua log方法能够主动将log发给服务器
lua 客户端进程重启服务端不存在影响
二、实现
服务器使用python编写:
启动一个线程,用UDP监听特定端口,接受客户端的扫描,反馈日志的端口
启动一个线程,监听特定端口,接受TCP连接,分派新的日志线程处理log
客户端使用lua 编写:
打印log之前使用UDP套节字扫描服务器的日志端口,然后创建TCP套节字发送日志
三、源代码:
服务器:
import socket
import time
import re
import thread udp_listen_port = 31500
tcp_listen_port = 31501
stop_udp_server = False def getLocalIP():
myname = socket.getfqdn(socket.gethostname())
myaddr = socket.gethostbyname(myname)
return myaddr; def getTime():
return time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())) def Log(content):
print("[%s]: %s" % (getTime() ,content)) def startUDPServer(): address = (getLocalIP(), udp_listen_port)
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind(address) print('listen broadcast %s:%s' % address)
Log('listen broadcast %s:%s' % address)
while not stop_udp_server:
data, addr = s.recvfrom(2048)
if not data:
Log("client not existed!")
continue
Log('received %s from %s' % (data, addr)) client_ip_port = '{0}:{1}'.format(addr[0],addr[1]) pat = re.compile("^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}):(\d+)$")
for ip,port in pat.findall(client_ip_port):
Log('Got iphone addr:port = %s %s' % (ip, port))
local_addr_port = (getLocalIP(), tcp_listen_port)
Log('Rsp server addr:port = %s %s' % local_addr_port)
rsp_data = '{0}'.format(local_addr_port[1])
s.sendto(rsp_data,addr)
break; s.close() def startTCPLogServer(sock,client):
while(True): try:
data = sock.recv(4096)
if data:
pat = re.compile('\[(.*?)\]')
for log in pat.findall(data):
Log(log)
else:
break;
except socket.error:
sock.close()
break
Log('client (%s,%s) close' % client);
sock.close() def startTCPListenServer():
#create tcp socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#bind local ip-port
server_addr = (getLocalIP(), tcp_listen_port)
Log('start tcp server on %s port %s' % server_addr)
sock.bind(server_addr)
sock.listen(5) #print recv data
while(True):
ss,addr = sock.accept()
Log('Got log client from (%s,%s)' % addr)
thread.start_new_thread(startTCPLogServer,(ss,addr,))
sock.close() if __name__ == '__main__':
t_udp = thread.start_new_thread(startUDPServer, ())
t_tcp = thread.start_new_thread(startTCPListenServer, ()) while (True):
time.sleep(1)
客户端:
udp_listen_port = tcp_server_ip = ""
tcp_server_port = function getLocalIP()
local socket = require("socket")
local ip, v = socket.dns.toip(socket.dns.gethostname())
for k,v in pairs(v.ip) do
return v
end
return nil
end function tryFindLogServer() local ip = getLocalIP();
local ipTable = {}
local socket = require("socket")
local udp = socket.udp() if ip ~= nil then
for i in string.gmatch(ip, "%d+") do
print(i)
table.insert(ipTable,i)
end
end
local length = table.getn(ipTable)
local findip = nil
local findport = nil
if length > then
for i = , do
local desIP = string.format("%s.%s.%s.%s",ipTable[], ipTable[], ipTable[], tostring(i))
print(desIP)
udp:setpeername(desIP, udp_listen_port)
udp:settimeout(0.5)
udp:send("Hello")
data = udp:receive()
if data ~= nil then
print(string.format("find server %s:%s", desIP,data))
tcp_server_ip = desIP
tcp_server_port = tonumber(data)
return true;
end
end
end
return false
end tcp = nil function Log( content )
-- body
if tcp == nil then
local socket = require("socket")
tcp = socket.tcp()
tcp:connect(tcp_server_ip,tcp_server_port)
end
tcp:send(string.format("[%s]",tostring(content)))
end if tryFindLogServer() then for i = , do
Log("find server")
end end
四、客户端lua中加载luasocket的方式如下:
local sz = require("sz")
local http = require("szocket.http")
local res, code = http.request("http://www.baidu.com");
if code == then
Log("start")
Log(res)
dialog(res,);
Log("end")
end
触动精灵远程Log模块的更多相关文章
- Android架构分析之LOG模块
作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz Android版本:2.3.7_r1 Linux内核版本:android-goldfish-2.6.29 Andro ...
- go: 一个通用log模块的实现
在go里面,虽然有log模块,但是该模块提供的功能并不强,譬如就没有我们常用的level log功能,但是自己实现一个log模块也并不困难. 对于log的level,我们定义如下: const ( L ...
- frp源码剖析-frp中的log模块
前言&引入 一个好的log模块可以帮助我们排错,分析,统计 一般来说log中需要有时间.栈信息(比如说文件名行号等),这些东西一般某些底层log模块已经帮我们做好了.但在业务中还有很多我们需要 ...
- 基于Lua语言的触动精灵脚本开发
工具下载 官网地址 连接模拟器 studio连接 首先要先下载ADB模拟器连接IDE,注意,这里一定要用官网提供的ADB,安卓开发的adb不行!!! 下载好之后,打开studio,输入Access K ...
- 使用Python中的log模块将loss输出到终端与保存到文件
记得之前对深度学习中得loss输出,经常自己会将输出流重新定向到一个文件中, 比如 python main.py > & | tee log.txt 对于caffe这种c++框架而言,用 ...
- Python远程连接模块-Telnet
Python远程连接模块-Telnet 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 虽然现在主流的python版本还是2.7,相信2020年python程序员都会偏向Python ...
- log 模块使用 (直接用的方法)
前情提要: 生活中经常用到log 模块. 但是原生的log 模块复杂或者有许多不好用得地方, 在此记录一个经常用的log 的基本操作方法 一:首先导入模块 import logging.config ...
- Python log 模块介绍
刚用Python log模块写了一个例子,记录一下. import logging import logging.handlers import os from datetime import dat ...
- Go Log模块生成日志文件
使用log模块示例代码: package main import ( "fmt" "time" "log" "os" ) ...
随机推荐
- uoj 55 紫荆花之恋 动态点分治+替罪羊式重构+treap
每插入一个点,直接把它当做重心插入原树,当做是动态点分树一样维护 但这样深度会越来越大,所以我们用类似替罪羊的方法 当树失去平衡时,对子树进行一次点分,保证复杂度 #include <cstdi ...
- spring-事务实现原理
spring事务的实现原理:aop. aop的两种实现方式: 1.动态代理: 事务方法与调用方法不能在同一个类中,否则事务不生效.解决方案,自己注入自己(实质注入的是代理类). 实现方式:jdk动态代 ...
- Python学习笔记——基础篇【第六周】——面向对象
Python之路,Day6 - 面向对象学习 本节内容: 面向对象编程介绍 为什么要用面向对象进行开发? 面向对象的特性:封装.继承.多态 类.方法. 同时可参考链接: http:// ...
- eclipse 安卓运行一直跳转到调试模式
最直接的办法,换手机试试,如果在其他手机上能run,那就重启手机即可 感觉写这么一点点似乎不足以发表一篇博客,给个链接吧:http://www.itnose.net/detail/6103213.ht ...
- unity3d和php后台简单交互--一
unity3d开发时,用PHP作为后台是个不错的选择.对一些数据吞吐量不是很大的游戏,比如某个游戏的排名,登录等等,一般的php程序能够胜任了,并且php语言简单,开发容易对数据库尤其是mysql的支 ...
- THML结构语义化之table/form
以table/form标签语义化,做为博客首贴 应用场景1-table表格 <table> <caption> <thead> <th colspan=&qu ...
- 1张图看懂RAID功能,6张图教会配置服务器【转】
RAID 包含一组或者一个集合甚至一个阵列.使用一组磁盘结合驱动器组成 RAID 阵列或 RAID 集.将至少两个磁盘连接到一个 RAID 控制器,而成为一个逻辑卷,也可以将多个驱动器放在一个组中.一 ...
- 安装arcgis server完成,打开出现未关联错误怎么办
在控制面板,默认程序-将文件类型或协议与程序关联-找到URL(manager右键属性)后缀名的文件双击,选择explorer即可
- Anaconda 安装概要
Anaconda 作为开源项目,集成了Python的大部分第三方包,如:pandas,Numpy,scipy等. 1. 下载地址:https://www.continuum.io/downloads ...
- postgreSQL-如何查数据库表、字段以及字段类型、注释等信息?
之前从网上也搜索了一些关于postgreSQL的系统表含义以及如何查表相关信息,但是都没有一个完整的内容,所以自己将找到的一些内容作了下整合,大家可以根据自己需要再对sql进行调整. --1.查询对象 ...