这是我用来接收syslog并将其附加到文本文件的脚本:
# Receives packets on udp port 514 and
# writes to syslog.txt
from socket import *
# Set the socket parameters
host = "myhost"
port = 514
buf = 1024
addr = (host,port)
# Create socket and bind to address
UDPSock = socket(AF_INET,SOCK_DGRAM)
UDPSock.bind(addr)
# Receive messages
while 1:
data,addr = UDPSock.recvfrom(buf)
if not data:
print "Client has exited!"
break
else:
print "\nReceived message '", data,"'"
# This will create a new file or overwrite an existing file.
with open("C:\syslog.txt", "a") as myfile:
myfile.write(str(data))
# Close socket
UDPSock.close()
脚本工作正常,文本附加到文件。我看到它并且读得很好。但是,在我关闭python的那一刻,那个txt文件数据被翻译成乱码文本。有什么想法吗?我是否应该在将套接字数据附加到文件之前做其他事情?
感谢。
答案 0 :(得分:4)
您没有解析syslog数据包。系统日志is a protocol;它不仅仅是纯文本。数据字符最有可能在文件中结束,这可能会使某些自动字符检测失效。
答案 1 :(得分:1)
这可能会直接执行您想要实现的目标(解析syslog协议并将其转储): http://pypi.python.org/pypi/loggerglue/0.9
答案 2 :(得分:0)
我打算建议打开(“C:\ syslog.txt”,“at”)而不是open(“C:\ syslog.txt”,“a”),但是重新阅读python dox, text是默认值(与C不同,我的内存表示二进制是默认值,导致在Windows上运行时出现问题)。
我的另一个建议是在第一次创建文件时在文件顶部放置一个纯文本标题;不知道你之后用什么来读取文件,但记事本和写字板使用一些启发式算法来弄清楚UTF-8或其他编码的使用情况,我肯定会看到这种情况严重失败的情况。 (搜索wordpad BOM猜测)