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が出力されます。

画像1

画像2

より複雑な処理が必要な場合もありますが、基本的にはこれで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として何を出力するか」が書かれています。今回は日付・時刻・ファイル名をそれぞれ詳細表示しています。



以上です!今回はよく分からなかったので父に少し教えてもらいました笑
それでは!

この記事が気に入ったらサポートをしてみませんか?