一个python的网络日志系统

服务器端的代码就是在python的官方文档上摘的,只是将日志的配置方式改为从文件读取。
服务器端LogServer.py代码
  1. #coding:utf-8
  2. import cPickle
  3. import logging
  4. import logging.handlers
  5. import SocketServer
  6. import struct
  7. import logging.config
  8. class LogRecordStreamHandler(SocketServer.StreamRequestHandler):
  9.     """Handler for a streaming logging request.
  10.     This basically logs the record using whatever logging policy is
  11.     configured locally.
  12.     """
  13.     def handle(self):
  14.         """
  15.         Handle multiple requests - each expected to be a 4-byte length,
  16.         followed by the LogRecord in pickle format. Logs the record
  17.         according to whatever policy is configured locally.
  18.         """
  19.         while 1:
  20.             chunk = self.connection.recv(4)
  21.             if len(chunk) < 4:
  22.                 break
  23.             slen = struct.unpack(">L", chunk)[0]
  24.             chunk = self.connection.recv(slen)
  25.             while len(chunk) < slen:
  26.                 chunk = chunk + self.connection.recv(slen - len(chunk))
  27.             obj = self.unPickle(chunk)
  28.             record = logging.makeLogRecord(obj)
  29.             self.handleLogRecord(record)
  30.     def unPickle(self, data):
  31.         return cPickle.loads(data)
  32.     def handleLogRecord(self, record):
  33.         # if a name is specified, we use the named logger rather than the one
  34.         # implied by the record.
  35.         if self.server.logname is not None:
  36.             name = self.server.logname
  37.         else:
  38.             name = record.name
  39.         logger = logging.getLogger(name)
  40.         # N.B. EVERY record gets logged. This is because Logger.handle
  41.         # is normally called AFTER logger-level filtering. If you want
  42.         # to do filtering, do it at the client end to save wasting
  43.         # cycles and network bandwidth!
  44.         logger.handle(record)
  45. class LogRecordSocketReceiver(SocketServer.ThreadingTCPServer):
  46.     """simple TCP socket-based logging receiver suitable for testing.
  47.     """
  48.     allow_reuse_address = 1
  49.     def __init__(self, host='localhost',
  50.                  port=logging.handlers.DEFAULT_TCP_LOGGING_PORT,
  51.                  handler=LogRecordStreamHandler):
  52.         SocketServer.ThreadingTCPServer.__init__(self, (host, port), handler)
  53.         self.abort = 0
  54.         self.timeout = 1
  55.         self.logname = None
  56.     def serve_until_stopped(self):
  57.         import select
  58.         abort = 0
  59.         while not abort:
  60.             rd, wr, ex = select.select([self.socket.fileno()],
  61.                                        [], [],
  62.                                        self.timeout)
  63.             if rd:
  64.                 self.handle_request()
  65.             abort = self.abort
  66. def main():
  67.     logging.config.fileConfig('log.conf')    #通过配置文件来读取日志的配置
  68.     tcpserver = LogRecordSocketReceiver()
  69.     print "About to start TCP server..."
  70.     tcpserver.serve_until_stopped()
  71. if __name__ == "__main__":
  72.     main()
客户端LogClient.py直接根据传过来的日志名来生成日志

  1. #coding:utf-8
  2. import logging, logging.handlers
  3. def getLogger( loggerName ):
  4.     logger = logging.getLogger( loggerName )
  5.     logger.setLevel(logging.DEBUG)
  6.     socketHandler = logging.handlers.SocketHandler('localhost',/
  7.                     logging.handlers.DEFAULT_TCP_LOGGING_PORT)
  8.     logger.addHandler(socketHandler)
  9.     return logger
  10.     
  11. def setLevel( loggerName,level ):
  12.     logger = logging.getLogger( "loggerName" )
  13.     logger.setLevel( level )
下面是对python客户端的进一步封装,这样就更加方便对日志的使用
LogFunc.py
  1. #coding:utf-8
  2. import LogClient
  3. logger = LogClient.getLogger("pgt")
  4. def LogDebug(msg):
  5.     logger.debug(msg)
  6.     
  7. def LogInfo(msg):
  8.     logger.info(msg)
  9.     
  10. def LogWarn(msg):
  11.     logger.warn(msg)
  12.     
  13. def LogError(msg):
  14.     logger.error(msg)
  15.     
  16. def LogFatal(msg):
  17.     logger.fatal(msg)
整个日志系统,服务器端的.py文件通过循环不断的接收和处理来自客户端的请求。
客户端通过一个SocketHandler与服务器端通讯。整个系统中服务器端和客户端可以部署在不同的机器上,记录的日志放在服务器端(可在服务器上的配置文件中指定日志文件存放的路径)。
LogFunc.py文件是客户端的进一步封装。方便了整个日志系统的使用。这样只要在要写的python文件中import了LogFunc,然后调用相关的LogInfo等函数就可以记录日志了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值