diff --git a/internal/config/config.go b/internal/config/config.go
index 01c51d6..feb30c0 100644
--- a/internal/config/config.go
+++ b/internal/config/config.go
@@ -281,7 +281,9 @@ func (c *AppConfig) UpdateConfig() error {
func (c *AppConfig) processLines(lines []string) []string {
// keep track of not found values to append at bottom
var (
- foundLineUpdate = false
+ foundLineUpdate = false
+ foundLineLogLevel = false
+ foundLineLogPath = false
)
for i, line := range lines {
@@ -290,6 +292,18 @@ func (c *AppConfig) processLines(lines []string) []string {
lines[i] = fmt.Sprintf("checkForUpdates = %t", c.Config.CheckForUpdates)
foundLineUpdate = true
}
+ if !foundLineLogLevel && strings.Contains(line, "logLevel =") {
+ lines[i] = fmt.Sprintf(`logLevel = "%s"`, c.Config.LogLevel)
+ foundLineLogLevel = true
+ }
+ if !foundLineLogPath && strings.Contains(line, "logPath =") {
+ if c.Config.LogPath == "" {
+ lines[i] = `#logPath = ""`
+ } else {
+ lines[i] = fmt.Sprintf("logPath = \"%s\"", c.Config.LogPath)
+ }
+ foundLineLogPath = true
+ }
}
// append missing vars to bottom
@@ -299,5 +313,27 @@ func (c *AppConfig) processLines(lines []string) []string {
lines = append(lines, fmt.Sprintf("checkForUpdates = %t", c.Config.CheckForUpdates))
}
+ if !foundLineLogLevel {
+ lines = append(lines, "# Log level")
+ lines = append(lines, "#")
+ lines = append(lines, `# Default: "DEBUG"`)
+ lines = append(lines, "#")
+ lines = append(lines, `# Options: "ERROR", "DEBUG", "INFO", "WARN", "TRACE"`)
+ lines = append(lines, "#")
+ lines = append(lines, fmt.Sprintf(`logLevel = "%s"`, c.Config.LogLevel))
+ }
+
+ if !foundLineLogPath {
+ lines = append(lines, "# Log Path")
+ lines = append(lines, "#")
+ lines = append(lines, "# Optional")
+ lines = append(lines, "#")
+ if c.Config.LogPath == "" {
+ lines = append(lines, `#logPath = ""`)
+ } else {
+ lines = append(lines, fmt.Sprintf(`logPath = "%s"`, c.Config.LogPath))
+ }
+ }
+
return lines
}
diff --git a/internal/config/config_test.go b/internal/config/config_test.go
index e1e8d97..d7cb465 100644
--- a/internal/config/config_test.go
+++ b/internal/config/config_test.go
@@ -1,10 +1,11 @@
package config
import (
- "reflect"
"sync"
"testing"
+ "github.com/stretchr/testify/assert"
+
"github.com/autobrr/autobrr/internal/domain"
)
@@ -25,20 +26,20 @@ func TestAppConfig_processLines(t *testing.T) {
{
name: "append missing",
fields: fields{
- Config: &domain.Config{CheckForUpdates: true},
+ Config: &domain.Config{CheckForUpdates: true, LogLevel: "TRACE"},
m: sync.Mutex{},
},
args: args{[]string{}},
- want: []string{"# Check for updates", "#", "checkForUpdates = true"},
+ want: []string{"# Check for updates", "#", "checkForUpdates = true", "# Log level", "#", "# Default: \"DEBUG\"", "#", "# Options: \"ERROR\", \"DEBUG\", \"INFO\", \"WARN\", \"TRACE\"", "#", `logLevel = "TRACE"`, "# Log Path", "#", "# Optional", "#", "#logPath = \"\""},
},
{
name: "update existing",
fields: fields{
- Config: &domain.Config{CheckForUpdates: true},
+ Config: &domain.Config{CheckForUpdates: true, LogLevel: "TRACE"},
m: sync.Mutex{},
},
- args: args{[]string{"# Check for updates", "#", "#checkForUpdates = false"}},
- want: []string{"# Check for updates", "#", "checkForUpdates = true"},
+ args: args{[]string{"# Check for updates", "#", "checkForUpdates = false", "# Log level", "#", "# Default: \"DEBUG\"", "#", "# Options: \"ERROR\", \"DEBUG\", \"INFO\", \"WARN\", \"TRACE\"", "#", `logLevel = "TRACE"`, "# Log Path", "#", "# Optional", "#", "#logPath = \"\""}},
+ want: []string{"# Check for updates", "#", "checkForUpdates = true", "# Log level", "#", "# Default: \"DEBUG\"", "#", "# Options: \"ERROR\", \"DEBUG\", \"INFO\", \"WARN\", \"TRACE\"", "#", `logLevel = "TRACE"`, "# Log Path", "#", "# Optional", "#", "#logPath = \"\""},
},
}
for _, tt := range tests {
@@ -47,9 +48,8 @@ func TestAppConfig_processLines(t *testing.T) {
Config: tt.fields.Config,
m: tt.fields.m,
}
- if got := c.processLines(tt.args.lines); !reflect.DeepEqual(got, tt.want) {
- t.Errorf("processLines() = %v, want %v", got, tt.want)
- }
+
+ assert.Equalf(t, tt.want, c.processLines(tt.args.lines), tt.name)
})
}
}
diff --git a/internal/http/config.go b/internal/http/config.go
index 65d2379..651cf6e 100644
--- a/internal/http/config.go
+++ b/internal/http/config.go
@@ -16,6 +16,8 @@ type configJson struct {
Port int `json:"port"`
LogLevel string `json:"log_level"`
LogPath string `json:"log_path"`
+ LogMaxSize int `json:"log_max_size"`
+ LogMaxBackups int `json:"log_max_backups"`
BaseURL string `json:"base_url"`
CheckForUpdates bool `json:"check_for_updates"`
Version string `json:"version"`
@@ -49,6 +51,8 @@ func (h configHandler) getConfig(w http.ResponseWriter, r *http.Request) {
Port: h.cfg.Config.Port,
LogLevel: h.cfg.Config.LogLevel,
LogPath: h.cfg.Config.LogPath,
+ LogMaxSize: h.cfg.Config.LogMaxSize,
+ LogMaxBackups: h.cfg.Config.LogMaxBackups,
BaseURL: h.cfg.Config.BaseURL,
CheckForUpdates: h.cfg.Config.CheckForUpdates,
Version: h.server.version,
@@ -71,6 +75,14 @@ func (h configHandler) updateConfig(w http.ResponseWriter, r *http.Request) {
h.cfg.Config.CheckForUpdates = *data.CheckForUpdates
}
+ if data.LogLevel != nil {
+ h.cfg.Config.LogLevel = *data.LogLevel
+ }
+
+ if data.LogPath != nil {
+ h.cfg.Config.LogPath = *data.LogPath
+ }
+
if err := h.cfg.UpdateConfig(); err != nil {
render.Status(r, http.StatusInternalServerError)
render.JSON(w, r, errorResponse{
diff --git a/web/src/domain/constants.ts b/web/src/domain/constants.ts
index e52fb4f..5159e8a 100644
--- a/web/src/domain/constants.ts
+++ b/web/src/domain/constants.ts
@@ -422,6 +422,9 @@ export const DownloadRuleConditionOptions: OptionBasic[] = [
}
];
+const logLevel = ["DEBUG", "INFO", "WARN", "ERROR", "TRACE"] as const;
+
+export const LogLevelOptions = logLevel.map(v => ({ value: v, label: v, key: v }));
export interface SelectOption {
label: string;
diff --git a/web/src/domain/routes.tsx b/web/src/domain/routes.tsx
index a7048c3..1f94394 100644
--- a/web/src/domain/routes.tsx
+++ b/web/src/domain/routes.tsx
@@ -1,4 +1,4 @@
-import { BrowserRouter, Routes, Route } from "react-router-dom";
+import { BrowserRouter, Route, Routes } from "react-router-dom";
import { Login } from "../screens/auth/login";
import { Logout } from "../screens/auth/logout";
@@ -9,15 +9,18 @@ import { FilterDetails, Filters } from "../screens/filters";
import { Logs } from "../screens/Logs";
import { Releases } from "../screens/releases";
import Settings from "../screens/Settings";
-import ApplicationSettings from "../screens/settings/Application";
-import DownloadClientSettings from "../screens/settings/DownloadClient";
-import FeedSettings from "../screens/settings/Feed";
-import IndexerSettings from "../screens/settings/Indexer";
-import { IrcSettings } from "../screens/settings/Irc";
-import NotificationSettings from "../screens/settings/Notifications";
+import {
+ APISettings,
+ ApplicationSettings,
+ DownloadClientSettings,
+ FeedSettings,
+ IndexerSettings,
+ IrcSettings,
+ LogSettings,
+ NotificationSettings,
+ ReleaseSettings
+} from "../screens/settings";
import { RegexPlayground } from "../screens/settings/RegexPlayground";
-import ReleaseSettings from "../screens/settings/Releases";
-import APISettings from "../screens/settings/Api";
import { baseUrl } from "../utils";
@@ -36,6 +39,7 @@ export const LocalRouter = ({ isLoggedIn }: { isLoggedIn: boolean }) => (
+ Set level, size etc. +
+