
Человеко-читаемый логгер запросов с использованием zap, lumberjack и rk-logger
Содержание сгенерировано с помощью DocToc
go get github.com/rookie-ninja/rk-query
Для записи логов Zap-логгер должен быть передан запросу.
Пожалуйста, обратитесь к https://github.com/rookie-ninja/rk-logger для простого запуска Zap-логгера.
Это человеко-дружественный тип кодирования логов запросов.Пример:
var (
bytes = []byte(`{
"level": "info",
"encoding": "console",
"outputPaths": ["stdout"],
"errorOutputPaths": ["stderr"],
"initialFields": {},
"encoderConfig": {
"messageKey": "msg",
"levelKey": "",
"nameKey": "",
"timeKey": "",
"callerKey": "",
"stacktraceKey": "",
"callstackKey": "",
"errorKey": "",
"timeEncoder": "iso8601",
"fileKey": "",
"levelEncoder": "capital",
"durationEncoder": "second",
"callerEncoder": "full",
"nameEncoder": "full"
},
"maxsize": 1024,
"maxage": 7,
"maxbackups": 3,
"localtime": true,
"compress": true
}`)
)
``````md
Функция с событием в консольном кодировании:
```go
func withEventConsoleEncoding() {
logger, _, _ := rklogger.NewZapLoggerWithBytes(bytes, rk_logger.JSON)
fac := rkquery.NewEventFactory(
rkquery.WithAppName("appName"),
rkquery.WithEncoding(rkquery.CONSOLE),
rkquery.WithOperation("op"),
rkquery.WithLogger(logger))
event := fac.CreateEvent()
event.SetStartTime(time.Now())
event.StartTimer("t1")
time.Sleep(1 * time.Second)
event.EndTimer("t1")
event.AddPair("key", "value")
event.SetCounter("count", 1)
event.AddFields(zap.String("f1", "f2"), zap.Time("t2", time.Now()))
event.AddErr(MyError{})
event.SetEndTime(time.Now())
event.WriteLog()
}
Выходные данные:
--------------------------------------------------------------------------------
endTime=2021-06-13T01:16:27.58556+08:00
startTime=2021-06-13T01:16:26.581691+08:00
elapsedNano=1003868481
часовой пояс=CST
ids={"eventId":"581812ae-924a-44b2-83f8-fa8eef071393"}
приложение={"appName":"appName","appVersion":"v0.0.1","entryName":"entry-example","entryType":"example"}
окружение={"arch":"amd64","hostname":"lark.local","realm":"*","region":"*","az":"*","domain":"*","os":"darwin"}
параметры={"f1":"f2","t2":"2021-06-13T01:16:27.58554+08:00"}
ошибка={"my error":1}
счетчики={"count":1}
пары={"key":"value"}
тайминг={"t1.count":1,"t1.elapsedMs":1004}
удалённый адрес=localhost
операция=op
код ответа=200
статус события=Закончено
EOE
Перевод непереведенных частей:
часовой пояс=CST
приложение={"appName":"appName","appVersion":"v0.0.1","entryName":"entry-example","entryType":"example"}
окружение={"arch":"amd64","hostname":"lark.local","realm":"*","region":"*","az":"*","domain":"*","os":"darwin"}
параметры={"f1":"f2","t2":"2021-06-13T01:16:27.58554+08:00"}
ошибка={"my error":1}
счетчики={"count":1}
пары={"key":"value"}
тайминг={"t1.count":1,"t1.elapsedMs":1004}
удалённый адрес=localhost
операция=op
код ответа=200
статус события=Закончено
EOE
Полностью переведенный текст:
Функция с событием в консольном кодировании:
```go
func withEventConsoleEncoding() {
logger, _, _ := rklogger.NewZapLoggerWithBytes(bytes, rk_logger.JSON)
fac := rkquery.NewEventFactory(
rkquery.WithAppName("appName"),
rkquery.WithEncoding(rkquery.CONSOLE),
rkquery.WithOperation("op"),
rkquery.WithLogger(logger))
event := fac.CreateEvent()
event.SetStartTime(time.Now())
event.StartTimer("t1")
time.Sleep(1 * time.Second)
event.EndTimer("t1")
event.AddPair("key", "value")
event.SetCounter("count", 1)
event.AddFields(zap.String("f1", "f2"), zap.Time("t2", time.Now()))
event.AddErr(MyError{})
event.SetEndTime(time.Now())
event.WriteLog()
}
Выходные данные:
--------------------------------------------------------------------------------
endTime=2021-06-13T01:16:27.58556+08:00
startTime=2021-06-13T01:16:26.581691+08:00
elapsedNano=1003868481
часовой пояс=CST
ids={"eventId":"581812ae-924a-44b2-83f8-fa8eef071393"}
приложение={"appName":"appName","appVersion":"v0.0.1","entryName":"entry-example","entryType":"example"}
окружение={"arch":"amd64","hostname":"lark.local","realm":"*","region":"*","az":"*","domain":"*","os":"darwin"}
параметры={"f1":"f2","t2":"2021-06-13T01:16:27.58554+08:00"}
ошибка={"my error":1}
счетчики={"count":1}
пары={"key":"value"}
тайминг={"t1.count":1,"t1.elapsedMs":1004}
удалённый адрес=localhost
операция=op
код ответа=200
статус события=Закончен
EOE
Это тип вывода запроса лога, удобный для парсинга.
Пример:
```go
var (
bytes = []byte(`{
"level": "info",
"encoding": "console",
"outputPaths": ["stdout"],
"errorOutputPaths": ["stderr"],
"initialFields": {},
"encoderConfig": {
"messageKey": "msg",
"levelKey": "",
"nameKey": "",
"timeKey": "",
"callerKey": "",
"stacktraceKey": "",
"callstackKey": "",
"errorKey": "",
"timeEncoder": "iso8601",
"fileKey": "",
"levelEncoder": "capital",
"durationEncoder": "second",
"callerEncoder": "full",
"nameEncoder": "full"
},
"maxsize": 1024,
"maxage": 7,
"maxbackups": 3,
"localtime": true,
"compress": true
}`)
)
func withEventJSONEncoding() {
logger, _, _ := rklogger.NewZapLoggerWithBytes(bytes, rk_logger.JSON)
fac := rkquery.NewEventFactory(
rkquery.WithAppName("appName"),
rkquery.WithEncoding(rkquery.JSON),
rkquery.WithOperation("op"),
rkquery.WithLogger(logger))
event := fac.CreateEvent()
Уровнем события в логах может быть info
, debug
, warn
или error
. В данном примере используется уровень info
.
event.SetStartTime(time.Now())
event.StartTimer("t1")
time.Sleep(1 * time.Second)
event.EndTimer("t1")
event.AddPair("key", "value")
event.SetCounter("count", 1)
event.AddFields(zap.String("f1", "f2"), zap.Time("t2", time.Now()))
event.AddErr(MyError{})
event.SetEndTime(time.Now())
event.WriteLog()
}
Для удобства представлена отформатированная версия JSON, однако реальные логи могут иметь другой вид.```json { "endTime": "2021-06-13T00:24:21.261+0800", "startTime": "2021-06-13T00:24:20.257+0800", "elapsedNano": 1004326112, "timezone": "CST", "ids": { "eventId": "72a59682-230f-4ba2-a9fc-e99a031e4d8c", "requestId": "", "traceId": "" }, "app": { "appName": "appName", "appVersion": "неизвестная", "entryName": "неизвестная", "entryType": "неизвестная" }, "env": { "arch": "amd64", "hostname": "lark.local", "realm": "", "region": "", "az": "", "domain": "", "os": "darwin" }, "payloads": { "f1": "f2", "t2": "2021-06-13T00:24:21.261768+08:00" }, "error": { "моя ошибка": 1 }, "counters": { "количество": 1 }, "pairs": { "ключ": "значение" }, "timing": { "t1.count": 1, "t1.elapsed_ms": 1004 }, "remoteAddr": "localhost", "operation": "оп", "eventStatus": "Закончен", "resCode": "200" }
Этот формат будет пропускать большую часть значений и оставлять только наиболее важные.
Пример:
```go
var (
bytes = []byte(`{
"level": "info",
"encoding": "console",
"outputPaths": ["stdout"],
"errorOutputPaths": ["stderr"],
"initialFields": {},
"encoderConfig": {
"messageKey": "msg",
"levelKey": "",
"nameKey": "",
"timeKey": "",
"callerKey": "",
"stacktraceKey": "",
"callstackKey": "",
"errorKey": "",
"timeEncoder": "iso8601",
"fileKey": "",
"levelEncoder": "capital",
"durationEncoder": "second",
"callerEncoder": "full",
"nameEncoder": "full"
},
"maxsize": 1024,
"maxage": 7,
"maxbackups": 3,
"localtime": true,
"compress": true
}`)
)
func configurationConsoleLogging() {
logger, _, _ := rklogger.NewZapLoggerWithBytes(bytes, rk_logger.JSON)
}
```go
fac := rkquery.NewEventFactory(
rkquery.WithAppName("appName"),
rkquery.WithEncoding(rkquery.FLATTEN),
rkquery.WithOperation("оп"),
rkquery.WithLogger(logger))
event := fac.CreateEvent()
event.SetStartTime(time.Now())
event.StartTimer("t1")
time.Sleep(1 * time.Second)
event.EndTimer("t1")
event.AddPair("ключ", "значение")
event.SetCounter("счетчик", 1)
event.AddFields(zap.String("f1", "f2"), zap.Time("t2", time.Now()))
event.AddErr(MyError{})
event.SetEndTime(time.Now())
event.WriteLog()
}
```
Выходные данные
```
2022-03-04T02:29:53.478+0800 [200] 1002ms оп пример-ввода пример localhost [f76ab5d3-e765-46ce-8c6f-8ad16e77f3b4]
```
## Статус разработки: Устойчивый
## Вклад
Мы приветствуем и поддерживаем активное, здоровое сообщество вкладчиков — включая вас!
Детали указаны в [руководстве по вкладу](CONTRIBUTING.md) и [коде поведения](CODE_OF_CONDUCT.md).
Поддерживатели rk следят за проблемами и запросами на слияние, но вы также можете отчитаться о любом негативном поведении на lark@rkdev.info.Размещено под лицензией [Apache 2.0](LICENSE).
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )