一个python的网络日志系统
2008-11-15 23:50
435 查看
服务器端的代码就是在python的官方文档上摘的,只是将日志的配置方式改为从文件读取。
服务器端LogServer.py代码
#coding:utf-8
import cPickle
import logging
import logging.handlers
import SocketServer
import struct
import logging.config
class LogRecordStreamHandler(SocketServer.StreamRequestHandler):
"""Handler for a streaming logging request.
This basically logs the record using whatever logging policy is
configured locally.
"""
def handle(self):
"""
Handle multiple requests - each expected to be a 4-byte length,
followed by the LogRecord in pickle format. Logs the record
according to whatever policy is configured locally.
"""
while 1:
chunk = self.connection.recv(4)
if len(chunk) < 4:
break
slen = struct.unpack(">L", chunk)[0]
chunk = self.connection.recv(slen)
while len(chunk) < slen:
chunk = chunk + self.connection.recv(slen - len(chunk))
obj = self.unPickle(chunk)
record = logging.makeLogRecord(obj)
self.handleLogRecord(record)
def unPickle(self, data):
return cPickle.loads(data)
def handleLogRecord(self, record):
# if a name is specified, we use the named logger rather than the one
# implied by the record.
if self.server.logname is not None:
name = self.server.logname
else:
name = record.name
logger = logging.getLogger(name)
# N.B. EVERY record gets logged. This is because Logger.handle
# is normally called AFTER logger-level filtering. If you want
# to do filtering, do it at the client end to save wasting
# cycles and network bandwidth!
logger.handle(record)
class LogRecordSocketReceiver(SocketServer.ThreadingTCPServer):
"""simple TCP socket-based logging receiver suitable for testing.
"""
allow_reuse_address = 1
def __init__(self, host='localhost',
port=logging.handlers.DEFAULT_TCP_LOGGING_PORT,
handler=LogRecordStreamHandler):
SocketServer.ThreadingTCPServer.__init__(self, (host, port), handler)
self.abort = 0
self.timeout = 1
self.logname = None
def serve_until_stopped(self):
import select
abort = 0
while not abort:
rd, wr, ex = select.select([self.socket.fileno()],
[], [],
self.timeout)
if rd:
self.handle_request()
abort = self.abort
def main():
logging.config.fileConfig('log.conf') #通过配置文件来读取日志的配置
tcpserver = LogRecordSocketReceiver()
print "About to start TCP server..."
tcpserver.serve_until_stopped()
if __name__ == "__main__":
main()
客户端LogClient.py直接根据传过来的日志名来生成日志
#coding:utf-8
import logging, logging.handlers
def getLogger( loggerName ):
logger = logging.getLogger( loggerName )
logger.setLevel(logging.DEBUG)
socketHandler = logging.handlers.SocketHandler('localhost',/
logging.handlers.DEFAULT_TCP_LOGGING_PORT)
logger.addHandler(socketHandler)
return logger
def setLevel( loggerName,level ):
logger = logging.getLogger( "loggerName" )
logger.setLevel( level )
下面是对python客户端的进一步封装,这样就更加方便对日志的使用
LogFunc.py
#coding:utf-8
import LogClient
logger = LogClient.getLogger("pgt")
def LogDebug(msg):
logger.debug(msg)
def LogInfo(msg):
logger.info(msg)
def LogWarn(msg):
logger.warn(msg)
def LogError(msg):
logger.error(msg)
def LogFatal(msg):
logger.fatal(msg)
整个日志系统,服务器端的.py文件通过循环不断的接收和处理来自客户端的请求。
客户端通过一个SocketHandler与服务器端通讯。整个系统中服务器端和客户端可以部署在不同的机器上,记录的日志放在服务器端(可在服务器上的配置文件中指定日志文件存放的路径)。
LogFunc.py文件是客户端的进一步封装。方便了整个日志系统的使用。这样只要在要写的python文件中import了LogFunc,然后调用相关的LogInfo等函数就可以记录日志了。
服务器端LogServer.py代码
#coding:utf-8
import cPickle
import logging
import logging.handlers
import SocketServer
import struct
import logging.config
class LogRecordStreamHandler(SocketServer.StreamRequestHandler):
"""Handler for a streaming logging request.
This basically logs the record using whatever logging policy is
configured locally.
"""
def handle(self):
"""
Handle multiple requests - each expected to be a 4-byte length,
followed by the LogRecord in pickle format. Logs the record
according to whatever policy is configured locally.
"""
while 1:
chunk = self.connection.recv(4)
if len(chunk) < 4:
break
slen = struct.unpack(">L", chunk)[0]
chunk = self.connection.recv(slen)
while len(chunk) < slen:
chunk = chunk + self.connection.recv(slen - len(chunk))
obj = self.unPickle(chunk)
record = logging.makeLogRecord(obj)
self.handleLogRecord(record)
def unPickle(self, data):
return cPickle.loads(data)
def handleLogRecord(self, record):
# if a name is specified, we use the named logger rather than the one
# implied by the record.
if self.server.logname is not None:
name = self.server.logname
else:
name = record.name
logger = logging.getLogger(name)
# N.B. EVERY record gets logged. This is because Logger.handle
# is normally called AFTER logger-level filtering. If you want
# to do filtering, do it at the client end to save wasting
# cycles and network bandwidth!
logger.handle(record)
class LogRecordSocketReceiver(SocketServer.ThreadingTCPServer):
"""simple TCP socket-based logging receiver suitable for testing.
"""
allow_reuse_address = 1
def __init__(self, host='localhost',
port=logging.handlers.DEFAULT_TCP_LOGGING_PORT,
handler=LogRecordStreamHandler):
SocketServer.ThreadingTCPServer.__init__(self, (host, port), handler)
self.abort = 0
self.timeout = 1
self.logname = None
def serve_until_stopped(self):
import select
abort = 0
while not abort:
rd, wr, ex = select.select([self.socket.fileno()],
[], [],
self.timeout)
if rd:
self.handle_request()
abort = self.abort
def main():
logging.config.fileConfig('log.conf') #通过配置文件来读取日志的配置
tcpserver = LogRecordSocketReceiver()
print "About to start TCP server..."
tcpserver.serve_until_stopped()
if __name__ == "__main__":
main()
客户端LogClient.py直接根据传过来的日志名来生成日志
#coding:utf-8
import logging, logging.handlers
def getLogger( loggerName ):
logger = logging.getLogger( loggerName )
logger.setLevel(logging.DEBUG)
socketHandler = logging.handlers.SocketHandler('localhost',/
logging.handlers.DEFAULT_TCP_LOGGING_PORT)
logger.addHandler(socketHandler)
return logger
def setLevel( loggerName,level ):
logger = logging.getLogger( "loggerName" )
logger.setLevel( level )
下面是对python客户端的进一步封装,这样就更加方便对日志的使用
LogFunc.py
#coding:utf-8
import LogClient
logger = LogClient.getLogger("pgt")
def LogDebug(msg):
logger.debug(msg)
def LogInfo(msg):
logger.info(msg)
def LogWarn(msg):
logger.warn(msg)
def LogError(msg):
logger.error(msg)
def LogFatal(msg):
logger.fatal(msg)
整个日志系统,服务器端的.py文件通过循环不断的接收和处理来自客户端的请求。
客户端通过一个SocketHandler与服务器端通讯。整个系统中服务器端和客户端可以部署在不同的机器上,记录的日志放在服务器端(可在服务器上的配置文件中指定日志文件存放的路径)。
LogFunc.py文件是客户端的进一步封装。方便了整个日志系统的使用。这样只要在要写的python文件中import了LogFunc,然后调用相关的LogInfo等函数就可以记录日志了。
相关文章推荐
- Python:通过自定义系统级快捷键来控制程序开始或停止记录日志(使用小技巧解决一个貌似无解的问题)
- Python:通过自定义系统级快捷键来控制程序开始或停止记录日志(使用小技巧解决一个貌似无解的问题)
- 【C语言】【网络编程】菜鸟学习日志(三) 一个简易B/S系统——Http Server和精简的浏览器
- 使用Node.js + MongoDB实现一个简单的日志分析系统
- 使用Python实现一个小型的航空订票系统(1)
- Demo of use SQL (Insert logs in system resource usage table)使用sql 的一个示例(插入系统使用日志数据)
- paip.提升效率--调试--日志系统日志参数含义---python
- Python-黑客-004 用Python构建一个SSH僵尸网络-02 手动与SSH交互
- python写的一个squid访问日志分析的小程序
- 搭建一个简单的基于web的网络流量监控可视化系统
- 基于Django1.11和Python3开发一个简单的投票系统
- Merlin:一个开源的神经网络语音合成系统
- 分享一个分布式定时任务系统 ( python) - V2EX
- 在系统启动时至少有一个服务或驱动程序产生错误。详细信息,请使用事件查看器查看事件日志
- python学习笔记(日志系统实现)
- 一个基于生产者消费者原理的日志系统
- 一个著名的日志系统是怎么设计出来的?
- Python 实现一个名片管理系统
- 一个用python实现的app 质量保障系统Newton
- Spring Cloud 5分钟搭建教程(附上一个分布式日志系统项目作为参考)