ezar-logger

module
v1.6.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 29, 2026 License: MIT

README ยถ

ezar-logger (EL)

Go ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•œ ๊ฒฝ๋Ÿ‰ ์›๊ฒฉ ๋กœ๊น… ํŒจํ‚ค์ง€์ž…๋‹ˆ๋‹ค. gRPC ํด๋ผ์ด์–ธํŠธ ์ง€์›, SHA256 ๊ธฐ๋ฐ˜ ๊ณ ์œ  ๋กœ๊ทธ ID ์ƒ์„ฑ, Reply ์ฒด์ธ ๊ธฐ๋Šฅ, QA ๋ฉ”์‹œ์ง€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๐Ÿš€ ์ฃผ์š” ๊ธฐ๋Šฅ

  • gRPC ํด๋ผ์ด์–ธํŠธ: gRPC๋ฅผ ํ†ตํ•œ ์›๊ฒฉ ๋กœ๊น… ์„œ๋น„์Šค ์—ฐ๋™
  • SHA256 ๊ธฐ๋ฐ˜ ๊ณ ์œ  ID: ํƒ€์ž„์Šคํƒฌํ”„๋ฅผ ํฌํ•จํ•œ ๋‹จ๋ฐฉํ–ฅ ์•”ํ˜ธํ™” ๋กœ๊ทธ ID ์ƒ์„ฑ
  • Reply ์ฒด์ธ ์ง€์›: Parent ์ฐธ์กฐ๋ฅผ ํ†ตํ•œ ์—ฐ๊ด€ ๋กœ๊ทธ ์—ฐ๊ฒฐ
  • QA ๋ฉ”์‹œ์ง€ ์ง€์›: Channel๊ณผ Managers๋ฅผ ์ง€์ •ํ•œ QA ์ „์šฉ ๋กœ๊ทธ ์ „์†ก
  • ๋กœ๊ทธ ID ๋ฐ˜ํ™˜: ๋ชจ๋“  ๋กœ๊น… ํ•จ์ˆ˜๊ฐ€ ์ƒ์„ฑ๋œ ๋กœ๊ทธ ID ๋ฐ˜ํ™˜
  • ๋‹ค์–‘ํ•œ ๋กœ๊ทธ ๋ ˆ๋ฒจ: INFO, WARN, ERROR, FATAL, QA ์ง€์›
  • Type & Status: ๋กœ๊ทธ ํƒ€์ž…(MSG/REPLY)๊ณผ ์ƒํƒœ(PENDING) ์ž๋™ ๊ด€๋ฆฌ
  • ์Šคํƒ ํŠธ๋ ˆ์ด์Šค: ๋””๋ฒ„๊น…์„ ์œ„ํ•œ ๋‚ด์žฅ ์—๋Ÿฌ ์ถ”์  ๊ธฐ๋Šฅ
  • ํ™˜๊ฒฝ๋ณ„ ๋™์ž‘: DEV/STAGE/PROD ํ™˜๊ฒฝ์— ๋”ฐ๋ฅธ ์ž๋™ ์„ค์ •
  • ์ž๋™ TLS: ํ”„๋กœ๋•์…˜ ์„œ๋ฒ„ ์—ฐ๊ฒฐ ์‹œ ์ž๋™ TLS ์ ์šฉ

๐Ÿ“ฆ ์„ค์น˜

go get bitbucket.org/ezardev-admin/ezar-logger

๐Ÿ”ง ์š”๊ตฌ์‚ฌํ•ญ

  • Go 1.24 ์ด์ƒ
  • ezar-grpc v1.18.2 ์ด์ƒ
  • gRPC ๋กœ๊น… ์„œ๋น„์Šค ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ

๐Ÿ“ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

