У меня есть существующее Python приложение, которое регистрирует как:
import logging
import json
logger = logging.getLogger()
some_var = 'abc'
data = {
1: 2,
'blah': {
['hello']
}
}
logger.info(f"The value of some_var is {some_var} and data is {json.dumps(data)}")
Итак, функция logger.info
задана:
The value of some_var is abc and data is {1: 2,"blah": {["hello"]}}
В настоящее время мои журналы go в AWS CloudWatch, который делает волшебные c и отображает это с отступом, например:
The value of some_var is abc and data is {
1: 2,
"blah": {
["hello"]
}
}
Это делает журналы очень четкими для чтения.
Теперь я хочу внести некоторые изменения к моей записи в журнал, обрабатывая его самостоятельно с помощью другого python сценария, который оборачивает мой код и отправляет журналы по электронной почте при сбое.
Мне нужен какой-то способ получения каждой записи журнала (или потока / списка) записей и применения этого отступа.
Итак, я хочу функцию, которая принимает строку и определяет, какие подмножества этой строки json, затем вставляет \n
и
чтобы красиво распечатать это json.
пример ввода:
Здравствуйте, {"a": {"b": "c" }} это некоторые json данные, но также {"c": [1,2,3]} слишком
пример вывода
Hello,
{
"a": {
"b": "c"
}
}
is some json data, but also
{
"c": [
1,
2,
3
]
}
is too
У меня есть конс Деред разделил каждую запись на все до и после первого {
. Оставьте левую половину как есть и передайте правую половину json.dumps(json.loads(x), indent=4)
.
Но что, если в файле журнала есть что-то после объекта json? Хорошо, мы можем просто выбрать все после первого {
и до последнего }
. Затем передайте средний бит в библиотеку JSON.
Но что, если в этой записи журнала есть два объекта JSON? (Как в приведенном выше примере.) Мы должны использовать стек, чтобы выяснить, появляется ли какой-либо {
после того, как все предыдущие {
были закрыты с соответствующим }
.
Но что если есть что-то вроде {"a": "\}"}
. Хм, хорошо, мы должны справиться с побегом. Теперь я чувствую, что мне нужно написать целый синтаксический анализатор json с нуля.
Есть ли простой способ сделать это?
Полагаю, я мог бы использовать регулярное выражение для замены каждого экземпляра json.dumps(x)
во всем моем репо с json.dumps(x, indent=4)
. Но json.dumps
иногда используется вне операторов логирования, и это просто удлиняет все мои строки логирования. Есть ли изящное элегантное решение?
(Бонусные баллы, если он может анализировать и отступать json -подобный вывод, который str(x)
производит в python. Это в основном json с одинарными кавычками вместо двойных .)