logパッケージのLlongfileフラグを利用したり、panic()のスタックトレースにはビルド時点の環境のソースコードが”絶対パス”で埋め込まれています。この絶対パスの部分を取り除く方法について紹介します。

ログ出力やpanic()を利用した下記の例(sample.go)

package main

import (
	"log"
	"os"
)

func init() {
    log.SetOutput(os.Stdout)
    log.SetFlags(log.LstdFlags | log.Llongfile)
}

func main() {
    log.Printf("Hello World")
    panic("Panic")
}

普通にビルドすると

$ go build -o sample sample.go

このバイナリを実行すると「/Users/kawashima・・・」のように個人名などが含まれてしまいます。

goのドキュメントでは、trimpathについて下記のように紹介されています。

-trimpath
	remove all file system paths from the resulting executable.
	Instead of absolute file system paths, the recorded file names
	will begin with either "go" (for the standard library),
	or a module path@version (when using modules),
	or a plain import path (when using GOPATH).

Go.1.13の場合

下記のようにgcflags, asmflagsでtrimpathします。下記の例では、ビルドしているディレクトリ配下を取り除くようにしています。

$  go build -gcflags=-trimpath=(pwd) -asmflags=-trimpath=(pwd) -o sample sample.go 

Go.1.14以降

下記のオプションだけでGOPATHより上のパスプレフィックスを除去してくれます。Go-Moduleモードの場合は、モジュールルートより上のパスプレフィックスを削除してくれます。

$ go build -trimpath -o sample sample.go 

今回は、trimpathについて記載しました。golangでDDD、Clean Architecturenのようなアーキテクチャを採用すると似たようなファイル名が増え、Llongfileフラグ付きでログを出力したくなります。そのようなときに、trimpathを使うと見やすいログ出力や個人のビルド環境の情報が入らないようにできるのでおすすめです。