ezar-logger/
โ”œโ”€โ”€ el/                             # ๋ฉ”์ธ ๋กœ๊ฑฐ ํŒจํ‚ค์ง€ (EL - Ezar Logger)
โ”‚   โ”œโ”€โ”€ el.go                       # ํ•ต์‹ฌ ๋กœ๊น… ๊ตฌํ˜„
โ”‚   โ”œโ”€โ”€ ql.go                       # QA ๋กœ๊น… ๊ตฌํ˜„
โ”‚   โ””โ”€โ”€ el_test.go                  # ํ…Œ์ŠคํŠธ ์ฝ”๋“œ
โ”œโ”€โ”€ internal/
โ”‚   โ”œโ”€โ”€ core/
โ”‚   โ”‚   โ””โ”€โ”€ clients/logger/         # gRPC ํด๋ผ์ด์–ธํŠธ
โ”‚   โ””โ”€โ”€ datasource/storage/docs/    # ๋ฐ์ดํ„ฐ ๋ชจ๋ธ
โ”œโ”€โ”€ pkg/utils/                      # ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜
โ””โ”€โ”€ example/                        # ์‚ฌ์šฉ ์˜ˆ์ œ

๐Ÿš€ ๋น ๋ฅธ ์‹œ์ž‘

1. ๋กœ๊ฑฐ ์ดˆ๊ธฐํ™”
package main

import (
    "bitbucket.org/ezardev-admin/ezar-logger/el"
)

func main() {
    // EL ๋กœ๊ฑฐ ์ดˆ๊ธฐํ™”
    // Mode: "PROD" -> ํ”„๋กœ๋•์…˜ ์„œ๋ฒ„, "STAGE" -> ์Šคํ…Œ์ด์ง€ ์„œ๋ฒ„, ๊ทธ ์™ธ -> ๋กœ์ปฌ ์ถœ๋ ฅ๋งŒ
    el.InitLogger("#my-application", "PROD")
    
    // ๋กœ๊น… ์‹œ์ž‘ - ๋กœ๊ทธ ID ๋ฐ˜ํ™˜
    id := el.Info("์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹œ์ž‘", "์„œ๋ฒ„๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์ดˆ๊ธฐํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค")
    el.Warn("๋†’์€ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰", "๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด 85%์ž…๋‹ˆ๋‹ค")
    el.Error("๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์˜ค๋ฅ˜", "์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ์‹คํŒจ")
}
2. Reply ์ฒด์ธ ์‚ฌ์šฉ๋ฒ•
package main

import (
    "bitbucket.org/ezardev-admin/ezar-logger/el"
)

func main() {
    el.InitLogger("#order-service", "PROD")
    
    // ์ดˆ๊ธฐ ๋กœ๊ทธ ์ „์†ก ํ›„ ID ํš๋“
    parentId := el.Info("์ฃผ๋ฌธ ์ƒ์„ฑ", "์ƒˆ ์ฃผ๋ฌธ #12345๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค")
    
    // ๋ถ€๋ชจ ๋กœ๊ทธ์— ์—ฐ๊ฒฐ๋œ Reply ๋กœ๊ทธ ์ „์†ก
    el.ReplyInfo(parentId, "๊ฒฐ์ œ ์ฒ˜๋ฆฌ ์ค‘", "์ฃผ๋ฌธ #12345 ๊ฒฐ์ œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค")
    el.ReplyInfo(parentId, "์ฃผ๋ฌธ ์™„๋ฃŒ", "์ฃผ๋ฌธ #12345๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค")
    
    // ๋˜๋Š” ์ปค์Šคํ…€ ๋ ˆ๋ฒจ๋กœ Reply
    el.Reply(parentId, el.WARN, "์žฌ๊ณ  ๋ถ€์กฑ", "์ฃผ๋ฌธ ํ›„ ์žฌ๊ณ ๊ฐ€ ๋ถ€์กฑํ•ด์กŒ์Šต๋‹ˆ๋‹ค")
}
3. QA ๋ฉ”์‹œ์ง€ ์ „์†ก
package main

import (
    "bitbucket.org/ezardev-admin/ezar-logger/el"
)

