Преобразование журналов cloud-init в json с использованием скрипта

1

Я пытаюсь преобразовать журналы cloud-init в json, так что filebeat может забрать его и отправить в Kibana. Я хочу сделать это, используя скрипт оболочки или скрипт python. Есть ли какой-либо скрипт, который преобразует такие журналы в json?

Мой скрипт python ниже

import json
import subprocess

filename = "/home/umesh/Downloads/scripts/cloud-init.log"

def convert_to_json_log(line):
    """ convert each line to json format """
    log = {}
    log['msg'] = line
    log['logger-name'] = 'cloud-init'
    log['ServiceName'] = 'Contentprocessing'
    return json.dumps(log)


def log_as_json(filename):    
    f = subprocess.Popen(['cat','-F',filename],
                        stdout=subprocess.PIPE,stderr=subprocess.PIPE)
    while True:
        line = f.stdout.readline()
        log = convert_to_json_log(line) 
        print log
        with open("/home/umesh/Downloads/outputs/cloud-init-json.log", 'a') as new:
            new.write(log + '\n')

log_as_json(filename)

Сценарии возвращают файл с json-форматом, но msg filed возвращает пустую строку. Я хочу преобразовать каждую строку журнала в строку сообщения.

  • 0
    исправьте отступы в вашем примере.
Теги:
python-3.x

2 ответа

0

Потребовав некоторое время на подготовку настраиваемого скрипта, я, наконец, сделал следующий скрипт. Это может быть полезно многим другим.

  import json

def convert_to_json_log(line):
    """ convert each line to json format """
    log = {}
    log['msg'] = json.dumps(line)
    log['logger-name'] = 'cloud-init'
    log['serviceName'] = 'content-processing'
    return json.dumps(log)

# Open the file with read only permit

f = open('/var/log/cloud-init.log', "r")

# use readlines to read all lines in the file

# The variable "lines" is a list containing all lines in the file

lines = f.readlines()

# close the file after reading the lines.
f.close()

jsonData = ''
for line in lines:
    jsonLine = convert_to_json_log(line)
    jsonData = jsonData + "\n" + jsonLine;


with open("/var/log/cloud-init/cloud-init-json.log", 'w') as new:
    new.write(jsonData)
0

Во-первых, попробуйте прочитать необработанный файл журнала, используя встроенные функции python, а не запускать команды os с помощью подпроцесса, потому что:

  • Он будет более портативным (работа через OS'es)
  • Быстрее и менее подвержен ошибкам

Повторная запись функции log_as_json в следующем порядке работала для меня:

inputfile = "cloud-init.log"
outputfile = "cloud-init-json.log"

def log_as_json(filename):
    # Open cloud-init log file for reading
    with open(inputfile, 'r') as log:
        # Open the output file to append json entries
        with open(outputfile, 'a') as jsonlog:
            # Read line by line
            for line in log.readlines():
                # Convert to json and write to file
                jsonlog.write(convert_to_json(line)+"\n")
  • 0
    Спасибо rahoogan. Это именно то, что я тоже написал.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню