summaryrefslogtreecommitdiffhomepage
path: root/internal/logging
diff options
context:
space:
mode:
authorKujtim Hoxha <[email protected]>2025-04-16 20:06:23 +0200
committerKujtim Hoxha <[email protected]>2025-04-21 13:42:00 +0200
commitbbfa60c787f2ec459f1689b9a650ddbec9693ed9 (patch)
treef7f2aa31c460c8cc22ec40cc299c386277152241 /internal/logging
parent76b4065f17b87a63092acfd98c997bab53700b35 (diff)
downloadopencode-bbfa60c787f2ec459f1689b9a650ddbec9693ed9.tar.gz
opencode-bbfa60c787f2ec459f1689b9a650ddbec9693ed9.zip
reimplement agent,provider and add file history
Diffstat (limited to 'internal/logging')
-rw-r--r--internal/logging/logger.go41
1 files changed, 40 insertions, 1 deletions
diff --git a/internal/logging/logger.go b/internal/logging/logger.go
index b06391472..7ae2e7b87 100644
--- a/internal/logging/logger.go
+++ b/internal/logging/logger.go
@@ -1,6 +1,12 @@
package logging
-import "log/slog"
+import (
+ "fmt"
+ "log/slog"
+ "os"
+ "runtime/debug"
+ "time"
+)
func Info(msg string, args ...any) {
slog.Info(msg, args...)
@@ -37,3 +43,36 @@ func ErrorPersist(msg string, args ...any) {
args = append(args, persistKeyArg, true)
slog.Error(msg, args...)
}
+
+// RecoverPanic is a common function to handle panics gracefully.
+// It logs the error, creates a panic log file with stack trace,
+// and executes an optional cleanup function before returning.
+func RecoverPanic(name string, cleanup func()) {
+ if r := recover(); r != nil {
+ // Log the panic
+ ErrorPersist(fmt.Sprintf("Panic in %s: %v", name, r))
+
+ // Create a timestamped panic log file
+ timestamp := time.Now().Format("20060102-150405")
+ filename := fmt.Sprintf("opencode-panic-%s-%s.log", name, timestamp)
+
+ file, err := os.Create(filename)
+ if err != nil {
+ ErrorPersist(fmt.Sprintf("Failed to create panic log: %v", err))
+ } else {
+ defer file.Close()
+
+ // Write panic information and stack trace
+ fmt.Fprintf(file, "Panic in %s: %v\n\n", name, r)
+ fmt.Fprintf(file, "Time: %s\n\n", time.Now().Format(time.RFC3339))
+ fmt.Fprintf(file, "Stack Trace:\n%s\n", debug.Stack())
+
+ InfoPersist(fmt.Sprintf("Panic details written to %s", filename))
+ }
+
+ // Execute cleanup function if provided
+ if cleanup != nil {
+ cleanup()
+ }
+ }
+}