From 7d4ea878d2f57623eb23aad0683188b65662b33d Mon Sep 17 00:00:00 2001 From: Eric <5089238+emizzle@users.noreply.github.com> Date: Thu, 9 Nov 2023 16:35:55 +1100 Subject: [PATCH] Support logging to file (#558) * Support logging to file * Log the entire config and fix build error * Downgrade log level for "starting codex node" config output * bump ethers to prevent nonce gaps * fix tests --- codex/codex.nim | 2 +- codex/conf.nim | 32 ++++++++++++++++++++++++++++++- config.nims | 2 +- tests/contracts/testContracts.nim | 5 +++-- tests/contracts/testMarket.nim | 6 +++--- vendor/nim-ethers | 2 +- 6 files changed, 40 insertions(+), 9 deletions(-) diff --git a/codex/codex.nim b/codex/codex.nim index 0b725bb7..bc0d53ff 100644 --- a/codex/codex.nim +++ b/codex/codex.nim @@ -129,7 +129,7 @@ proc bootstrapInteractions( return (client, host, validator) proc start*(s: CodexServer) {.async.} = - notice "Starting codex node" + trace "Starting codex node", config = $s.config await s.repoStore.start() s.maintenance.start() diff --git a/codex/conf.nim b/codex/conf.nim index bf7b9ec2..9dc3cb8d 100644 --- a/codex/conf.nim +++ b/codex/conf.nim @@ -28,8 +28,11 @@ import pkg/metrics import pkg/metrics/chronos_httpserver import pkg/stew/shims/net as stewnet import pkg/stew/shims/parseutils +import pkg/stew/byteutils import pkg/libp2p import pkg/ethers +import pkg/questionable +import pkg/questionable/results import ./discovery import ./stores @@ -260,6 +263,13 @@ type hidden .}: int + logFile* {. + desc: "Logs to file" + defaultValue: string.none + name: "log-file" + hidden + .}: Option[string] + of initNode: discard @@ -445,9 +455,10 @@ proc updateLogLevel*(logLevel: string) {.upraises: [ValueError].} = warn "Unrecognized logging topic", topic = topicName proc setupLogging*(conf: CodexConf) = - when defaultChroniclesStream.outputs.type.arity != 2: + when defaultChroniclesStream.outputs.type.arity != 3: warn "Logging configuration options not enabled in the current build" else: + var logFile: ?IoHandle proc noOutput(logLevel: LogLevel, msg: LogOutputStr) = discard proc writeAndFlush(f: File, msg: LogOutputStr) = try: @@ -462,6 +473,25 @@ proc setupLogging*(conf: CodexConf) = proc noColorsFlush(logLevel: LogLevel, msg: LogOutputStr) = writeAndFlush(stdout, stripAnsi(msg)) + proc fileFlush(logLevel: LogLevel, msg: LogOutputStr) = + if file =? logFile: + if error =? file.writeFile(stripAnsi(msg).toBytes).errorOption: + error "failed to write to log file", errorCode = $error + + defaultChroniclesStream.outputs[2].writer = noOutput + if logFilePath =? conf.logFile and logFilePath.len > 0: + let logFileHandle = openFile( + logFilePath, + {OpenFlags.Write, OpenFlags.Create, OpenFlags.Truncate} + ) + if logFileHandle.isErr: + error "failed to open log file", + path = logFilePath, + errorCode = $logFileHandle.error + else: + logFile = logFileHandle.option + defaultChroniclesStream.outputs[2].writer = fileFlush + defaultChroniclesStream.outputs[1].writer = noOutput let writer = diff --git a/config.nims b/config.nims index aa0c1f0f..3c02c598 100644 --- a/config.nims +++ b/config.nims @@ -111,7 +111,7 @@ switch("define", "libp2p_pki_schemes=secp256k1") #TODO this infects everything in this folder, ideally it would only # apply to codex.nim, but since codex.nims is used for other purpose # we can't use it. And codex.cfg doesn't work -switch("define", "chronicles_sinks=textlines[dynamic],json[dynamic]") +switch("define", "chronicles_sinks=textlines[dynamic],json[dynamic],textlines[dynamic]") # begin Nimble config (version 1) when system.fileExists("nimble.paths"): diff --git a/tests/contracts/testContracts.nim b/tests/contracts/testContracts.nim index a04c9786..176e5d25 100644 --- a/tests/contracts/testContracts.nim +++ b/tests/contracts/testContracts.nim @@ -68,7 +68,8 @@ ethersuite "Marketplace contracts": switchAccount(host) await waitUntilProofRequired(slotId) let missingPeriod = periodicity.periodOf(await provider.currentTime()) - await provider.advanceTime(periodicity.seconds) + let endOfPeriod = periodicity.periodEnd(missingPeriod) + await provider.advanceTimeTo(endOfPeriod + 1) switchAccount(client) await marketplace.markProofAsMissing(slotId, missingPeriod) @@ -77,7 +78,7 @@ ethersuite "Marketplace contracts": let address = await host.getAddress() await startContract() let requestEnd = await marketplace.requestEnd(request.id) - await provider.advanceTimeTo(requestEnd.u256) + await provider.advanceTimeTo(requestEnd.u256 + 1) let startBalance = await token.balanceOf(address) await marketplace.freeSlot(slotId) let endBalance = await token.balanceOf(address) diff --git a/tests/contracts/testMarket.nim b/tests/contracts/testMarket.nim index 5925f9fe..e05cf2ad 100644 --- a/tests/contracts/testMarket.nim +++ b/tests/contracts/testMarket.nim @@ -70,7 +70,7 @@ ethersuite "On-Chain Market": test "supports withdrawing of funds": await market.requestStorage(request) - await provider.advanceTimeTo(request.expiry) + await provider.advanceTimeTo(request.expiry + 1) await market.withdrawFunds(request.id) test "supports request subscriptions": @@ -213,7 +213,7 @@ ethersuite "On-Chain Market": receivedIds.add(id) let subscription = await market.subscribeRequestCancelled(request.id, onRequestCancelled) - await provider.advanceTimeTo(request.expiry) + await provider.advanceTimeTo(request.expiry + 1) await market.withdrawFunds(request.id) check receivedIds == @[request.id] await subscription.unsubscribe() @@ -252,7 +252,7 @@ ethersuite "On-Chain Market": receivedIds.add(requestId) let subscription = await market.subscribeRequestCancelled(request.id, onRequestCancelled) - await provider.advanceTimeTo(request.expiry) # shares expiry with otherRequest + await provider.advanceTimeTo(request.expiry + 1) # shares expiry with otherRequest await market.withdrawFunds(otherRequest.id) check receivedIds.len == 0 await market.withdrawFunds(request.id) diff --git a/vendor/nim-ethers b/vendor/nim-ethers index 620b402a..2428b756 160000 --- a/vendor/nim-ethers +++ b/vendor/nim-ethers @@ -1 +1 @@ -Subproject commit 620b402a7d33385ae8e2cb5677e9f6dce9724acb +Subproject commit 2428b756d6fdee15017e76ec6077e890ebfd7bf6