2

这是我用来接收系统日志并将其附加到文本文件的脚本:

# 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 文件数据被翻译成乱码。任何想法为什么?在将套接字数据附加到文件之前我应该​​做其他事情吗?

谢谢。

4

3 回答 3

4

您没有解析 syslog 数据包。Syslog是一种协议;它不仅仅是纯文本。数据字符很可能最终出现在您的文件中,这可能会导致某些自动字符检测失败。

于 2012-08-29T19:58:01.703 回答
1

这可能会直接完成您想要实现的目标(解析 syslog 协议并将其转储): http: //pypi.python.org/pypi/loggerglue/0.9

于 2012-08-29T20:35:46.257 回答
0

我打算建议做 open("C:\syslog.txt", "at") 而不是 open("C:\syslog.txt", "a"),但是重新阅读 python dox,文本是默认值(与 C 不同,我的记忆中说二进制是默认值,这会导致在 Windows 上运行时出现问题)。

我的另一个建议是在第一次创建文件时在文件顶部放置一个纯文本标题;不确定之后您使用什么来读取文件,但是记事本和写字板使用一些启发式方法来确定正在使用什么 UTF-8 或其他编码,而且我肯定看到过这种情况严重失败的情况。(搜索写字板BOM猜测)

于 2012-08-29T20:08:50.440 回答