Skip to content

Commit

Permalink
Add: new post
Browse files Browse the repository at this point in the history
  • Loading branch information
Hayao0819 committed Sep 9, 2024
1 parent 647bcfc commit cb26782
Show file tree
Hide file tree
Showing 3 changed files with 143 additions and 56 deletions.
3 changes: 2 additions & 1 deletion .markdownlint.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,6 @@
"MD033": false,
"line-length": false,
"no-bare-urls": false,
"single-h1": false
"single-h1": false,
"MD010": false
}
110 changes: 55 additions & 55 deletions posts/20240907/golang-library/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -63,18 +63,18 @@ Cobraはサブコマンドを実装するためのライブラリです。`cobra
package main

import (
"fmt"
"os"
"fmt"
"os"

"myproject/cmd"
_ "myproject/log"
"myproject/cmd"
_ "myproject/log"
)

func main() {
if err := cmd.Execute(); err != nil {
fmt.Fprintf(os.Stderr, "%+v\n", err)
os.Exit(-1)
}
if err := cmd.Execute(); err != nil {
fmt.Fprintf(os.Stderr, "%+v\n", err)
os.Exit(-1)
}
}
```

Expand All @@ -90,15 +90,15 @@ func main() {
package log

import (
"log/slog"
"log/slog"

"github.com/m-mizutani/clog"
"github.com/m-mizutani/clog"
)

func init() {
handler := clog.New(clog.WithColor(true))
logger := slog.New(handler)
slog.SetDefault(logger)
handler := clog.New(clog.WithColor(true))
logger := slog.New(handler)
slog.SetDefault(logger)
}
```

Expand Down Expand Up @@ -126,22 +126,22 @@ Cobraにおいてはサブコマンドは`cobra.Command`を入れ子にすると
package cmd

import (
"github.com/Hayao0819/nahi/cobrautils"
"github.com/spf13/cobra"
"github.com/Hayao0819/nahi/cobrautils"
"github.com/spf13/cobra"
)

var subCmds = cobrautils.Registory{}

func rootCmd() *cobra.Command {
root := cobra.Command{
Use: "go-cobra",
Short: "go-cobra command",
SilenceUsage: true,
SilenceErrors: true,
}

subCmds.Bind(&root)
return &root
root := cobra.Command{
Use: "go-cobra",
Short: "go-cobra command",
SilenceUsage: true,
SilenceErrors: true,
}

subCmds.Bind(&root)
return &root
}
```

Expand All @@ -155,7 +155,7 @@ cmdパッケージで唯一パブリックになるのがこの`Execute() error`
package cmd

func Execute() error {
return rootCmd().Execute()
return rootCmd().Execute()
}
```

Expand All @@ -169,17 +169,17 @@ package hello
import "github.com/spf13/cobra"

func Cmd() *cobra.Command {
cmd := cobra.Command{
Use: "hello",
Short: "hello command",
RunE: func(cmd *cobra.Command, args []string) error {
// Do something
cmd.Println("Hello, hoge!")
return nil
},
}

return &cmd
cmd := cobra.Command{
Use: "hello",
Short: "hello command",
RunE: func(cmd *cobra.Command, args []string) error {
// Do something
cmd.Println("Hello, hoge!")
return nil
},
}

return &cmd
}
```

Expand All @@ -197,7 +197,7 @@ package cmd
import "github.com/Hayao0819/scaffold/go-cobra/cmd/hoge"

func init() {
subCmds.Add(hoge.Cmd())
subCmds.Add(hoge.Cmd())
}
```

Expand All @@ -213,33 +213,33 @@ func init() {
package hoge

import (
"os"
"os"

"github.com/cockroachdb/errors"
"github.com/spf13/cobra"
"github.com/cockroachdb/errors"
"github.com/spf13/cobra"
)

func Cmd() *cobra.Command {
cmd := cobra.Command{
Use: "hoge",
Short: "hoge command",
RunE: func(cmd *cobra.Command, args []string) error {
// Do something
cmd.Println("Hello, hoge!")
Use: "hoge",
Short: "hoge command",
RunE: func(cmd *cobra.Command, args []string) error {
// Do something
cmd.Println("Hello, hoge!")

// Handle error
pwd, err := os.Getwd()
if err != nil {
return errors.Wrap(err, "failed to get current directory")
}
// Handle error
pwd, err := os.Getwd()
if err != nil {
return errors.Wrap(err, "failed to get current directory")
}

cmd.Println(pwd)
cmd.Println(pwd)

return nil
},
}
return nil
},
}

return &cmd
return &cmd
}
```

Expand Down
86 changes: 86 additions & 0 deletions posts/20240909/slog-color-multi/index.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
---
title: Goのslogで色を付けつつファイルにも出力する
description: ""
date: 2024-09-09T17:07:33.523941+09:00
categories:
- 技術系
tags:
- Golang
draft: false
publish: true
---

最近、Goに`log/slog`という構造化ロガーが登場し、InfoやDebugなどのラベル付けやグループ分けをするロギングが簡単にできるようになりました。

slogは単体ではまだ少々貧弱ですが、非常に柔軟性の高いインターフェースを実装しているので外部ライブラリによって使いやすくすることができます。

今回は私がよく使っている2つのライブラリを組み合わせます。

## 色を付ける

[`github.com/m-mizutani/clog`](https://github.com/m-mizutani/clog)はカラフルでConfigurableな`slog.Handler`を実装しているライブラリです。なんと日本人の方が作っています。

細かい使い方は作者さんがZennで紹介されているので、そちらを御覧ください。

[Go公式の構造化ロガー(予定)のslogの出力を見やすくしてみる](https://zenn.dev/mizutani/articles/golang-clog-handler)

## 複数のHandlerに対応する

`log/slog`は現状1つのLoggerにつき1つのHandlerしか対応していません。そのため複数箇所に出力をしたいという場合には、専用のHandlerを作成する必要があります。

[`github.com/samber/slog-multi`](https://github.com/samber/slog-multi)は複数のHandlerをまとめ上げて1つの新しいHandlerを生成してくれるライブラリです。

余談なのですが、自分がよく使っている`github.com/samber/lo`というForEachやFilterを提供してくれるライブラリと同じ作者のもので非常にびっくりしています。

## 組み合わせる

これら2つを組み合わせます。`clog.Handler``slog.Handler`を実装しているので、簡単に組み合わせて使えます。

```go
package main

import (
"log/slog"
"os"

"github.com/m-mizutani/clog"
slogmulti "github.com/samber/slog-multi"
)

func coloredLogger() slog.Handler {
handler := clog.New(clog.WithColor(true))
return slog.Handler(handler)
}

func fileLogger(f *os.File) slog.Handler {
return slog.Handler(slog.NewTextHandler(f, nil))
}

func handleError(err error) {
if err != nil {
panic(err)
}
}

func main() {
f, err := os.Create("log.txt")
handleError(err)
defer f.Close()

singleHandler := slogmulti.Fanout(
coloredLogger(),
fileLogger(f),
)

logger := slog.New(singleHandler)
slog.SetDefault(logger)

slog.Info("Hello, world")
slog.Warn("Hello, world")
slog.Error("Hello, world")
}
```

2つの外部パッケージがここまでいい感じに組み合わさるのも、`log/slog`の柔軟な型定義のおかげ。

非常にいい感じでかっこいいロギングができるので参考になれば良いなと思います。

0 comments on commit cb26782

Please sign in to comment.