Я пытаюсь преобразовать журналы 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 возвращает пустую строку. Я хочу преобразовать каждую строку журнала в строку сообщения.
Потребовав некоторое время на подготовку настраиваемого скрипта, я, наконец, сделал следующий скрипт. Это может быть полезно многим другим.
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)
Во-первых, попробуйте прочитать необработанный файл журнала, используя встроенные функции python, а не запускать команды os
с помощью подпроцесса, потому что:
Повторная запись функции 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")