I write logs to files that are generated daily (one log file is generated per day). This approach works well for me:
var ( serverLogger *log.Logger ) func init() { // set location of log file date := time.Now().Format("2006-01-02") var logpath = os.Getenv(constant.XDirectoryPath) + constant.LogFilePath + date + constant.LogFileExtension os.MkdirAll(os.Getenv(constant.XDirectoryPath)+constant.LogFilePath, os.ModePerm) flag.Parse() var file, err1 = os.OpenFile(logpath, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666) if err1 != nil { panic(err1) } mw := io.MultiWriter(os.Stdout, file) serverLogger = log.New(mw, constant.Empty, log.LstdFlags) serverLogger.Println("LogFile : " + logpath) } // LogServer logs to server log file func LogServer(logLevel enum.LogLevel, message string) { _, file, no, ok := runtime.Caller(1) logLineData := "logger_server.go" if ok { file = shortenFilePath(file) logLineData = fmt.Sprintf(file + constant.ColonWithSpace + strconv.Itoa(no) + constant.HyphenWithSpace) } serverLogger.Println(logLineData + logLevel.String() + constant.HyphenWithSpace + message) } // ShortenFilePath Shortens file path to a/b/c/d.go tp d.go func shortenFilePath(file string) string { short := file for i := len(file) - 1; i > 0; i-- { if file[i] == constant.ForwardSlash { short = file[i+1:] break } } file = short return file }
The "shorttenFilePath ()" method used to get the file name from the full path to the file. and the LogServer () method is used to create a formatted log statement (contains: file name, line number, log level, error statement, etc.)
Hardik Bohra Mar 21 '19 at 9:48 2019-03-21 09:48
source share