在python将新数据写入文件后,Logstash无法(读取)存储文件中的日志数据

时间:2016-12-27 02:02:26

标签: python elastic-stack

我使用python脚本自动将日志写入特殊文件, 哪个文件也是我的log-stash的源日志。 上下文可以正确编写(通过python scrpit), 但之后,log-stash无法再读取日志数据,甚至无法重启logstash。

主要步骤是:

  1. 启动elasticsearch(使用默认conf)和logstash(使用conf显示) logstash可以自动将所有数据(在源日志文件中)存储到elasticsearch,并将信息输出到控制台。
  2. 启动python脚本(显示如下),将json数据写入源日志文件。 数据写成功。 但是logstash不能再读取新数据了。 即使我重新启动了logstash,它仍然无法读取源日志中的数据或将其存储到elasticsearch。
  3. 以前有人遇到过这个问题吗? 这是我的python代码:

     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文件,如果手动将数据输入到此日志中,它可以正常工作:

    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

2 个答案:

答案 0 :(得分:0)

我完全不明白你的问题,但是, 不是最后一行应该是read.close()而不是read.close 即使在第一个函数json_file.close()中,如果必须使用with

,它实际上也是多余的

答案 1 :(得分:0)

根据我收集的内容,源文件为 elk_data_source.log ,您尝试将//Character.h TESTFUNCDLL_API Character MakeCharacter(); class Character { int health; int magic; public: ReturnCharacterClass() { return *this; } } //Character.cpp Character MakeCharacter() { Character cCharacter; return cCharacter.ReturnCharacterClass(); } //UseDll.cs [DllImport("Character", EntryPoint = "Character")] //How do I refrence character? -public static extern int character(); 覆盖为"eventType" = ["*icbc"]。但是你错过的是...... *ABC的值是数组,而你用单值代替 - "eventType"

*ABC更改为data["eventType"] = "*ABC"

这应该解决。如果可能,尝试将这两个文件与文件比较软件进行比较。此外,请检查匹配的大括号或在从文件读取和格式化时可能导致问题的其他空间。