Help with `tracing` logger output

I got a logger output in a file like this:

{"timestamp":"2024-07-13 21:03:41","level":"INFO","body":"{\"blockTime\":1720114630,\"slot\":275670177,\"txHash\":\"4tzrJRkLYUkm42uBFLy7EbRoUC9pHPmTGddytP4gLpM59a2VK7uGR6Kst9gpprZy74j2TbGavM7DjDu2uKKfQ9n\",\"fee\":28107,\"status\":\"Success\",\"lamport\":0,\"signer\":[\"NTYeYJ1wr4bpM5xo6zx5En44SvJFAd35zTxxNoERYqd\"],\"logMessage\":[\"Program ComputeBudget111111111111111111111111111111 invoke [1]\",\"Program ComputeBudget111111111111111111111111111111 success\",\"Program ComputeBudget111111111111111111111111111111 invoke [1]\",\"Program ComputeBudget111111111111111111111111111111 success\",\"Program LUCK57mxzZiRGF2PdHAY79P6tZ8Apsi381tKvBrTdqk invoke [1]\",\"Program log: Instruction: FulfillNone\",\"Program log: Found valid hash result after 1 iteration, hash result is 940472487\",\"Program 11111111111111111111111111111111 invoke [2]\",\"Program 11111111111111111111111111111111 success\",\"Program 11111111111111111111111111111111 invoke [2]\",\"Program 11111111111111111111111111111111 success\",\"Program log: Transferred: { \\\"treasury\\\": 28626099, \\\"buyer\\\": 5003789 }\",\"Program log: Fulfilled None reward\",\"Program LUCK57mxzZiRGF2PdHAY79P6tZ8Apsi381tKvBrTdqk consumed 29878 of 35913 compute units\",\"Program return: LUCK57mxzZiRGF2PdHAY79P6tZ8Apsi381tKvBrTdqk AA==\",\"Program LUCK57mxzZiRGF2PdHAY79P6tZ8Apsi381tKvBrTdqk success\"],\"inputAccount\":[{\"account\":\"NTYeYJ1wr4bpM5xo6zx5En44SvJFAd35zTxxNoERYqd\",\"signer\":true,\"writable\":true,\"preBalance\":84212500548,\"postBalance\":84212472441},{\"account\":\"DaXTQ9pmiDJFJriAYKbZv9F4DQoc9pQhzZQqJcz2uBch\",\"signer\":false,\"writable\":true,\"preBalance\":162642547,\"postBalance\":175664256},{\"account\":\"3iATa7zAAvcxzNw25mBzCLdapcdHeF5sd8UBrXXtF9MJ\",\"signer\":false,\"writable\":true,\"preBalance\":8017920,\"postBalance\":0},{\"account\":\"BiJww4hJHcPvisN2kZSNWwYHeMN8YHprHfW1RuRBcvMC\",\"signer\":false,\"writable\":true,\"preBalance\":33629888,\"postBalance\":0},{\"account\":\"ComputeBudget111111111111111111111111111111\",\"signer\":false,\"writable\":false,\"preBalance\":1,\"postBalance\":1},{\"account\":\"Ed25519SigVerify111111111111111111111111111\",\"signer\":false,\"writable\":false,\"preBalance\":1,\"postBalance\":1},{\"account\":\"LUCK57mxzZiRGF2PdHAY79P6tZ8Apsi381tKvBrTdqk\",\"signer\":false,\"writable\":false,\"preBalance\":1141440,\"postBalance\":1141440},{\"account\":\"CvE4XrkkUcgtqGUP86omxhNezFDoLVPNYdihEt8fEVhi\",\"signer\":false,\"writable\":true,\"preBalance\":8050281443680,\"postBalance\":8050310069779},{\"account\":\"11111111111111111111111111111111\",\"signer\":false,\"writable\":false,\"preBalance\":1,\"postBalance\":1},{\"account\":\"Sysvar1nstructions1111111111111111111111111\",\"signer\":false,\"writable\":false,\"preBalance\":0,\"postBalance\":0}],\"recentBlockhash\":\"EaCme48SmnEs9sywKbt4KR6g5KQW5JjaEBda9mWC1wZT\",\"innerInstructions\":[{\"index\":3,\"parsedInstructions\":[{\"programId\":\"11111111111111111111111111111111\",\"program\":\"system\",\"type\":\"sol-transfer\",\"name\":\"SOL Transfer\",\"params\":{\"source\":\"BiJww4hJHcPvisN2kZSNWwYHeMN8YHprHfW1RuRBcvMC\",\"destination\":\"CvE4XrkkUcgtqGUP86omxhNezFDoLVPNYdihEt8fEVhi\",\"amount\":28626099}},{\"programId\":\"11111111111111111111111111111111\",\"program\":\"system\",\"type\":\"sol-transfer\",\"name\":\"SOL Transfer\",\"params\":{\"source\":\"BiJww4hJHcPvisN2kZSNWwYHeMN8YHprHfW1RuRBcvMC\",\"destination\":\"DaXTQ9pmiDJFJriAYKbZv9F4DQoc9pQhzZQqJcz2uBch\",\"amount\":5003789}}]}],\"tokenBalances\":[],\"parsedInstruction\":[{\"programId\":\"ComputeBudget111111111111111111111111111111\",\"type\":\"Unknown\",\"data\":\"02758d0000\",\"dataEncode\":\"H6LaAB\",\"name\":\"Instruction 0\",\"params\":{}},{\"programId\":\"ComputeBudget111111111111111111111111111111\",\"type\":\"Unknown\",\"data\":\"0320a1070000000000\",\"dataEncode\":\"3Jv73z5Y9SRV\",\"name\":\"Instruction 1\",\"params\":{}},{\"programId\":\"Ed25519SigVerify111111111111111111111111111\",\"type\":\"Unknown\",\"data\":\"01003000ffff1000ffff70002000ffff0b2d50596a3fa8fe25c6de8896dc3511513bb6b1dce7b3ad04f5a862611985a824b819c701b39961ead0cd1a4069cd3224de482f38e1c41559e2603848792f91a112fe70dd281768d129cd8c62c3997159b72d031d5e7dfb606e53d1a5cd4d045032c8c7ca368f573b91a27dfa4b2ff5936b4e7309ec392090066a56f481141e\",\"dataEncode\":\"4Em4VK9kSwLdJbfKHSpHeMuvEQhkaMdX8sXe5QuSpHDG6daaek5smDawAZoCZUryayHs5bsMHrRvxGLFQZLD187gUMj2XeKfceJGBzaJ2T2AV2zgDwdJB7JnakQjDCfVCHsinoYBMhsdVtAmPtbTxVWQJDGscPWNZgL927X99vigJN8V5fdCNsbtKJtz9pAP5vwF\",\"name\":\"Instruction 2\",\"params\":{}},{\"programId\":\"LUCK57mxzZiRGF2PdHAY79P6tZ8Apsi381tKvBrTdqk\",\"type\":\"Unknown\",\"data\":\"c1994b8af7c11f2e\",\"dataEncode\":\"ZP9kpoq4pK7\",\"name\":\"Instruction 3\",\"params\":{\"Account0\":\"DaXTQ9pmiDJFJriAYKbZv9F4DQoc9pQhzZQqJcz2uBch\",\"Account1\":\"CvE4XrkkUcgtqGUP86omxhNezFDoLVPNYdihEt8fEVhi\",\"Account2\":\"3iATa7zAAvcxzNw25mBzCLdapcdHeF5sd8UBrXXtF9MJ\",\"Account3\":\"BiJww4hJHcPvisN2kZSNWwYHeMN8YHprHfW1RuRBcvMC\",\"Account4\":\"11111111111111111111111111111111\",\"Account5\":\"Sysvar1nstructions1111111111111111111111111\"}}],\"confirmations\":null,\"version\":0,\"tokenTransfers\":[],\"solTransfers\":[],\"serumTransactions\":[],\"raydiumTransactions\":[],\"unknownTransfers\":[{\"programId\":\"LUCK57mxzZiRGF2PdHAY79P6tZ8Apsi381tKvBrTdqk\",\"event\":[{\"source\":\"BiJww4hJHcPvisN2kZSNWwYHeMN8YHprHfW1RuRBcvMC\",\"destination\":\"CvE4XrkkUcgtqGUP86omxhNezFDoLVPNYdihEt8fEVhi\",\"amount\":28626099,\"type\":\"transfer\",\"decimals\":9,\"symbol\":\"SOL\",\"tokenAddress\":\"So11111111111111111111111111111111111111111\"},{\"source\":\"BiJww4hJHcPvisN2kZSNWwYHeMN8YHprHfW1RuRBcvMC\",\"destination\":\"DaXTQ9pmiDJFJriAYKbZv9F4DQoc9pQhzZQqJcz2uBch\",\"amount\":5003789,\"type\":\"transfer\",\"decimals\":9,\"symbol\":\"SOL\",\"tokenAddress\":\"So11111111111111111111111111111111111111111\"}]}]}","target":"common::sol_scan::transaction","filename":"common/src/sol_scan/transaction.rs","line_number":127}

