diff --git a/examples/golang/codex.go b/examples/golang/codex.go index 82d546e1..a2385a62 100644 --- a/examples/golang/codex.go +++ b/examples/golang/codex.go @@ -105,6 +105,10 @@ package main static int cGoCodexUploadFile(void* codexCtx, char* sessionId, void* resp) { return codex_upload_file(codexCtx, sessionId, (CodexCallback) callback, resp); } + + static int cGoCodexLogLevel(void* codexCtx, char* logLevel, void* resp) { + return codex_log_level(codexCtx, logLevel, (CodexCallback) callback, resp); + } */ import "C" import ( @@ -122,18 +126,6 @@ import ( "unsafe" ) -type LogLevel string - -const ( - TRACE LogLevel = "trace" - DEBUG LogLevel = "debug" - INFO LogLevel = "info" - NOTICE LogLevel = "notice" - WARN LogLevel = "warn" - ERROR LogLevel = "error" - FATAL LogLevel = "fatal" -) - type LogFormat string const ( @@ -155,7 +147,7 @@ const defaultBlockSize = 1024 * 64 type Config struct { // Default: INFO - LogLevel LogLevel `json:"log-level,omitempty"` + LogLevel string `json:"log-level,omitempty"` // Specifies what kind of logs should be written to stdout // Default: auto @@ -788,24 +780,45 @@ func (node CodexNode) UploadFileAsync(options UploadOptions, onDone func(cid str }() } +func (node CodexNode) UpdateLogLevel(logLevel string) error { + bridge := newBridgeCtx() + defer bridge.free() + + var cLogLevel = C.CString(string(logLevel)) + defer C.free(unsafe.Pointer(cLogLevel)) + + if C.cGoCodexLogLevel(node.ctx, cLogLevel, bridge.resp) != C.RET_OK { + return bridge.callError("cGoCodexLogLevel") + } + + _, err := bridge.wait() + return err +} + func main() { node, err := New(Config{ BlockRetries: 5, + LogLevel: "WARN", }) if err != nil { log.Fatalf("Failed to create Codex node: %v", err) } + if err := node.Start(); err != nil { + log.Fatalf("Failed to start Codex node: %v", err) + } + log.Println("Codex node started") + version, err := node.Version() if err != nil { log.Fatalf("Failed to get Codex version: %v", err) } log.Printf("Codex version: %s", version) - if err := node.Start(); err != nil { - log.Fatalf("Failed to start Codex node: %v", err) + err = node.UpdateLogLevel("ERROR") + if err != nil { + log.Fatalf("Failed to update log level: %v", err) } - log.Println("Codex node started") buf := bytes.NewBuffer([]byte("Hello World!")) len := buf.Len() diff --git a/library/codex_thread_requests/requests/node_debug_request.nim b/library/codex_thread_requests/requests/node_debug_request.nim index 1015bacb..07e8ab23 100644 --- a/library/codex_thread_requests/requests/node_debug_request.nim +++ b/library/codex_thread_requests/requests/node_debug_request.nim @@ -22,21 +22,28 @@ logScope: type NodeDebugMsgType* = enum DEBUG PEER + LOG_LEVEL type NodeDebugRequest* = object operation: NodeDebugMsgType peerId: cstring + logLevel: cstring proc createShared*( - T: type NodeDebugRequest, op: NodeDebugMsgType, peerId: cstring = "" + T: type NodeDebugRequest, + op: NodeDebugMsgType, + peerId: cstring = "", + logLevel: cstring = "", ): ptr type T = var ret = createShared(T) ret[].operation = op ret[].peerId = peerId.alloc() + ret[].logLevel = logLevel.alloc() return ret proc destroyShared(self: ptr NodeDebugRequest) = deallocShared(self[].peerId) + deallocShared(self[].logLevel) deallocShared(self) proc getDebug( @@ -81,6 +88,17 @@ proc getPeer( else: return err("Failed to get peer: peer debug API is disabled") +proc updateLogLevel( + codex: ptr CodexServer, logLevel: cstring +): Future[Result[string, string]] {.async: (raises: []).} = + try: + {.gcsafe.}: + updateLogLevel($logLevel) + except ValueError as err: + return err("Failed to update log level: invalid value for log level: " & err.msg) + + return ok("") + proc process*( self: ptr NodeDebugRequest, codex: ptr CodexServer ): Future[Result[string, string]] {.async: (raises: []).} = @@ -99,4 +117,9 @@ proc process*( if res.isErr: error "Failed to get PEER.", error = res.error return err($res.error) + of NodeDebugMsgType.LOG_LEVEL: + let res = (await updateLogLevel(codex, self.logLevel)) + if res.isErr: + error "Failed to update LOG_LEVEL.", error = res.error + return err($res.error) return res diff --git a/library/codex_thread_requests/requests/node_lifecycle_request.nim b/library/codex_thread_requests/requests/node_lifecycle_request.nim index 0e462aa0..5894405d 100644 --- a/library/codex_thread_requests/requests/node_lifecycle_request.nim +++ b/library/codex_thread_requests/requests/node_lifecycle_request.nim @@ -116,6 +116,13 @@ proc createCodex( return err("Failed to create codex: unable to load configuration: " & e.msg) conf.setupLogging() + + try: + {.gcsafe.}: + updateLogLevel(conf.logLevel) + except ValueError as err: + return err("Failed to create codex: invalid value for log level: " & err.msg) + conf.setupMetrics() if not (checkAndCreateDataDir((conf.dataDir).string)): diff --git a/library/libcodex.nim b/library/libcodex.nim index 17f79fe5..df8aa5d9 100644 --- a/library/libcodex.nim +++ b/library/libcodex.nim @@ -39,7 +39,7 @@ import ./codex_thread_requests/requests/node_download_request import ./codex_thread_requests/requests/node_storage_request import ./ffi_types -from ../codex/conf import codexVersion, updateLogLevel +from ../codex/conf import codexVersion logScope: topics = "codexlib" @@ -201,12 +201,13 @@ proc codex_log_level( initializeLibrary() checkLibcodexParams(ctx, callback, userData) - try: - updateLogLevel($logLevel) - except ValueError as e: - return callback.error(e.msg, userData) + let reqContent = + NodeDebugRequest.createShared(NodeDebugMsgType.LOG_LEVEL, logLevel = logLevel) + let res = codex_context.sendRequestToCodexThread( + ctx, RequestType.DEBUG, reqContent, callback, userData + ) - return callback.success("", userData) + return callback.okOrError(res, userData) proc codex_connect( ctx: ptr CodexContext,