feat(logging): add log path configuration and implement logrotate policy
This commit is contained in:
@@ -70,6 +70,10 @@ For detailed API documentation, please see [docs/api.md](docs/api.md)
|
|||||||
- [ ] Add per-proxy status display
|
- [ ] Add per-proxy status display
|
||||||
- [ ] Add proxy edit submit action
|
- [ ] Add proxy edit submit action
|
||||||
- [ ] Add per-proxy status control
|
- [ ] Add per-proxy status control
|
||||||
|
- [ ] Fix reboot failed when deployed as systemd service
|
||||||
|
- [x] Enhance speed of listing instances
|
||||||
|
- [x] Increase speed of fetching instance logs
|
||||||
|
- [x] Refactor systemd service log output method to local file
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
|
|||||||
@@ -63,7 +63,9 @@ func LoadConfig(configPath string, getInitSystem func() string) error {
|
|||||||
global.CurrentConfig.ListenPort = fileConfig.ListenPort
|
global.CurrentConfig.ListenPort = fileConfig.ListenPort
|
||||||
global.CurrentConfig.FrpcPath = fileConfig.FrpcPath
|
global.CurrentConfig.FrpcPath = fileConfig.FrpcPath
|
||||||
global.CurrentConfig.InstancePath = fileConfig.InstancePath
|
global.CurrentConfig.InstancePath = fileConfig.InstancePath
|
||||||
|
global.CurrentConfig.LogsPath = fileConfig.LogsPath
|
||||||
global.CurrentConfig.Debug = fileConfig.Debug
|
global.CurrentConfig.Debug = fileConfig.Debug
|
||||||
|
global.CurrentConfig.Status.IsLogrotateConfigured = fileConfig.Status.IsLogrotateConfigured
|
||||||
global.CurrentConfig.Watchdog.Enabled = fileConfig.Watchdog.Enabled
|
global.CurrentConfig.Watchdog.Enabled = fileConfig.Watchdog.Enabled
|
||||||
global.CurrentConfig.Notification.Enabled = fileConfig.Notification.Enabled
|
global.CurrentConfig.Notification.Enabled = fileConfig.Notification.Enabled
|
||||||
global.CurrentConfig.Notification.Method = fileConfig.Notification.Method
|
global.CurrentConfig.Notification.Method = fileConfig.Notification.Method
|
||||||
@@ -82,20 +84,28 @@ func LoadConfig(configPath string, getInitSystem func() string) error {
|
|||||||
|
|
||||||
if fileConfig.FrpcPath == "" {
|
if fileConfig.FrpcPath == "" {
|
||||||
if getInitSystem() == "windows" {
|
if getInitSystem() == "windows" {
|
||||||
global.CurrentConfig.FrpcPath = "frp_client/frpc.exe"
|
global.CurrentConfig.FrpcPath = global.CurrentPath + string(os.PathSeparator) + "frp_client" + string(os.PathSeparator) + "frpc.exe"
|
||||||
} else {
|
} else {
|
||||||
global.CurrentConfig.FrpcPath = "/usr/bin/frpc"
|
global.CurrentConfig.FrpcPath = global.CurrentPath + string(os.PathSeparator) + "frp_client" + string(os.PathSeparator) + "frpc"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if fileConfig.InstancePath == "" {
|
if fileConfig.InstancePath == "" {
|
||||||
global.CurrentConfig.InstancePath = "./configs"
|
global.CurrentConfig.InstancePath = global.CurrentPath + string(os.PathSeparator) + "configs"
|
||||||
|
}
|
||||||
|
|
||||||
|
if fileConfig.LogsPath == "" {
|
||||||
|
global.CurrentConfig.LogsPath = global.CurrentPath + string(os.PathSeparator) + "logs"
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := os.MkdirAll(global.CurrentConfig.InstancePath, 0755); err != nil {
|
if err := os.MkdirAll(global.CurrentConfig.InstancePath, 0755); err != nil {
|
||||||
return fmt.Errorf("failed to create config directory: %w", err)
|
return fmt.Errorf("failed to create config directory: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if err := os.MkdirAll(global.CurrentConfig.LogsPath, 0755); err != nil {
|
||||||
|
return fmt.Errorf("failed to create log directory: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
postLog.Debug(fmt.Sprintf("Loaded config: %v", global.CurrentConfig))
|
postLog.Debug(fmt.Sprintf("Loaded config: %v", global.CurrentConfig))
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
|||||||
@@ -49,7 +49,11 @@ type Config struct {
|
|||||||
ListenPort string `json:"listenPort"`
|
ListenPort string `json:"listenPort"`
|
||||||
FrpcPath string `json:"frpcPath"`
|
FrpcPath string `json:"frpcPath"`
|
||||||
InstancePath string `json:"instancePath"`
|
InstancePath string `json:"instancePath"`
|
||||||
|
LogsPath string `json:"logsPath"`
|
||||||
Debug bool `json:"debug"`
|
Debug bool `json:"debug"`
|
||||||
|
Status struct {
|
||||||
|
IsLogrotateConfigured bool `json:"isLogrotateConfigured"`
|
||||||
|
} `json:"status"`
|
||||||
Watchdog struct {
|
Watchdog struct {
|
||||||
Enabled bool `json:"enabled"`
|
Enabled bool `json:"enabled"`
|
||||||
} `json:"watchdog"`
|
} `json:"watchdog"`
|
||||||
@@ -70,7 +74,13 @@ var CurrentConfig = Config{
|
|||||||
ListenPort: "7000",
|
ListenPort: "7000",
|
||||||
FrpcPath: "",
|
FrpcPath: "",
|
||||||
InstancePath: "",
|
InstancePath: "",
|
||||||
|
LogsPath: "",
|
||||||
Debug: false,
|
Debug: false,
|
||||||
|
Status: struct{
|
||||||
|
IsLogrotateConfigured bool `json:"isLogrotateConfigured"`
|
||||||
|
}{
|
||||||
|
IsLogrotateConfigured: false,
|
||||||
|
},
|
||||||
Watchdog: struct {
|
Watchdog: struct {
|
||||||
Enabled bool `json:"enabled"`
|
Enabled bool `json:"enabled"`
|
||||||
}{
|
}{
|
||||||
@@ -94,4 +104,4 @@ var CurrentConfig = Config{
|
|||||||
Headers: "Content-Type: application/json",
|
Headers: "Content-Type: application/json",
|
||||||
Body: "",
|
Body: "",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
10
main.go
10
main.go
@@ -64,6 +64,16 @@ func main() {
|
|||||||
postLog.Fatal(fmt.Sprintf("Failed to initialize frpc database: %v", err))
|
postLog.Fatal(fmt.Sprintf("Failed to initialize frpc database: %v", err))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if global.CurrentConfig.LogsPath != "" && !global.CurrentConfig.Status.IsLogrotateConfigured { // Set up logrotate policy if LogsPath is configured
|
||||||
|
if err := sys.CreateLogrotatePolicy(); err != nil {
|
||||||
|
postLog.Fatal(fmt.Sprintf("Failed to create logrotate policy: %v", err))
|
||||||
|
} else {
|
||||||
|
global.CurrentConfig.Status.IsLogrotateConfigured = true
|
||||||
|
config.SaveConfig()
|
||||||
|
postLog.Info("Logrotate policy has been configured successfully.")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
frpLogger.SetDatabase(global.ConfigDB, global.FrpcDB)
|
frpLogger.SetDatabase(global.ConfigDB, global.FrpcDB)
|
||||||
frpLogger.SetDebugMode(global.CurrentConfig.Debug)
|
frpLogger.SetDebugMode(global.CurrentConfig.Debug)
|
||||||
|
|
||||||
|
|||||||
25
sys/core.go
25
sys/core.go
@@ -78,10 +78,12 @@ ExecStart=%s -c %s
|
|||||||
User=%s
|
User=%s
|
||||||
Restart=on-failure
|
Restart=on-failure
|
||||||
RestartSec=5
|
RestartSec=5
|
||||||
|
StandardOutput=append:%s/superfrpc_%d.log
|
||||||
|
StandardError=append:%s/superfrpc_%d.log
|
||||||
|
|
||||||
[Install]
|
[Install]
|
||||||
WantedBy=multi-user.target
|
WantedBy=multi-user.target
|
||||||
`, instanceID, frpcPath, configPath, runUser)
|
`, instanceID, frpcPath, configPath, runUser, global.CurrentConfig.LogsPath, instanceID, global.CurrentConfig.LogsPath, instanceID)
|
||||||
|
|
||||||
servicePath := filepath.Join("/etc/systemd/system", serviceName+".service")
|
servicePath := filepath.Join("/etc/systemd/system", serviceName+".service")
|
||||||
if err := os.WriteFile(servicePath, []byte(serviceContent), 0644); err != nil {
|
if err := os.WriteFile(servicePath, []byte(serviceContent), 0644); err != nil {
|
||||||
@@ -102,6 +104,27 @@ WantedBy=multi-user.target
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func CreateLogrotatePolicy() error {
|
||||||
|
logrotatePath := "/etc/logrotate.d/superfrpc_frpclog"
|
||||||
|
policyContent := fmt.Sprintf(`%s/superfrpc_*.log {
|
||||||
|
daily
|
||||||
|
rotate 7
|
||||||
|
compress
|
||||||
|
delaycompress
|
||||||
|
missingok
|
||||||
|
notifempty
|
||||||
|
}
|
||||||
|
`, global.CurrentConfig.LogsPath)
|
||||||
|
if err := os.WriteFile(logrotatePath, []byte(policyContent), 0644); err != nil {
|
||||||
|
return fmt.Errorf("failed to create logrotate policy file: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := exec.Command("logrotate", "-f", logrotatePath).Run(); err != nil {
|
||||||
|
return fmt.Errorf("failed to apply logrotate policy: %w", err)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func createInitDService(instanceID int, configPath, runUser string) error {
|
func createInitDService(instanceID int, configPath, runUser string) error {
|
||||||
frpcPath, err := GetFrpcPath()
|
frpcPath, err := GetFrpcPath()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
Reference in New Issue
Block a user