mirror of
https://github.com/garethgeorge/backrest.git
synced 2026-08-24 18:06:41 +00:00
fix: write debug-level logs to data dir on all platforms
This commit is contained in:
+40
-21
@@ -9,8 +9,8 @@ import (
|
||||
"os"
|
||||
"os/signal"
|
||||
"path"
|
||||
"path/filepath"
|
||||
"runtime"
|
||||
"strings"
|
||||
"sync"
|
||||
"sync/atomic"
|
||||
"syscall"
|
||||
@@ -32,12 +32,14 @@ import (
|
||||
"go.uber.org/zap/zapcore"
|
||||
"golang.org/x/net/http2"
|
||||
"golang.org/x/net/http2/h2c"
|
||||
"gopkg.in/natefinch/lumberjack.v2"
|
||||
)
|
||||
|
||||
var InstallDepsOnly = flag.Bool("install-deps-only", false, "install dependencies and exit")
|
||||
|
||||
func main() {
|
||||
flag.Parse()
|
||||
installLoggers()
|
||||
|
||||
resticPath, err := resticinstaller.FindOrInstallResticBinary()
|
||||
if err != nil {
|
||||
@@ -133,26 +135,6 @@ func main() {
|
||||
wg.Wait()
|
||||
}
|
||||
|
||||
func init() {
|
||||
if !strings.HasPrefix(os.Getenv("ENV"), "prod") {
|
||||
c := zap.NewDevelopmentEncoderConfig()
|
||||
c.EncodeLevel = zapcore.CapitalColorLevelEncoder
|
||||
c.EncodeTime = zapcore.ISO8601TimeEncoder
|
||||
l := zap.New(zapcore.NewCore(
|
||||
zapcore.NewConsoleEncoder(c),
|
||||
zapcore.AddSync(colorable.NewColorableStdout()),
|
||||
zapcore.DebugLevel,
|
||||
))
|
||||
zap.ReplaceGlobals(l)
|
||||
} else {
|
||||
zap.ReplaceGlobals(zap.New(zapcore.NewCore(
|
||||
zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig()),
|
||||
zapcore.AddSync(os.Stdout),
|
||||
zapcore.DebugLevel,
|
||||
)))
|
||||
}
|
||||
}
|
||||
|
||||
func createConfigProvider() config.ConfigStore {
|
||||
return &config.CachingValidatingStore{
|
||||
ConfigStore: &config.JsonFileStore{Path: env.ConfigFilePath()},
|
||||
@@ -203,3 +185,40 @@ func newForceKillHandler() func() {
|
||||
zap.S().Warn("attempting graceful shutdown, to force termination press Ctrl+C again")
|
||||
}
|
||||
}
|
||||
|
||||
func installLoggers() {
|
||||
// Pretty logging for console
|
||||
c := zap.NewDevelopmentEncoderConfig()
|
||||
c.EncodeLevel = zapcore.CapitalColorLevelEncoder
|
||||
c.EncodeTime = zapcore.ISO8601TimeEncoder
|
||||
pretty := zapcore.NewCore(
|
||||
zapcore.NewConsoleEncoder(c),
|
||||
zapcore.AddSync(colorable.NewColorableStdout()),
|
||||
zapcore.InfoLevel,
|
||||
)
|
||||
|
||||
// JSON logging to log directory
|
||||
logsDir := env.LogsPath()
|
||||
if err := os.MkdirAll(logsDir, 0755); err != nil {
|
||||
zap.ReplaceGlobals(zap.New(pretty))
|
||||
zap.S().Errorf("error creating logs directory %q, will only log to console for now: %v", err)
|
||||
return
|
||||
}
|
||||
|
||||
writer := &lumberjack.Logger{
|
||||
Filename: filepath.Join(logsDir, "backrest.log"),
|
||||
MaxSize: 5, // megabytes
|
||||
MaxBackups: 3,
|
||||
MaxAge: 14,
|
||||
Compress: true,
|
||||
}
|
||||
|
||||
ugly := zapcore.NewCore(
|
||||
zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig()),
|
||||
zapcore.AddSync(writer),
|
||||
zapcore.DebugLevel,
|
||||
)
|
||||
|
||||
zap.ReplaceGlobals(zap.New(zapcore.NewTee(pretty, ugly)))
|
||||
zap.S().Infof("writing logs to: %v", logsDir)
|
||||
}
|
||||
|
||||
@@ -6,7 +6,6 @@ package main
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"io"
|
||||
"os"
|
||||
"os/exec"
|
||||
"path/filepath"
|
||||
@@ -16,7 +15,6 @@ import (
|
||||
"github.com/garethgeorge/backrest/internal/env"
|
||||
"github.com/getlantern/systray"
|
||||
"github.com/ncruces/zenity"
|
||||
lumberjack "gopkg.in/natefinch/lumberjack.v2"
|
||||
|
||||
_ "embed"
|
||||
)
|
||||
@@ -25,13 +23,6 @@ import (
|
||||
var icon []byte
|
||||
|
||||
func main() {
|
||||
l, err := createLogWriter()
|
||||
if err != nil {
|
||||
reportError(err)
|
||||
return
|
||||
}
|
||||
defer l.Close()
|
||||
|
||||
backrest, err := findBackrest()
|
||||
if err != nil {
|
||||
reportError(err)
|
||||
@@ -45,14 +36,6 @@ func main() {
|
||||
cmd.Env = os.Environ()
|
||||
cmd.Env = append(cmd.Env, "ENV=production")
|
||||
|
||||
pr, pw := io.Pipe()
|
||||
cmd.Stdout = pw
|
||||
cmd.Stderr = pw
|
||||
|
||||
go func() {
|
||||
io.Copy(l, pr)
|
||||
}()
|
||||
|
||||
if err := cmd.Start(); err != nil {
|
||||
reportError(err)
|
||||
cancel()
|
||||
@@ -80,7 +63,7 @@ func main() {
|
||||
mOpenLog.ClickedCh = make(chan struct{})
|
||||
go func() {
|
||||
for range mOpenLog.ClickedCh {
|
||||
cmd := exec.Command(`explorer`, `/select,`, logsPath())
|
||||
cmd := exec.Command(`explorer`, `/select,`, env.LogsPath())
|
||||
cmd.Start()
|
||||
go cmd.Wait()
|
||||
}
|
||||
@@ -147,26 +130,3 @@ func openBrowser(url string) error {
|
||||
func reportError(err error) {
|
||||
zenity.Error(err.Error(), zenity.Title("Backrest Error"))
|
||||
}
|
||||
|
||||
func createLogWriter() (io.WriteCloser, error) {
|
||||
logsDir := logsPath()
|
||||
fmt.Printf("Logging to %s\n", logsDir)
|
||||
if err := os.MkdirAll(logsDir, 0755); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
l := &lumberjack.Logger{
|
||||
Filename: filepath.Join(logsDir, "backrest.log"),
|
||||
MaxSize: 5, // megabytes
|
||||
MaxBackups: 3,
|
||||
MaxAge: 14,
|
||||
Compress: true,
|
||||
}
|
||||
|
||||
return l, nil
|
||||
}
|
||||
|
||||
func logsPath() string {
|
||||
dataDir := env.DataDir()
|
||||
return filepath.Join(dataDir, "processlogs")
|
||||
}
|
||||
|
||||
@@ -66,10 +66,6 @@ create_launchd_plist() {
|
||||
</array>
|
||||
<key>KeepAlive</key>
|
||||
<true/>
|
||||
<key>StandardOutPath</key>
|
||||
<string>/tmp/backrest.log</string>
|
||||
<key>StandardErrorPath</key>
|
||||
<string>/tmp/backrest.log</string>
|
||||
<key>EnvironmentVariables</key>
|
||||
<dict>
|
||||
<key>PATH</key>
|
||||
|
||||
Vendored
+6
@@ -5,6 +5,7 @@ import (
|
||||
"fmt"
|
||||
"os"
|
||||
"path"
|
||||
"path/filepath"
|
||||
"runtime"
|
||||
"strings"
|
||||
)
|
||||
@@ -74,6 +75,11 @@ func ResticBinPath() string {
|
||||
return ""
|
||||
}
|
||||
|
||||
func LogsPath() string {
|
||||
dataDir := DataDir()
|
||||
return filepath.Join(dataDir, "processlogs")
|
||||
}
|
||||
|
||||
func getHomeDir() string {
|
||||
home, err := os.UserHomeDir()
|
||||
if err != nil {
|
||||
|
||||
@@ -123,7 +123,7 @@ func NewOrchestrator(resticBin string, cfg *v1.Config, log *oplog.OpLog, logStor
|
||||
}
|
||||
}
|
||||
|
||||
zap.S().Info("scrubbed operation log for incomplete operations",
|
||||
zap.L().Info("scrubbed operation log for incomplete operations",
|
||||
zap.Duration("duration", time.Since(startTime)),
|
||||
zap.Int("incomplete_ops", len(incompleteOps)),
|
||||
zap.Int("incomplete_repos", len(incompleteRepos)),
|
||||
|
||||
Reference in New Issue
Block a user