歡迎您光臨本站 註冊首頁

apache log udp 傳輸問題

←手機掃碼閱讀     火星人 @ 2014-03-04 , reply:0

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 /                                                                                                                              \ ......
# cat /usr/local/bin/rlog
#!/usr/bin/python
# -*- encoding: utf-8 -*-

import socket
import sys

HOST, PORT = "172.16.0.1", 514

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

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.sendto(str(data), (HOST, PORT))
#received = sock.recv(1024)
sock.close()
測試一下

# echo "Test" | /usr/local/bin/rlog

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


Virtual Host

# cat /usr/local/httpd/conf/extra/httpd-vhosts.conf
<VirtualHost *:80>
ServerAdmin webmaster@zoshow.com
DocumentRoot /www/neo
ServerName neo.test.com
DirectoryIndex index.html index.php
CustomLog "|/usr/local/bin/rlog" common
ErrorLog "|/usr/local/bin/rlog"
</VirtualHost>
重啟動后30531 ?        S      0:00 /usr/bin/python /usr/local/bin/rlog
訪問neo.test.com 但我的UDP Server 那端 就是沒有數據怎麼搞的????




日誌伺服器#!/usr/bin/python3
# -*- encoding: iso-8859-1 -*-

import logging
import socketserver

LOG_FILE = 'syslog.log'

logging.basicConfig(level=logging.INFO,
                    format='%(message)s',
                    datefmt='',
                    filename=LOG_FILE,
                    filemode='a')

class MyUDPHandler(socketserver.BaseRequestHandler):
    """
    """

    def handle(self):
        data = self.request.strip()
        socket = self.request
        print( "%s wrote: " % self.client_address, data)

        logging.info(str(data))

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

if __name__ == "__main__":
    try:
        #HOST, PORT = "localhost", 514
        HOST, PORT = "0.0.0.0", 514
        server = socketserver.UDPServer((HOST, PORT), MyUDPHandler)
        server.serve_forever(poll_interval=0.5)
    except (KeyboardInterrupt, SystemExit):
        raise
    except:
        import traceback
        traceback.print_exc()
《解決方案》

另外請教一下大併發的UDP Socket Server 架構怎麼設計?

TCP accept() 后可以交給線程來處理。。我就不知道UDP 怎麼做了。

我想 udp server  | <--------------  | udp client      想server 報告自己的IP
                          | ---------------> | udp server    讓server 主動連接自己

這樣就是雙對等 server


我在看 rotatelogs.c 沒有頭緒

[火星人 ] apache log udp 傳輸問題已經有245次圍觀

http://coctec.com/docs/service/show-post-15448.html