func main() {
    el.InitLogger("#my-service", "PROD")
    
    // QA ๋ฉ”์‹œ์ง€ ์ „์†ก (์ฑ„๋„๊ณผ ๋‹ด๋‹น์ž ์ง€์ •)
    qaId := el.AskQA(
        "#qa-channel",                      // ์ฑ„๋„
        []string{"manager1", "manager2"},   // ๋‹ด๋‹น์ž ๋ชฉ๋ก
        "๋ฒ„๊ทธ ๋ฆฌํฌํŠธ",                        // ์ œ๋ชฉ
        "๊ฒฐ์ œ ํŽ˜์ด์ง€์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค",    // ์ƒ์„ธ ๋‚ด์šฉ
    )
    
    // QA ๋ฉ”์‹œ์ง€์— Reply
    el.ReplyQA(
        qaId,                               // ๋ถ€๋ชจ QA ๋กœ๊ทธ ID
        "#qa-channel",                      // ์ฑ„๋„
        []string{"manager1"},               // ๋‹ด๋‹น์ž ๋ชฉ๋ก
        "์ˆ˜์ • ์™„๋ฃŒ",                          // ์ œ๋ชฉ
        "๊ฒฐ์ œ ํŽ˜์ด์ง€ ์˜ค๋ฅ˜๋ฅผ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค",      // ์ƒ์„ธ ๋‚ด์šฉ
    )
}
4. ๋น„ํ”„๋กœ๋•์…˜ ๋ชจ๋“œ (๋กœ์ปฌ ๊ฐœ๋ฐœ)
el.InitLogger("#my-app", "DEV")  // "PROD" ์™ธ์˜ ๋ชจ๋“  ๋ชจ๋“œ

// ์›๊ฒฉ ์„œ๋ฒ„๋กœ ์ „์†ก๋˜์ง€ ์•Š๊ณ  stdout์— ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค
el.Info("ํ…Œ์ŠคํŠธ", "์ด ๋ฉ”์‹œ์ง€๋Š” ์ฝ˜์†”์— ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค")
// ์ถœ๋ ฅ: INFO: ํ…Œ์ŠคํŠธ ์ด ๋ฉ”์‹œ์ง€๋Š” ์ฝ˜์†”์— ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค

๐Ÿ“Š ๋กœ๊ทธ ๋ ˆ๋ฒจ

๋ ˆ๋ฒจ ๊ฐ’ ์„ค๋ช…
el.INFO 0 ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ๋ฆ„์— ๋Œ€ํ•œ ์ผ๋ฐ˜ ์ •๋ณด
el.WARN 1 ์ž ์žฌ์  ๋ฌธ์ œ์— ๋Œ€ํ•œ ๊ฒฝ๊ณ  ๋ฉ”์‹œ์ง€
el.ERROR 2 ์‹คํŒจ์— ๋Œ€ํ•œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€
el.FATAL 3 ์‹ฌ๊ฐํ•œ ์˜ค๋ฅ˜
el.QA 4 QA ๋ฉ”์‹œ์ง€

๐Ÿ“„ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ

LogQue ๊ตฌ์กฐ์ฒด
type LogQue struct {
    ID        string    `json:"_id"`        // SHA256 ํ•ด์‹œ: #์•ฑ์ด๋ฆ„-ํ•ด์‹œ
    AppName   string    `json:"app_name"`   // ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ด๋ฆ„
    Title     string    `json:"title"`      // ๋กœ๊ทธ ์ œ๋ชฉ/์š”์•ฝ
    Detail    string    `json:"detail"`     // ์ƒ์„ธ ๋กœ๊ทธ ๋ฉ”์‹œ์ง€
    Status    string    `json:"status"`     // ๋กœ๊ทธ ์ƒํƒœ (PENDING)
    Type      string    `json:"type"`       // ๋กœ๊ทธ ํƒ€์ž… (MSG/REPLY)
    Parent    string    `json:"parent"`     // Reply์šฉ ๋ถ€๋ชจ ๋กœ๊ทธ ID
    Level     int       `json:"level"`      // ๋กœ๊ทธ ๋ ˆ๋ฒจ (0-4)
    CreatedAt time.Time `json:"created_at"` // ํƒ€์ž„์Šคํƒฌํ”„
}
QaQueue ๊ตฌ์กฐ์ฒด
type QaQueue struct {
    *LogQue
    Channel  string   `json:"channel"`   // QA ์ฑ„๋„
    Managers []string `json:"managers"`  // ๋‹ด๋‹น์ž ๋ชฉ๋ก
}
๋กœ๊ทธ ํƒ€์ž…
ํƒ€์ž… ์„ค๋ช…
MSG ์ผ๋ฐ˜ ๋กœ๊ทธ ๋ฉ”์‹œ์ง€
REPLY ๊ธฐ์กด ๋กœ๊ทธ์— ๋Œ€ํ•œ ๋‹ต๋ณ€ (๋ถ€๋ชจ ์ฐธ์กฐ ํฌํ•จ)

