Hello devs. I would like to get your take on something we are considering.
Background
Debugging an application is an exercise that every developer will have to perform at some point. There are many ways to debug, but the tool that developers reach for first - and this is pretty much universal - is the log.
How many times have you written console.log
or println
? Probably more times than you can count. And you very likely trace a few print statements before you bust out the big guns and start adding in breakpoints.
Suffice it to say, being able to write and read logs is important, and it aids immeasurably in debugging. Why donât we have platform-level logging capabilities on IC then?
Itâs complicated
Providing the ability to write and retrieve logs on the IC is no small feat. Several things need to be considered, and each requires extensive design and planning. For example, collecting a log across many replicated nodes is a challenge. So is ensuring what is being returned is certified and secure. What about cost and performance? Minimizing attack vectors? The list goes on and on.
While itâs certainly a tough problem to solve at the platform level, a few fine folks have gone ahead and created logging libraries in user land. This is great, and it is a testament to the gumption of this developer community. But, user land logs can only get us so farâŚ
The shortcomings
Currently, there are two main shortcomings when it comes to logging in user space.
No ability to write logs during query calls
Since query calls canât update state, any logs that would be written during the execution of that query method would not be persisted. Debugging a query call in this way would not be possible.
Possible alternative?
Using a separate logging service / canister and HTTPS outcalls, send the log elsewhere for processing. This might work, but it is expensive and complicated.
Inability to retrieve logs when a trap occurs
If your canister traps, that is likely one scenario where you need logs the most. However, since your canister is in a non-functional state at this point, there would be no way to write or retrieve those logs until the canister was restored to a functioning state.
Platform-level Logging
My question then to you is this: Do you want platform-level logging? Is the ability to log query calls a compelling enough value-add for you to consider using platform-level logging over your current logging solution? What about for logging traps?
We will use this information to decide how we should prioritize bringing platform-level canister logs to you through the Rust and Motoko CDKâs and Replica execution environment.
Thank you and looking forward to your responses!
cc @dsarlis