How can I view it in json? I've tried vscode extension JSON Tools, but it cannot parse it into json.

The logger output is already in JSON format, but it has an embedded block of escaped JSON associated with the body key.

Presumably you want to extract this value and display it in a human-readable format.

While this is a Rust forum, I think a scripting language like Python would probably be a better fit for this job. For example, you can use a script like this:

import json
filename = "logger_output.txt"
with open(filename, 'r') as f:
    j = json.load(f)
    body = j['body']
    j2 = json.loads(body)
    print(json.dumps(j2, indent=4))

Or as a one-liner from the command line:

cat logger_output.txt | python -c 'import json; s=input(); \
j=json.loads(s); body=j["body"]; j2=json.loads(body); \
print(json.dumps(j2, indent=4))'
1 Like

Yes, I can write another program to do this, but I thought there maybe a more good way.
The following is the code generating the log,

   pub async fn transaction_detail(&self, signature: &str) -> Result<TransactionDetail> {
        
        let path = format!("/v1.0/transaction/{}", signature);
        let cache_key = format!("solscan:transaction_detail:{}", signature);
        let mut redis_conn = self.redis_conn.lock().await;
        let cached_response: Option<String> = redis_conn.get(&cache_key).await?;

        let body = match cached_response {
            Some(response) => {
                info!("Using cached response for {}", signature);
                response
            }
            None => {
                let response = self.request(&path, None).await?;
                redis_conn.set_ex(&cache_key, &response, 86400).await?;
                response
            }
        };
        info!(body);
        let detail = serde_json::from_str::<TransactionDetail>(&body)?;
        info!("have transaction detail");
        Ok(detail)
    }

If I can do this:

        let body_converted = some_converting_function(body);
        info!(body_converted);

This would be much more convinient.

If detail contains the full JSON from your original post, you can use serde_json::from_str again on detail.body and pretty-print it, as in the Python code.

The to_string_pretty function could be helpful:

1 Like

This topic was automatically closed 90 days after the last reply. We invite you to open a new topic if you have further questions or comments.