๐Ÿ”ง API ๋ ˆํผ๋Ÿฐ์Šค

ํŒจํ‚ค์ง€: el
์ดˆ๊ธฐํ™”
func InitLogger(appName string, mode string)

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ด๋ฆ„๊ณผ ๋ชจ๋“œ๋กœ ์ „์—ญ EL ๋กœ๊ฑฐ๋ฅผ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.

ํŒŒ๋ผ๋ฏธํ„ฐ:

  • appName: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ด๋ฆ„ (์˜ˆ: "#my-service")
  • mode: ํ™˜๊ฒฝ ๋ชจ๋“œ ("PROD", "STAGE", ๋˜๋Š” ๋กœ์ปฌ์šฉ ๊ธฐํƒ€)
๊ธฐ๋ณธ ๋กœ๊น… ํ•จ์ˆ˜
func Info(title string, detail string) string
func Warn(title string, detail string) string
func Error(title string, detail string) string
func Send(level LogLevel, title string, detail string) string

๋ชจ๋“  ๋กœ๊น… ํ•จ์ˆ˜๋Š” ์ƒ์„ฑ๋œ ๋กœ๊ทธ ID๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

Reply ํ•จ์ˆ˜
func ReplyInfo(parent string, title string, detail string) string
func ReplyWarn(parent string, title string, detail string) string
func ReplyError(parent string, title string, detail string) string
func Reply(parent string, level LogLevel, title string, detail string) string

Reply ํ•จ์ˆ˜๋Š” ๋กœ๊ทธ๋ฅผ ๋ถ€๋ชจ ๋กœ๊ทธ ID์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

QA ํ•จ์ˆ˜
func AskQA(channel string, managers []string, title string, detail string) string
func SendQA(level LogLevel, channel string, managers []string, title string, detail string) string
func ReplyQA(parent string, channel string, managers []string, title string, detail string) string
func SendReplyQa(parent string, channel string, managers []string, level LogLevel, title string, detail string) string

QA ํ•จ์ˆ˜๋Š” ์ฑ„๋„๊ณผ ๋‹ด๋‹น์ž๋ฅผ ์ง€์ •ํ•˜์—ฌ QA ์ „์šฉ ๋ฉ”์‹œ์ง€๋ฅผ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.

์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜
func Trace(err ...error) string

๋””๋ฒ„๊น…์„ ์œ„ํ•œ ์Šคํƒ ํŠธ๋ ˆ์ด์Šค ์ •๋ณด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ” ๊ณ ์œ  ๋กœ๊ทธ ID ์ƒ์„ฑ

EL ๋กœ๊ฑฐ๋Š” title:detail:timestamp์˜ SHA256 ํ•ด์‹œ๋กœ ๊ณ ์œ  ID๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค:

// ํ˜•์‹: #์•ฑ์ด๋ฆ„-ํ•ด์‹œ (SHA256 ์ฒซ 8๋ฐ”์ดํŠธ์˜ 16์ง„์ˆ˜ ๋ฌธ์ž 16๊ฐœ)
// ์˜ˆ์‹œ: #my-service-a1b2c3d4e5f6g7h8

