logging.go 1.86 KB
Newer Older
1
2
3
4
5
6
7
package lifecycle

import (
	"fmt"
	"log/slog"
	"os"
	"path/filepath"
8
9
	"strconv"
	"strings"
10

11
	"github.com/ollama/ollama/envconfig"
12
13
14
15
16
)

func InitLogging() {
	level := slog.LevelInfo

Michael Yang's avatar
Michael Yang committed
17
	if envconfig.Debug() {
18
19
20
21
22
23
24
25
26
27
28
		level = slog.LevelDebug
	}

	var logFile *os.File
	var err error
	// Detect if we're a GUI app on windows, and if not, send logs to console
	if os.Stderr.Fd() != 0 {
		// Console app detected
		logFile = os.Stderr
		// TODO - write one-line to the app.log file saying we're running in console mode to help avoid confusion
	} else {
29
		rotateLogs(AppLogFile)
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
		logFile, err = os.OpenFile(AppLogFile, os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0755)
		if err != nil {
			slog.Error(fmt.Sprintf("failed to create server log %v", err))
			return
		}
	}
	handler := slog.NewTextHandler(logFile, &slog.HandlerOptions{
		Level:     level,
		AddSource: true,
		ReplaceAttr: func(_ []string, attr slog.Attr) slog.Attr {
			if attr.Key == slog.SourceKey {
				source := attr.Value.Any().(*slog.Source)
				source.File = filepath.Base(source.File)
			}
			return attr
		},
	})

	slog.SetDefault(slog.New(handler))

	slog.Info("ollama app started")
}
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80

func rotateLogs(logFile string) {
	if _, err := os.Stat(logFile); os.IsNotExist(err) {
		return
	}
	index := strings.LastIndex(logFile, ".")
	pre := logFile[:index]
	post := "." + logFile[index+1:]
	for i := LogRotationCount; i > 0; i-- {
		older := pre + "-" + strconv.Itoa(i) + post
		newer := pre + "-" + strconv.Itoa(i-1) + post
		if i == 1 {
			newer = pre + post
		}
		if _, err := os.Stat(newer); err == nil {
			if _, err := os.Stat(older); err == nil {
				err := os.Remove(older)
				if err != nil {
					slog.Warn("Failed to remove older log", "older", older, "error", err)
					continue
				}
			}
			err := os.Rename(newer, older)
			if err != nil {
				slog.Warn("Failed to rotate log", "older", older, "newer", newer, "error", err)
			}
		}
	}
}