Go言語(プログラミング)入門メモ⑤

## logパッケージを使用したログの出力
アプリケーションに障害が発生した場合の原因究明にログの処理が必要になる。
このときにlogパッケージを使用する。以下はlog.Printlnの例。

~~~
import "log"
func main () {
    log.Println("logging!")
}
//日付と時間といった情報とともに指定した内容が出力される
2025/01/07 08:00:01 logging!
~~~
log.Printlnをlog.Printfに変えてみる。log.Printfの場合、type(型)とvalue(値)の情報が出力できる。
~~~
log.Printf("%T %v, "test", "test")
//以下のように出力される
2025/01/07 08:00:01 string test
~~~
log.Fatallnはエラーの出力によく使用される
~~~
log.Fatalln("error!!")
//
2025/01/07 08:00:01 error!!
~~~
ただし、log.Fatallnを実行するとプログラムは終了する。つまり、log.Fatallnの後に処理を記載しても実行されない。
~~~
log.Printf("%T %v, "test", "test")
log.Fatalln("error!!")
log.Println("ok")
//2行目で処理は終了するのでokは出力されない
2025/01/07 08:00:01 string test
2025/01/07 08:00:01 error!!
~~~

## log.Fatallnやlog.Fatalfの使用例
ファイルを開くプログラムのなかでlog.Fatallnを使用。os.Openを使用してファイルを開くが今回はエラーの内容を確認するために、ファイルを読み込む変数には_を、エラーを読み込む変数にはerrを指定する。これにより、エラーがあれば変数errにエラーの内容が代入される。
os.Openの対象には、存在しないファイル名を書く。その後変数errがnilではない(エラーがある)場合、log.Fatallnで「Exit」と変数errの内容を出力してプログラムを終了する。
~~~
import (
    "fmt"
    "log"
    "os"
)

func main () {
    _.err := os.Opem("drfdec") //存在しないファイルを指定
    if err != nil{   //エラーがあるかを確認
    log.Fatalln("Exit", err) //log.Fatallnが実行されプログラム終了
    }
    log.Println("logging")
}
//以下のように出力される
2025/01/07 08:00:01 Exit open drfdec: no such file or directory
~~~
## ログをファイルに書き込む
以下のコードではtest.logというファイルを作成してログの内容を書き込んでいる
~~~
import(
    "fmt"
    "io"
    "os"
    "log"
)

func LoggingSettings(LogFile string) {
    logfile, _ := os.OpenFile(logFile,os.O_RDWR|os.O_CREATE|os.O_APPEND,0666)
    multiLogFile := io.MultiWriter(os.Stdout, logfile)
    log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile)
    log.SetOutput(multiLogFile)
}

funv main() {
    LoggingSetting("test.log")
    _,err := os.Open("drfdec")
    if err != nil{   //エラーがあるかを確認
    log.Fatalln("Exit", err) 

}
//
2025/01/07 08:00:01 Exit open drfdec: no such file or director
~~~
まず、LoggingSettingsという関数を作る。この関数にはstring型の引数LogFileを渡す。ログを書き込むためのファイルをos.OpenFile関数を使って開く。os.OpenFile関数は、ファイルを開く際にフラグやモードを指定することができる。|を利用して複数のフラグを指定することもできる。
上記のコードでは、「os.O_RDWR(読み書き権限で開く)」「os.O_CREAT(ファイルが存在しなければ作成する)」「os.O_APPEND(ファイルの内容に追記する)という」3つのフラグが指定されている。
モードには「0666(すべてのユーザがファイルの読み書き可能)」指定している。
次に、io.MultiWriter関数を使い、os.Stdout(画面に出力される内容)を変数logfileに書き込むという設定を作成して、変数multiLogFileに代入する。
log.SetFlags関数では、ログ出力時の設定ができるためログ出力時の日付(log.Ldate)、ログ出力時の時間(log.Ltime)、ログの短いファイル名(log.Lshortfile)を合わせて出力する設定にした。
log.SetOutput関数の中に、変数multiLogFileを書くことでログの出力先を設定する。
最後に、main関数でLoggingSetting関数の引数にログファイル名を指定して実行する。
実行すると、指定したファイル名のログファイルが現在のフォルダに作成されて、ログ内容が書き込まれる。

## 学習に使用した教材
・『入門】Golang基礎入門 + 各種ライブラリ + 簡単なTodoWebアプリケーション開発(Go言語)』M.A EduTech
https://www.udemy.com/course/golang-webgosql/?utm_medium=udemyads&utm_source=bene-msa&utm_campaign=responsive&utm_content=top-1&utm_term=general&msclkid=81e2f24a32cc185d275d953d60760226&couponCode=NEWYEARCAREERJP

・『シリコンバレー一流プログラマーが教える Goプロフェッショナル大全』酒井 潤 (著)
https://www.amazon.co.jp/%E3%82%B7%E3%83%AA%E3%82%B3%E3%83%B3%E3%83%90%E3%83%AC%E3%83%BC%E4%B8%80%E6%B5%81%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC%E3%81%8C%E6%95%99%E3%81%88%E3%82%8B-Go%E3%83%97%E3%83%AD%E3%83%95%E3%82%A7%E3%83%83%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%AB%E5%A4%A7%E5%85%A8-%E9%85%92%E4%BA%95-%E6%BD%A4/dp/4046070897