2016-12-27 8 views
0

私は特別なファイルにログを書き込むためにpythonスクリプトを使用しましたが、 私のlog-隠す コンテキストは正しく(python scrpitによって)書き込まれましたが、 ですが、そのログ・スタッシュはログ・データを読み取ることができなくなり、ログ・スタッシュを再始動することさえできません。Logstashは、Pythonが新しいデータを書き込んだ後にファイルからログデータを読み込むことができません。

主な手順は次のとおり

  1. 開始(デフォルトCONF有する)elasticsearchとlogstash(CONFと蛇腹示した) logstashはelasticsearchに(ソースログファイルに)自動的にすべてのデータを格納することができ、その情報をコンソールに出力します。
  2. jsonデータをソースログファイルに書き込むためのpythonスクリプト(下図)を起動します。 データは正常に書き込まれました。 ログシャッシュで新しいデータを読み取ることはできません。 私はlogstashを再起動しても、ソースログのデータを読み込むことはできず、elasticsearchに保存することもできません。

誰もこの問題を以前に遭遇しましたか?ここで

def store(filepath,data): 
    with open(filepath, 'a') as json_file: 
    json_file.write(json.dumps(data)) 
    json_file.write("\r") 
    # json_file.close 

def load(filepath): 
    with open(filepath) as json_file: 

    data = json.load(json_file) 
    return data 


if __name__ == "__main__": 

data = {} 
sourceFilePath = "elk_data_source.log" 
destFilePath = "elk_data_dest2.log" 
for i in range(1,20): 
    data= load(sourceFilePath) 
data["eventType"] = "*ABC" 
    store(destFilePath, data) 

read = open(destFilePath) 
line=read.readline() 
while line: 
print line 
    ''' 
context = json.loads(line) 
context = context.join([ string.strip().rsplit("}" , 1)[0] , "}"]) 
print context 
''' 
line=read.readline() 
# read.close 
read.close() 

このログに手動で入力したデータならば正常に動作することができます私のlogstashのconfファイル、次のとおりです: はここに私のpythonのコードである。ここ

input { 
     file { 
       type => "accounts" 
       path => "/ELK_Data/elk_data_dest2.log" 

       start_position => "beginning" 

      } 
     } 

filter { 

     json{ 
       source => "message" 
      } 
     } 

output { 
     stdout { codec=> rubydebug } 
     elasticsearch { 
      hosts => "localhost:9200" 
      index => "logstash-2016.12.20" 
        } 
     } 

は私elk_data_source.logある

{"eventType": ["*icbc"], "prodName": ["LDAP"], "prodFmid": ["HRSL420"], "systemSmfid": ["EIMG"]} 

バージョン: logstash-5.0.0 elasticsearch-2.4.1 Python 2.7.6

答えて

0

で使用している場合、実際には冗長である第一の機能json_file.close()でも代わりread.closeread.close()ことになって最後の行ではないです私が収集したものから、ソースファイルはelk_data_source.logであり、"eventType" = ["*icbc"]*ABCに上書きしようとしています。しかし、あなたが逃したのは、"eventType"の値はの配列であり、代わりに*ABCと書いています。

data["eventType"] = "*ABC"からdata["eventType"] = ["*ABC"]に変更してください。

これは解決するはずです。可能であれば、両方のファイルをファイル比較ソフトウェアと比較してみてください。また、ファイルを読み込んで書式を設定する際に問題を引き起こす可能性のある、中括弧や追加のスペースを確認してください。

+0

迅速な対応をありがとう。 私のpythonスクリプトは、 "eventType" = ["* icbc"]から* ABCにデータを変更するために使用されます。しかし、何も変更しなかった場合は、ソースファイルのデータをコピー先のファイルに貼り付けるだけで、logstashは動作しません。 – wenterjoy

+0

もう一度「中括弧や追加のスペース」を確認します。 – wenterjoy

+0

問題は引き続き発生しています。 pythonスクリプトによってコピーされたデータ(コピーだけは変更されません)は、logstashによって認識されません。 宛先ファイル(elk_data_dest2.log)に手動で同じデータ(Pythonスクリプトでコピーされたデータのみ)を入力すると、 ログシャッシュが認識されます。 – wenterjoy

0

私は完全にあなたの質問を理解していなかったけど、 でもwith

+0

ありがとうございました。 PS:私はPythonエクスペリエンスが不足しています – wenterjoy

+0

インターネット上に "()"が書かれていない多くの ".close()"が見つかりました これは私を誤解させます。 – wenterjoy

+0

元の質問を言い換えることができますか?私はもっ​​と助けになることができます。 – dhishan

関連する問題