Skip to main content

Command Palette

Search for a command to run...

Microblog: Debug logging in Anchor and Solana

Published
2 min read
Microblog: Debug logging in Anchor and Solana
S

I build things and teach others how to build things.

Logging can be expensive for programs deployed to Solana or logs may contain sensitive information that should not be available during the normal operation of a program.

In these scenarios, we miss having different log levels, as we are used to with other application frameworks. In this micro-post, we will implement this feature for both Anchor and plain Solana applications.

We will try to keep things simple: introduce a macro that includes or omits logs based on a Cargo feature.

Anchor

The debug macro, for Anchor programs, is implemented as below:

#[macro_export]
macro_rules! debug {
    ($($rest:tt)*) => {
        #[cfg(feature="verbose")]
        anchor_lang::prelude::msg!($($rest)*)
    };
}

The macro checks for the verbose Cargo feature and includes the logging statement if it is enabled.

For this to work, you will need to declare a verbose feature in the program's Cargo.toml:

[features]
...
verbose = []
...

Now you can use this feature in your code:

debug!("some super detailed info");
debug!("the secret is {}", secret);

We can build binaries with or without debug logging using the following Anchor commands:

# with debug logging
anchor build -- --features verbose
# without debug logging
anchor build

Unfortunately, both anchor build and anchor test run Cargo builds with --release flag so we have to be explicit about enabling the feature.

Solana

The differences are minimal between Anchor and non-Anchor versions.

The debug macro is defined as below:

#[macro_export]
macro_rules! debug {
    ($($rest:tt)*) => {
        #[cfg(debug_assertions)]
        solana_program::msg!($($rest)*)
    };
}

Here we use the standard debug_assertions conditional compilation instead. This removes the need for defining custom features and can be controlled by the standard Cargo profiles.

And cargo commands are used for the build:

# with debug logging
cargo build
# without debug logging
cargo build --release