์žฅ์ :

  • ๊ณ ์œ ์„ฑ: ํƒ€์ž„์Šคํƒฌํ”„๋กœ ๋™์ผํ•œ title+detail๋„ ๊ณ ์œ  ID ๋ณด์žฅ
  • ์ถ”์ ์„ฑ: ์•ฑ ์ด๋ฆ„ ์ ‘๋‘์‚ฌ๋กœ ์‰ฌ์šด ์‹๋ณ„
  • ๊ฐ„๊ฒฐํ•จ: 16์ž ํ•ด์‹œ๋กœ ๊ฐ€๋…์„ฑ ํ™•๋ณด

๐ŸŒ ์„œ๋ฒ„ ์„ค์ •

๋ชจ๋“œ ์„œ๋ฒ„
PROD ํ”„๋กœ๋•์…˜ gRPC ์„œ๋ฒ„ (์ž๋™ TLS)
STAGE ์Šคํ…Œ์ด์ง• gRPC ์„œ๋ฒ„ (์ž๋™ TLS)
๊ธฐํƒ€ ๋กœ์ปฌ stdout๋งŒ (์›๊ฒฉ ์ „์†ก ์—†์Œ)

๐ŸŽฏ ์‚ฌ์šฉ ์‚ฌ๋ก€

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ชจ๋‹ˆํ„ฐ๋ง
id := el.Info("์‚ฌ์šฉ์ž ํ™œ๋™", "์‚ฌ์šฉ์ž john.doe๊ฐ€ IP 192.168.1.100์—์„œ ๋กœ๊ทธ์ธํ–ˆ์Šต๋‹ˆ๋‹ค")
el.ReplyInfo(id, "์„ธ์…˜ ์ƒ์„ฑ", "24์‹œ๊ฐ„ ๋งŒ๋ฃŒ์˜ ์ƒˆ ์„ธ์…˜์ด ์ƒ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค")
์ปจํ…์ŠคํŠธ๊ฐ€ ์žˆ๋Š” ์˜ค๋ฅ˜ ์ถ”์ 
errId := el.Error("๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ", "์ฃผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ์‹คํŒจ")
el.ReplyWarn(errId, "ํด๋ฐฑ ํ™œ์„ฑํ™”", "๋ฐฑ์—… ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ์ „ํ™˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค")
el.ReplyInfo(errId, "๋ณต๊ตฌ ์™„๋ฃŒ", "์ฃผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ์ด ๋ณต๊ตฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค")
๋น„์ฆˆ๋‹ˆ์Šค ํ”„๋กœ์„ธ์Šค ์ถ”์ 
orderId := el.Info("์ฃผ๋ฌธ ์ƒ์„ฑ", "๊ณ ๊ฐ john@example.com์˜ ์ƒˆ ์ฃผ๋ฌธ #12345")
el.ReplyInfo(orderId, "๊ฒฐ์ œ ์‹œ์ž‘", "๊ฒฐ์ œ ์ฒ˜๋ฆฌ๊ฐ€ ์‹œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค")
el.ReplyInfo(orderId, "๊ฒฐ์ œ ์„ฑ๊ณต", "$99.99 ๊ฒฐ์ œ๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค")
el.ReplyInfo(orderId, "๋ฐฐ์†ก", "FedEx ์šด์†ก์žฅ #ABC123์œผ๋กœ ๋ฐฐ์†ก๋˜์—ˆ์Šต๋‹ˆ๋‹ค")
QA ์ด์Šˆ ์ถ”์ 
qaId := el.AskQA("#bug-report", []string{"dev-team"}, "UI ๋ฒ„๊ทธ", "๋ชจ๋ฐ”์ผ์—์„œ ๋ฒ„ํŠผ์ด ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค")
el.ReplyQA(qaId, "#bug-report", []string{"dev-team"}, "๋ถ„์„ ์ค‘", "์žฌํ˜„ ํ™˜๊ฒฝ์„ ํ™•์ธํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค")
el.ReplyQA(qaId, "#bug-report", []string{"dev-team"}, "ํ•ด๊ฒฐ ์™„๋ฃŒ", "CSS ์ˆ˜์ •์œผ๋กœ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค")

๐Ÿงช ํ…Œ์ŠคํŠธ

go test ./el -v

๐Ÿ Python ํŒจํ‚ค์ง€

