Skip to content

Commit 83a5d73

Browse files
authored
Merge pull request #298 from nais/logrotate-fixes
2 parents 15ad5f9 + d76594f commit 83a5d73

File tree

9 files changed

+146
-26
lines changed

9 files changed

+146
-26
lines changed

cmd/device-agent/main.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,8 @@ func main() {
6161
programContext, programCancel := context.WithCancel(context.Background())
6262
handleSignals(programCancel)
6363

64-
logDir := filepath.Join(cfg.ConfigDir, "logs")
65-
logger.SetupLogger(cfg.LogLevel, logDir, "agent")
64+
logDir := filepath.Join(cfg.ConfigDir, logger.LogDir)
65+
logger.SetupLogger(cfg.LogLevel, logDir, logger.Agent)
6666

6767
cfg.PopulateAgentConfiguration()
6868

cmd/helper/main.go

+5-4
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,16 @@ import (
88
"syscall"
99
"time"
1010

11+
log "github.com/sirupsen/logrus"
12+
flag "github.com/spf13/pflag"
13+
"google.golang.org/grpc"
14+
1115
"github.com/nais/device/pkg/helper"
1216
"github.com/nais/device/pkg/helper/config"
1317
"github.com/nais/device/pkg/logger"
1418
"github.com/nais/device/pkg/pb"
1519
"github.com/nais/device/pkg/unixsocket"
1620
"github.com/nais/device/pkg/version"
17-
log "github.com/sirupsen/logrus"
18-
flag "github.com/spf13/pflag"
19-
"google.golang.org/grpc"
2021
)
2122

2223
var cfg = helper.Config{}
@@ -38,7 +39,7 @@ func main() {
3839

3940
osConfigurator := helper.New(cfg)
4041

41-
logger.SetupLogger(cfg.LogLevel, config.LogDir, "helper")
42+
logger.SetupLogger(cfg.LogLevel, config.LogDir, logger.Helper)
4243

4344
log.Infof("naisdevice-helper %s starting up", version.Version)
4445
log.Infof("configuration: %+v", cfg)

cmd/systray/main.go

+5-4
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,14 @@ import (
1010
"syscall"
1111
"time"
1212

13+
log "github.com/sirupsen/logrus"
14+
flag "github.com/spf13/pflag"
15+
1316
"github.com/nais/device/pkg/config"
1417
"github.com/nais/device/pkg/logger"
1518
"github.com/nais/device/pkg/notify"
1619
"github.com/nais/device/pkg/systray"
1720
"github.com/nais/device/pkg/version"
18-
log "github.com/sirupsen/logrus"
19-
flag "github.com/spf13/pflag"
2021
)
2122

2223
func handleSignals(cancel context.CancelFunc) {
@@ -61,8 +62,8 @@ func main() {
6162
flag.StringVar(&cfg.GrpcAddress, "grpc-address", cfg.GrpcAddress, "path to device-agent unix socket")
6263
flag.Parse()
6364

64-
logDir := filepath.Join(cfg.ConfigDir, "logs")
65-
logger.SetupLogger(cfg.LogLevel, logDir, "systray")
65+
logDir := filepath.Join(cfg.ConfigDir, logger.LogDir)
66+
logger.SetupLogger(cfg.LogLevel, logDir, logger.Systray)
6667

6768
conn, err := net.Dial("unix", cfg.GrpcAddress)
6869
if err != nil {

pkg/device-agent/eventloop.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -317,7 +317,7 @@ func (das *DeviceAgentServer) EventLoop(ctx context.Context) {
317317
case codes.OK:
318318
attempt = 0
319319
case codes.Unavailable:
320-
log.Warnf("Synchronize config: not connected to API server!")
320+
log.Warnf("Synchronize config: not connected to API server: %v", err)
321321
time.Sleep(apiServerRetryInterval)
322322
case codes.Unauthenticated:
323323
log.Errorf("Logging in: %s", err)

pkg/logger/agent_2020-12-31.log

Whitespace-only changes.

pkg/logger/logger.go

+12-4
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,17 @@ import (
1010
easy "github.com/t-tomalak/logrus-easy-formatter"
1111
)
1212

13-
const logfileMaxAge = time.Hour * 24 * 7
13+
const (
14+
Agent = "agent"
15+
Helper = "helper"
16+
Systray = "systray"
1417

15-
func SetupLogger(level, logDir, name string) {
18+
LogDir = "logs"
19+
20+
logfileMaxAge = time.Hour * 24 * 7
21+
)
22+
23+
func SetupLogger(level, logDir, prefix string) {
1624
err := os.MkdirAll(logDir, 0o755)
1725
if err != nil {
1826
log.Fatalf("Creating log dir: %v", err)
@@ -24,9 +32,9 @@ func SetupLogger(level, logDir, name string) {
2432
}
2533

2634
// clean up old log file without date
27-
_ = os.Remove(filepath.Join(logDir, name+".log"))
35+
_ = os.Remove(filepath.Join(logDir, prefix+".log"))
2836

29-
filename := createLogFileName(name, time.Now())
37+
filename := createLogFileName(prefix, time.Now())
3038
logFilePath := filepath.Join(logDir, filename)
3139

3240
logFile, err := os.OpenFile(logFilePath, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0o664)

pkg/logger/logger_test.go

+68
Original file line numberDiff line numberDiff line change
@@ -107,3 +107,71 @@ func TestRotate(t *testing.T) {
107107
}
108108

109109
}
110+
111+
func TestLatestFilename(t *testing.T) {
112+
now, err := time.Parse(time.DateOnly, "2021-01-05")
113+
assert.NoError(t, err)
114+
existingFiles := []string{
115+
createLogFileName("agent", now),
116+
createLogFileName("agent", now.Add(-time.Hour*24*3)),
117+
createLogFileName("systray", now),
118+
createLogFileName("systray", now.Add(-time.Hour*24*3)),
119+
createLogFileName("helper", now),
120+
createLogFileName("helper", now.Add(-time.Hour*24*4)),
121+
}
122+
123+
tests := []struct {
124+
name string
125+
prefix string
126+
files []string
127+
want string
128+
}{
129+
{
130+
name: "latest agent file name",
131+
prefix: "agent",
132+
files: existingFiles,
133+
want: createLogFileName("agent", now),
134+
},
135+
{
136+
name: "latest helper file name",
137+
prefix: "helper",
138+
files: existingFiles,
139+
want: createLogFileName("helper", now),
140+
},
141+
{
142+
name: "latest systray file name",
143+
prefix: "systray",
144+
files: existingFiles,
145+
want: createLogFileName("systray", now),
146+
},
147+
{
148+
name: "current date if no matching files",
149+
prefix: "systray",
150+
files: []string{
151+
createLogFileName("agent", now),
152+
createLogFileName("agent", now.Add(-time.Hour*24*3)),
153+
createLogFileName("helper", now),
154+
createLogFileName("helper", now.Add(-time.Hour*24*4)),
155+
},
156+
want: createLogFileName("systray", time.Now()),
157+
},
158+
}
159+
160+
for _, tt := range tests {
161+
t.Run(tt.name, func(t *testing.T) {
162+
testDir := t.TempDir()
163+
assert.NoError(t, err)
164+
165+
err := os.Chdir(testDir)
166+
assert.NoError(t, err)
167+
168+
for _, fileName := range tt.files {
169+
_, err = os.Create(fileName)
170+
assert.NoError(t, err)
171+
}
172+
173+
actual := LatestFilename(testDir, tt.prefix)
174+
assert.Equal(t, tt.want, actual)
175+
})
176+
}
177+
}

pkg/logger/rotate.go

+38
Original file line numberDiff line numberDiff line change
@@ -60,3 +60,41 @@ func filterOldFilesByDate(files []os.DirEntry, treshold time.Time) ([]os.DirEntr
6060
func createLogFileName(prefix string, t time.Time) string {
6161
return fmt.Sprintf("%s_%s.log", prefix, t.Format(time.DateOnly))
6262
}
63+
64+
func LatestFilepath(logDirPath, prefix string) string {
65+
return filepath.Join(logDirPath, LatestFilename(logDirPath, prefix))
66+
}
67+
68+
func LatestFilename(logDirPath, prefix string) string {
69+
logFiles, err := os.ReadDir(logDirPath)
70+
if err != nil {
71+
log.Errorf("open log dir: %v", err)
72+
}
73+
74+
newestFilename := createLogFileName(prefix, time.Now())
75+
newestDate := time.Time{}
76+
77+
filenameFormat := regexp.MustCompile(fmt.Sprintf(`^(%s)_(\d{4}-\d{2}-\d{2})\.log$`, prefix))
78+
79+
for _, logFile := range logFiles {
80+
matches := filenameFormat.FindAllStringSubmatch(logFile.Name(), -1)
81+
if len(matches) != 1 || len(matches[0]) != 3 {
82+
log.Debug("ignoring file: ", logFile)
83+
continue
84+
}
85+
86+
date := matches[0][2]
87+
logDate, err := time.Parse(time.DateOnly, date)
88+
if err != nil {
89+
log.Errorf("inferring latest log file: unable to parse date: %q, err: %v", date, err)
90+
continue
91+
}
92+
93+
if logDate.After(newestDate) {
94+
newestDate = logDate
95+
newestFilename = logFile.Name()
96+
}
97+
}
98+
99+
return newestFilename
100+
}

pkg/systray/gui.go

+15-11
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ import (
1111
"time"
1212

1313
"github.com/nais/device/pkg/helper"
14+
helperconfig "github.com/nais/device/pkg/helper/config"
15+
"github.com/nais/device/pkg/logger"
1416

1517
"github.com/nais/device/assets"
1618
"github.com/nais/device/pkg/device-agent/open"
@@ -421,23 +423,24 @@ func (gui *Gui) handleGuiEvent(guiEvent GuiEvent) {
421423
}
422424

423425
case HelperLogClicked:
424-
err := open.Open(filepath.Join(gui.Config.ConfigDir, "logs", "helper.log"))
426+
err := open.Open(logger.LatestFilepath(helperconfig.LogDir, logger.Helper))
425427
if err != nil {
426-
log.Warn("opening device agent helper log: %w", err)
428+
log.Warnf("opening device agent helper log: %v", err)
427429
}
428430

429431
case DeviceLogClicked:
430-
err := open.Open(filepath.Join(gui.Config.ConfigDir, "logs", "agent.log"))
432+
logDirPath := filepath.Join(gui.Config.ConfigDir, logger.LogDir)
433+
err := open.Open(logger.LatestFilepath(logDirPath, logger.Agent))
431434
if err != nil {
432-
log.Warn("opening device agent log: %w", err)
435+
log.Warnf("opening device agent log: %v", err)
433436
}
434437

435438
case ZipLogsClicked:
436-
logDir := filepath.Join(gui.Config.ConfigDir, "logs")
439+
userLogDirPath := filepath.Join(gui.Config.ConfigDir, logger.LogDir)
437440
logFiles := [3]string{
438-
filepath.Join(logDir, "helper.log"),
439-
filepath.Join(logDir, "agent.log"),
440-
filepath.Join(logDir, "systray.log"),
441+
logger.LatestFilepath(userLogDirPath, logger.Agent),
442+
logger.LatestFilepath(helperconfig.LogDir, logger.Helper),
443+
logger.LatestFilepath(userLogDirPath, logger.Systray),
441444
}
442445
zipLocation, err := helper.ZipLogFiles(logFiles[:])
443446
if err != nil {
@@ -449,15 +452,16 @@ func (gui *Gui) handleGuiEvent(guiEvent GuiEvent) {
449452
}
450453

451454
case LogClicked:
452-
err := open.Open(filepath.Join(gui.Config.ConfigDir, "logs", "systray.log"))
455+
logDirPath := filepath.Join(gui.Config.ConfigDir, logger.LogDir)
456+
err := open.Open(logger.LatestFilepath(logDirPath, logger.Systray))
453457
if err != nil {
454-
log.Warn("opening device agent log: %w", err)
458+
log.Warnf("opening systray log: %v", err)
455459
}
456460

457461
case AcceptableUseClicked:
458462
err := open.Open("https://naisdevice-approval.nais.io/")
459463
if err != nil {
460-
log.Warn("opening device agent log: %w", err)
464+
log.Warnf("opening naisdevice approval page: %v", err)
461465
}
462466
case QuitClicked:
463467
_, err := gui.DeviceAgentClient.Logout(context.Background(), &pb.LogoutRequest{})

0 commit comments

Comments
 (0)