Skip to content

Commit 708e6e7

Browse files
committed
feat(logger): save log files into $HOME/.seshtmp when no permission for $TMPDIR
1 parent 307c5e2 commit 708e6e7

File tree

1 file changed

+28
-15
lines changed

1 file changed

+28
-15
lines changed

main.go

Lines changed: 28 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,31 @@ func init() {
3232
var err error
3333
fileOnly := false
3434

35-
if f, err = createLoggerFile(); err != nil {
36-
slog.Error("Unable to create logger file", "error", err)
37-
os.Exit(1)
35+
// TempDir returns the default directory to use for temporary files.
36+
//
37+
// On Unix systems, it returns $TMPDIR if non-empty, else /tmp.
38+
// On Windows, it uses GetTempPath, returning the first non-empty
39+
// value from %TMP%, %TEMP%, %USERPROFILE%, or the Windows directory.
40+
// On Plan 9, it returns /tmp.
41+
// It does not guarantee the user can write to the directory;
42+
userTempDir := os.TempDir()
43+
if f, err = createLoggerFile(userTempDir); err != nil {
44+
if !strings.Contains(err.Error(), "permission denied") {
45+
slog.Error("Unable to create logger file", "error", err)
46+
os.Exit(1)
47+
}
48+
49+
// If we can't write to the temp dir, try the user home dir
50+
userTempDir, err = os.UserHomeDir()
51+
if err != nil {
52+
slog.Error("Unable to get user home directory", "error", err)
53+
os.Exit(1)
54+
}
55+
56+
if f, err = createLoggerFile(userTempDir); err != nil {
57+
slog.Error("Unable to create logger file in user home directory", "error", err)
58+
os.Exit(1)
59+
}
3860
}
3961

4062
env := os.Getenv("ENV")
@@ -62,24 +84,15 @@ func init() {
6284
slog.SetDefault(slog.New(loggerHandler))
6385
}
6486

65-
func createLoggerFile() (*os.File, error) {
87+
func createLoggerFile(userTempDir string) (*os.File, error) {
6688
now := time.Now()
6789
date := fmt.Sprintf("%s.log", now.Format("2006-01-02"))
6890

69-
// TempDir returns the default directory to use for temporary files.
70-
//
71-
// On Unix systems, it returns $TMPDIR if non-empty, else /tmp.
72-
// On Windows, it uses GetTempPath, returning the first non-empty
73-
// value from %TMP%, %TEMP%, %USERPROFILE%, or the Windows directory.
74-
// On Plan 9, it returns /tmp.
75-
userTempDir := os.TempDir()
76-
slog.Debug("createLoggerFile:", "userTempDir", userTempDir)
77-
78-
if err := os.MkdirAll(path.Join(userTempDir, "sesh"), 0755); err != nil {
91+
if err := os.MkdirAll(path.Join(userTempDir, ".seshtmp"), 0755); err != nil {
7992
return nil, err
8093
}
8194

82-
fileFullPath := path.Join(userTempDir, "sesh", date)
95+
fileFullPath := path.Join(userTempDir, ".seshtmp", date)
8396
file, err := os.OpenFile(fileFullPath, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
8497
if err != nil {
8598
return nil, err

0 commit comments

Comments
 (0)