ezar-logger๋Š” Python์—์„œ๋„ ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์„ค์น˜ (uv ์‚ฌ์šฉ)
# SSH ๋ฐฉ์‹
uv pip install "ezar-logger @ git+ssh://git@bitbucket.org/ezardev-admin/ezar-logger.git#subdirectory=python"

# HTTPS ๋ฐฉ์‹
uv pip install "ezar-logger @ git+https://bitbucket.org/ezardev-admin/ezar-logger.git#subdirectory=python"
pyproject.toml ์˜์กด์„ฑ์œผ๋กœ ์ถ”๊ฐ€
dependencies = [
    "ezar-logger @ git+ssh://git@bitbucket.org/ezardev-admin/ezar-logger.git#subdirectory=python",
]
Python ์‚ฌ์šฉ๋ฒ•
import ezar_logger as el

# ๋กœ๊ฑฐ ์ดˆ๊ธฐํ™”
el.init_logger("#my-app", "PROD")

# ๊ธฐ๋ณธ ๋กœ๊ทธ
log_id = el.info("์ž‘์—… ์‹œ์ž‘", "๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค")
el.warn("๊ฒฝ๊ณ ", "๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ๋†’์Šต๋‹ˆ๋‹ค")
el.error("์˜ค๋ฅ˜", "๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ์‹คํŒจ")

# ์‘๋‹ต ๋กœ๊ทธ (์ด์ „ ๋กœ๊ทธ์— ์—ฐ๊ฒฐ)
el.reply_info(log_id, "์ž‘์—… ์™„๋ฃŒ", "100๊ฑด ์ฒ˜๋ฆฌ ์™„๋ฃŒ")
el.reply_warn(log_id, "๋ถ€๋ถ„ ์™„๋ฃŒ", "์ผ๋ถ€ ํ•ญ๋ชฉ ๊ฑด๋„ˆ๋œ€")
el.reply_error(log_id, "์ž‘์—… ์‹คํŒจ", "์ฒ˜๋ฆฌ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ")

# ์—๋Ÿฌ ๋กœ๊ทธ์™€ ์Šคํƒ ํŠธ๋ ˆ์ด์Šค
try:
    raise ValueError("์˜ˆ์‹œ ์˜ค๋ฅ˜")
except Exception as e:
    el.error("์˜ค๋ฅ˜ ๋ฐœ์ƒ", el.trace(e))

# QA ์•Œ๋ฆผ (์Šฌ๋ž™ ์ฑ„๋„๊ณผ ๋‹ด๋‹น์ž ์ง€์ •)
el.ask_qa("qa-channel", ["@manager1", "@manager2"], "๋ฆฌ๋ทฐ ์š”์ฒญ", "PR #123 ๊ฒ€ํ†  ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค")
el.reply_qa(log_id, "qa-channel", ["@manager1"], "๋ฆฌ๋ทฐ ์™„๋ฃŒ", "์Šน์ธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค")
Python API ๋งคํ•‘
Go Python
el.InitLogger() el.init_logger()
el.Info() el.info()
el.Warn() el.warn()
el.Error() el.error()
el.ReplyInfo() el.reply_info()
el.ReplyWarn() el.reply_warn()
el.ReplyError() el.reply_error()
el.AskQA() el.ask_qa()
el.ReplyQA() el.reply_qa()
el.Trace() el.trace()

์ž์„ธํ•œ Python ์‚ฌ์šฉ๋ฒ•์€ python/README.md๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

๐Ÿ“ˆ ์„ฑ๋Šฅ ํŠน์ง•

  • ์ง€์—ฐ ์—ฐ๊ฒฐ: ์ฒซ ๋กœ๊ทธ ์ „์†ก ์‹œ gRPC ์—ฐ๊ฒฐ ์ˆ˜๋ฆฝ
  • ์ž๋™ ์žฌ์—ฐ๊ฒฐ: ์—ฐ๊ฒฐ ๋Š๊น€ ์‹œ ์ž๋™ ์žฌ์—ฐ๊ฒฐ
  • 30์ดˆ ํƒ€์ž„์•„์›ƒ: ์•ˆ์ •์„ฑ์„ ์œ„ํ•œ ์„ค์ • ๊ฐ€๋Šฅํ•œ ํƒ€์ž„์•„์›ƒ
  • ๋น„์ฐจ๋‹จ ์˜ค๋ฅ˜: ์‹คํŒจํ•œ ์ž‘์—…์€ ๋กœ์ปฌ์— ๋กœ๊น…, ์•ฑ ํฌ๋ž˜์‹œ ์—†์Œ

