diff --git a/.gitignore b/.gitignore index 5ae335c1..dff3bdf4 100644 --- a/.gitignore +++ b/.gitignore @@ -21,6 +21,7 @@ bin/ *.data *.db +*.log .DS_Store diff --git a/pkg/download/downloader.go b/pkg/download/downloader.go index 0dc49994..0067e197 100644 --- a/pkg/download/downloader.go +++ b/pkg/download/downloader.go @@ -72,7 +72,7 @@ func NewDownloader(cfg *DownloaderConfig) *Downloader { } } - logPanic(cfg.StorageDir) + logPanic(filepath.Join(cfg.StorageDir, "logs")) return d } @@ -640,22 +640,12 @@ func (d *Downloader) doContinue(task *Task) (err error) { // redirect stderr to log file, when panic happened log it func logPanic(logDir string) { - fp := filepath.Join(logDir, "crash.log") - // if log file not exists, create it - var f *os.File - if _, err := os.Stat(fp); err != nil { - if !os.IsNotExist(err) { - return - } - f, err = os.Create(fp) - if err != nil { - return - } - } else { - f, err = os.OpenFile(fp, os.O_APPEND|os.O_WRONLY, 0644) - if err != nil { - return - } + if err := util.CreateDirIfNotExist(logDir); err != nil { + return + } + f, err := os.Create(filepath.Join(logDir, "crash.log")) + if err != nil { + return } paniclog.RedirectStderr(f) } diff --git a/pkg/util/path.go b/pkg/util/path.go index 9f9fc1ed..f594297b 100644 --- a/pkg/util/path.go +++ b/pkg/util/path.go @@ -3,7 +3,6 @@ package util import ( "errors" "fmt" - "io" "os" syspath "path" "strings" @@ -83,17 +82,9 @@ func GetSingleDir(paths []string) string { return dir } -// check directory is empty -func isEmpty(name string) (bool, error) { - f, err := os.Open(name) - if err != nil { - return false, err +func CreateDirIfNotExist(dir string) error { + if _, err := os.Stat(dir); os.IsNotExist(err) { + return os.MkdirAll(dir, 0o777) } - defer f.Close() - - _, err = f.Readdirnames(1) // Or f.Readdir(1) - if err == io.EOF { - return true, nil - } - return false, err // Either not empty or error, suits both cases + return nil } diff --git a/ui/flutter/lib/app/modules/setting/views/setting_view.dart b/ui/flutter/lib/app/modules/setting/views/setting_view.dart index 1e4e66b6..91c8c3bb 100644 --- a/ui/flutter/lib/app/modules/setting/views/setting_view.dart +++ b/ui/flutter/lib/app/modules/setting/views/setting_view.dart @@ -35,7 +35,7 @@ class SettingView extends GetView { debounceSave({bool needRestart = false}) { var completer = Completer(); timer?.cancel(); - timer = Timer(const Duration(milliseconds: 500), () { + timer = Timer(const Duration(milliseconds: 1000), () { appController .saveConfig() .then(completer.complete) diff --git a/ui/flutter/lib/util/log_util.dart b/ui/flutter/lib/util/log_util.dart index d7611756..dbeb41a0 100644 --- a/ui/flutter/lib/util/log_util.dart +++ b/ui/flutter/lib/util/log_util.dart @@ -1,19 +1,23 @@ import 'dart:io'; - import 'package:flutter/foundation.dart'; import 'package:logger/logger.dart'; - import 'util.dart'; final logger = Logger( - printer: PrettyPrinter(), + filter: ProductionFilter(), + printer: LogfmtPrinter(), output: buildOutput(), ); buildOutput() { - // if is debug mode, output to console + // if is debug mode, don't log to file if (!kDebugMode && Util.isDesktop()) { - return FileOutput(file: File('log.txt')); + const logDirPath = 'logs'; + var logDir = Directory(logDirPath); + if (!logDir.existsSync()) { + logDir.createSync(); + } + return FileOutput(file: File('$logDirPath/client.log')); } return null; } diff --git a/ui/flutter/lib/util/message.dart b/ui/flutter/lib/util/message.dart index fd2f75e1..23be0dbb 100644 --- a/ui/flutter/lib/util/message.dart +++ b/ui/flutter/lib/util/message.dart @@ -12,7 +12,7 @@ void showErrorMessage(msg) { Get.snackbar(title, ((msg as dynamic).message as Result).msg!); return; } - Get.snackbar(title, msg); + Get.snackbar(title, msg.toString()); } void showMessage(title, msg) {