У меня есть существующее приложение 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"]}}
В настоящее время мои журналы отправляются в AWS CloudWatch, который творит чудеса и отображает это с отступом, например:
The value of some_var is abc and data is {
1: 2,
"blah": {
["hello"]
}
}
Это делает журналы очень четкими для чтения.
Теперь я хочу внести некоторые изменения в свое ведение журнала, обрабатывая его самостоятельно с помощью другого сценария Python, который оборачивает мой код и отправляет журналы по электронной почте в случае сбоя.
Я хочу каким-то образом взять каждую запись журнала (или поток/список записей) и применить этот отступ.
So I want a function which takes in a string, and detects which subset(s) of that string are json, then inserts \n
and to pretty-print that json.
example input:
Hello, {"a": {"b": "c"}} is some json data, but also {"c": [1,2,3]} is too
example output
Hello,
{
"a": {
"b": "c"
}
}
is some json data, but also
{
"c": [
1,
2,
3
]
}
is too
I have considered splitting up each entry into everything before and after the first {
. Leave the left half as is, and pass the right half to 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 с одинарными кавычками вместо двойных.)