logをファイルに出力する(実用)【夏休みにGo vol.16】
こんにちは、しーたです。
今回はlogの内容をファイルに出力する方法を紹介します。
※logの基本については前回の記事を参照ください。
https://note.com/theta04/n/n9dd9aa531bb7
プログラム例・動作
プログラムに実行中に出たログを、引数に与えた名前のファイルに出力する"loggingSettings関数"を作成します。
func loggingSettings(filename string) {
logfile, _ := os.OpenFile(filename, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
multiLogFile := io.MultiWriter(os.Stdout, logfile)
log.SetFlags(log.Ldate | log.Ltime | log.Llongfile)
log.SetOutput(multiLogFile)
}
func main() {
loggingSettings("test.log")
log.Println("test start.")
fmt.Println("hello")
_, err := os.Open("./test.go")
if err != nil {
log.Fatalln("Exit", err)
}
}
実行すると"test.log"が作成され、その中に処理中のlogが出力されます。
より複雑な処理が必要な場合もありますが、基本的にはこれでlogのファイル出力ができます。
解説
一行ずつ、プログラムの意味を見ていきます。
logfile, _ := os.OpenFile(filename, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
引数で与えた名称のファイルを開いています。
"os.O_RDWR":開く際のモードです。今回はwrite onlyでもOKです。
"os.O_CREATE":ファイルが存在しない場合は、新たに作成します。
"os.O_APPEND":ファイルが既に存在する場合、末尾に書き足します。
"0666":ファイルのアクセス権限を意味しています。
unixだと"-rw-r--r--"とかで出てくるものです。先頭の0は「以下が8進数であること」を意味し、下3桁は8進数で上から順にオーナー・グループ・その他に与えられる権限を指しています。
「パーミッション・chmodってなに?」という方はこの記事が分かりやすいです。"https://webkaru.net/linux/chown-command/"
multiLogFile := io.MultiWriter(os.Stdout, logfile)
(中略)
log.SetOutput(multiLogFile)
「コンソールへのlog出力時にファイルにも出力する」という指示が書かれています。
log.SetFlags(log.Ldate | log.Ltime | log.Llongfile)
「logとして何を出力するか」が書かれています。今回は日付・時刻・ファイル名をそれぞれ詳細表示しています。
以上です!今回はよく分からなかったので父に少し教えてもらいました笑
それでは!