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 沒有頭緒