apache log udp 传输问题

我想采用udp socket 传输apache log

1. 不写本地磁盘,不占用IO,不影响server 性能
2. 日志集中管理,便于分析

apache 1 \                                                                                                                              / TXT File
apache 2  |---CustomLog "| /usr/bin/rlog "---> UDP Socket ---> Daemon -> threading -> |  DB (DBD, SQL....)
apache 3 /                                                                                                                              \ ......
  1. [root@dev1 ~]# cat /usr/local/bin/rlog
  2. #!/usr/bin/python
  3. # -*- encoding: utf-8 -*-

  4. import socket
  5. import sys

  6. HOST, PORT = "172.16.0.1", 514

  7. data = "".join(sys.stdin.read())
  8. if not data:
  9.     exit()

  10. sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  11. sock.sendto(str(data), (HOST, PORT))
  12. #received = sock.recv(1024)
  13. sock.close()
复制代码
测试一下

[root@dev1 ~]# echo "Test" | /usr/local/bin/rlog

服务器端返回 192.168.3.10 wrote:  b'Test' 表示成功


Virtual Host
  1. [root@dev1 ~]# cat /usr/local/httpd/conf/extra/httpd-vhosts.conf
  2. <VirtualHost *:80>
  3. ServerAdmin webmaster@zoshow.com
  4. DocumentRoot /www/neo
  5. ServerName neo.test.com
  6. DirectoryIndex index.html index.php
  7. CustomLog "|/usr/local/bin/rlog" common
  8. ErrorLog "|/usr/local/bin/rlog"
  9. </VirtualHost>
复制代码
重启动后
  1. 30531 ?        S      0:00 /usr/bin/python /usr/local/bin/rlog
复制代码
访问neo.test.com 但我的UDP Server 那端 就是没有数据怎么搞的????




日志服务器
  1. #!/usr/bin/python3
  2. # -*- encoding: iso-8859-1 -*-

  3. import logging
  4. import socketserver

  5. LOG_FILE = 'syslog.log'

  6. logging.basicConfig(level=logging.INFO,
  7.                     format='%(message)s',
  8.                     datefmt='',
  9.                     filename=LOG_FILE,
  10.                     filemode='a')

  11. class MyUDPHandler(socketserver.BaseRequestHandler):
  12.     """
  13.     """

  14.     def handle(self):
  15.         data = self.request[0].strip()
  16.         socket = self.request[1]
  17.         print( "%s wrote: " % self.client_address[0], data)

  18.         logging.info(str(data))

  19.         socket.sendto(data.upper(), self.client_address)

  20. if __name__ == "__main__":
  21.     try:
  22.         #HOST, PORT = "localhost", 514
  23.         HOST, PORT = "0.0.0.0", 514
  24.         server = socketserver.UDPServer((HOST, PORT), MyUDPHandler)
  25.         server.serve_forever(poll_interval=0.5)
  26.     except (KeyboardInterrupt, SystemExit):
  27.         raise
  28.     except:
  29.         import traceback
  30.         traceback.print_exc()
复制代码

作者: bg7nyt   发布时间: 2011-01-15

另外请教一下大并发的UDP Socket Server 架构怎么设计?

TCP accept() 后可以交给线程来处理。。我就不知道UDP 怎么做了。

我想 udp server  | <--------------  | udp client      想server 报告自己的IP
                          | ---------------> | udp server    让server 主动连接自己

这样就是双对等 server


我在看 rotatelogs.c 没有头绪

作者: bg7nyt   发布时间: 2011-01-15