2

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 ファイルのデータは意味不明なテキストに変換されます。理由はありますか?ソケットデータをファイルに追加する前に何か他のことをする必要がありますか?

ありがとう。

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", "a") の代わりに open("C:\syslog.txt", "at") を実行することを提案するつもりでしたが、python dox を読み直すと、テキストはデフォルト(私の記憶ではバイナリがデフォルトであり、Windowsで実行すると問題が発生するCとは異なります)。

私の他の提案は、最初にファイルを作成するときに、ファイルの先頭にプレーン テキスト ヘッダーを配置することです。後でファイルを読み取るために何を使用しているかはわかりませんが、メモ帳とワードパッドはいくつかのヒューリスティックを使用して、使用されている UTF-8 または他のエンコーディングを把握します。これがひどく失敗するケースを確かに見てきました。(検索ワードパッド BOM 推測)

于 2012-08-29T20:08:50.440 に答える