๐Ÿ”’ ๋ณด์•ˆ

  • ๋‹จ๋ฐฉํ–ฅ ์•”ํ˜ธํ™”: ๋กœ๊ทธ ID๋Š” SHA256 ํ•ด์‹ฑ ์‚ฌ์šฉ (์—ญ์‚ฐ ๋ถˆ๊ฐ€)
  • ์ž๋™ TLS: ํ”„๋กœ๋•์…˜ ์„œ๋ฒ„(*.ezar.co.kr)์— TLS ์ž๋™ ํ™œ์„ฑํ™”
  • ์•ˆ์ „ํ•œ ๋กœ๊น…: ์‹คํŒจํ•œ ์ž‘์—…์€ stdout์— ๋กœ๊น…

๐Ÿ“ ๋ณ€๊ฒฝ ์ด๋ ฅ

v1.5.0
  • QA ๋กœ๊ทธ ๋ ˆ๋ฒจ ์ถ”๊ฐ€
  • AskQA, ReplyQA ํ•จ์ˆ˜ ์ถ”๊ฐ€ (์ฑ„๋„, ๋‹ด๋‹น์ž ์ง€์ • ๊ฐ€๋Šฅ)
  • QaQueue ๊ตฌ์กฐ์ฒด ์ถ”๊ฐ€ (Channel, Managers ํ•„๋“œ)
  • gRPC LogQue ๋ฉ”์‹œ์ง€์— channel, managers ํ•„๋“œ ์ง€์›
  • ezar-grpc v1.18.2๋กœ ์—…๊ทธ๋ ˆ์ด๋“œ
v1.4.0
  • ๋ชจ๋“  ๋กœ๊น… ํ•จ์ˆ˜(Info, Warn, Error)๊ฐ€ ๋กœ๊ทธ ID ๋ฐ˜ํ™˜
v1.3.1
  • Parent ํ•„๋“œ๋ฅผ ํ†ตํ•œ Reply ์ฒด์ธ ์ง€์› ์ถ”๊ฐ€
  • Type(MSG/REPLY)๊ณผ Status(PENDING) ํ•„๋“œ ์ถ”๊ฐ€
  • ezar-grpc v1.13.3์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œ
  • UpdateLog ๊ธฐ๋Šฅ ์ œ๊ฑฐ
v1.3.0
  • ์ดˆ๊ธฐ gRPC ํด๋ผ์ด์–ธํŠธ ๊ตฌํ˜„
  • SHA256 ๊ธฐ๋ฐ˜ ๊ณ ์œ  ๋กœ๊ทธ ID
  • ๋‹ค์ค‘ ํ™˜๊ฒฝ ์ง€์› (PROD/STAGE/DEV)

๐Ÿ“„ ๋ผ์ด์„ ์Šค

์ด ํ”„๋กœ์ ํŠธ๋Š” MIT ๋ผ์ด์„ ์Šค๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค - ์ž์„ธํ•œ ๋‚ด์šฉ์€ LICENSE ํŒŒ์ผ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

๐Ÿ†˜ ์ง€์›

  • Bitbucket์—์„œ ์ด์Šˆ ์ƒ์„ฑ
  • ์˜ˆ์ œ ๋ฐ ํ…Œ์ŠคํŠธ ํŒŒ์ผ ์ฐธ์กฐ

Directories ยถ

Path Synopsis
Package ezarlogger provides a simple and flexible logging utility for Go applications.
Package ezarlogger provides a simple and flexible logging utility for Go applications.
internal
pkg

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL