【问题标题】:How to nicely format ("pretty print") Fabric chaincode query output?如何很好地格式化(“漂亮的打印”)织物链码查询输出?
【发布时间】:2020-11-12 01:04:42
【问题描述】:

我正在尝试为具有所有相关值的特定分类帐条目(或条目范围)生成格式良好的视图。

当我运行链码查询时,我得到如下输出:

user@server:~/fabric-samples/test-network$ peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile $ORDERER_CA -C mychannel -n myFirstChaincode --peerAddresses localhost:7051 --tlsRootCertFiles $PEER1_TLS -c '{"function":"queryOrder","Args":["004"]}'
2020-11-08 16:01:05.166 UTC [chaincodeCmd] chaincodeInvokeOrQuery -> INFO 001 Chaincode invoke successful. result: status:200 payload:"{\"actualDimensions\":{\"DIM1\":{},\"DIM2\":{},\"DIM3\":{},\"DIM4\":{}},\"customer\":\"GM\",\"dueDate\":\"tomorrow\",\"manufacturer\":\"undefined\",\"manufacturingData\":{},\"numOfDims\":\"5\",\"orderStatus\":\"new\",\"partID\":\"004\",\"partName\":\"Test Part\",\"requiredDimensions\":{\"DIM1\":{},\"DIM2\":{},\"DIM3\":{},\"DIM4\":{}}}" 

此输出看起来像一个长 JSON 字符串,其中换行符替换为 \

我正在寻找人类可读的输出。虽然我可以阅读上面的条目,但相关的数据结构非常简单。如果我用多个嵌套对象查询另一个条目,它很快就会变得过于混乱而难以阅读。

我尝试将JSON.stringify(value,null,4) 之类的内容添加到链码查询函数中,但这无济于事:

2020-11-07 23:40:41.964 UTC [chaincodeCmd] chaincodeInvokeOrQuery -> INFO 001 Chaincode invoke successful. result: status:200 payload:"{\n    \"actualDimensions\": {\n        \"DIM1\": {},\n        \"DIM2\": {},\n        \"DIM3\": {},\n        \"DIM4\": {}\n    },\n    \"customer\": \"GM\",\n    \"dueDate\": \"tomorrow\",\n    \"manufacturer\": \"undefined\",\n    \"manufacturingData\": {},\n    \"numOfDims\": \"5\",\n    \"orderStatus\": \"new\",\n    \"partID\": \"004\",\n    \"partName\": \"Test Part\",\n    \"requiredDimensions\": {\n        \"DIM1\": {},\n        \"DIM2\": {},\n        \"DIM3\": {},\n        \"DIM4\": {}\n    }\n}" 

似乎peer命令可能在JSON.stringify之后格式化输出...

This page 建议您可以使用环境变量修改用于 peer 命令的日志记录格式,尽管除了该网页之外,我没有找到任何示例或详细信息。 当我尝试向我的 cli 添加环境变量时: export FABRIC_LOGGING_FORMAT=json,并没有太大帮助(它添加了更多的 '/' 而不是换行符):

student@hlfmc:~/fabric-samples/test-network$ peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile $ORDERER_CA -C mychannel -n basic --peerAddresses localhost:7051 --tlsRootCertFiles $PEER1_TLS --peerAddresses localhost:9051 --tlsRootCertFiles $PEER2_TLS -c '{"function":"GetAllAssets","Args":[]}'
{"level":"info","ts":1605042675.2069416,"name":"chaincodeCmd","caller":"chaincode/common.go:160","msg":"Chaincode invoke successful. result: status:200 payload:\"[{\\\"Key\\\":\\\"asset1\\\",\\\"Record\\\":{\\\"ID\\\":\\\"asset1\\\",\\\"Color\\\":\\\"blue\\\",\\\"Size\\\":5,\\\"Owner\\\":\\\"Tomoko\\\",\\\"AppraisedValue\\\":300,\\\"docType\\\":\\\"asset\\\"}},{\\\"Key\\\":\\\"asset2\\\",\\\"Record\\\":{\\\"ID\\\":\\\"asset2\\\",\\\"Color\\\":\\\"red\\\",\\\"Size\\\":5,\\\"Owner\\\":\\\"Brad\\\",\\\"AppraisedValue\\\":400,\\\"docType\\\":\\\"asset\\\"}},{\\\"Key\\\":\\\"asset3\\\",\\\"Record\\\":{\\\"ID\\\":\\\"asset3\\\",\\\"Color\\\":\\\"green\\\",\\\"Size\\\":10,\\\"Owner\\\":\\\"Jin Soo\\\",\\\"AppraisedValue\\\":500,\\\"docType\\\":\\\"asset\\\"}},{\\\"Key\\\":\\\"asset4\\\",\\\"Record\\\":{\\\"ID\\\":\\\"asset4\\\",\\\"Color\\\":\\\"yellow\\\",\\\"Size\\\":10,\\\"Owner\\\":\\\"Max\\\",\\\"AppraisedValue\\\":600,\\\"docType\\\":\\\"asset\\\"}},{\\\"Key\\\":\\\"asset5\\\",\\\"Record\\\":{\\\"ID\\\":\\\"asset5\\\",\\\"Color\\\":\\\"black\\\",\\\"Size\\\":15,\\\"Owner\\\":\\\"Adriana\\\",\\\"AppraisedValue\\\":700,\\\"docType\\\":\\\"asset\\\"}},{\\\"Key\\\":\\\"asset6\\\",\\\"Record\\\":{\\\"ID\\\":\\\"asset6\\\",\\\"Color\\\":\\\"white\\\",\\\"Size\\\":15,\\\"Owner\\\":\\\"Michel\\\",\\\"AppraisedValue\\\":800,\\\"docType\\\":\\\"asset\\\"}}]\" "}

(上面的测试是在单独的服务器上运行的,使用 stock "asset-transfer-basic" 示例链代码。) 注意:我还尝试使用“格式:json”更新 fabric-samples/config/core.yaml 文件,然后重新运行链代码(在正确关闭所有内容并重新启动网络之后)。这给出了与以前相同的输出(与原始输出没有变化)。我还尝试在 /etc/hyperledger/fabric/core.yaml 编辑对等 docker 容器的内部 core.yaml 文件,这似乎也没有影响输出。

我还尝试过从应用程序调用链代码(而不是直接从 CLI 调用)。结果输出字符串不再有'/'(但仍然没有换行符/缩进):

user@server$ node query2.js 
Wallet path: /home/user/Project/application/wallet
Transaction has been evaluated, result is: {"actualDimensions":{"DIM1":{},"DIM2":{},"DIM3":{},"DIM4":{}},"customer":"GM","dueDate":"tomorrow","manufacturer":"undefined","manufacturingData":{},"numOfDims":"5","orderStatus":"new","partID":"004","partName":"Test Part","requiredDimensions":{"DIM1":{},"DIM2":{},"DIM3":{},"DIM4":{}}}

如果我尝试在输出字符串上使用 JSON.stringify,我会再次得到“/”:

user@server$ node query2.js
Wallet path: /home/user/Project/application/wallet
Transaction has been evaluated, result is: "{\"actualDimensions\":{\"DIM1\":{},\"DIM2\":{},\"DIM3\":{},\"DIM4\":{}},\"customer\":\"GM\",\"dueDate\":\"tomorrow\",\"manufacturer\":\"undefined\",\"manufacturingData\":{},\"numOfDims\":\"5\",\"orderStatus\":\"new\",\"partID\":\"004\",\"partName\":\"Test Part\",\"requiredDimensions\":{\"DIM1\":{},\"DIM2\":{},\"DIM3\":{},\"DIM4\":{}}}"

这是应用程序代码:(第 48 行是原始版本;46-47 是第二个版本)

 45   ¦ ¦ ¦ const result = await contract.evaluateTransaction('queryOrder','004');
 46   ¦ ¦ ¦ const stringResult=result.toString();
 47   ¦ ¦ ¦ console.log(`Transaction has been evaluated, result is: ${JSON.stringify(stringResult,null,4)}`);
 48   ¦ ¦ ¦ //console.log(`Transaction has been evaluated, result is: ${result.toString()}`);

我看到这个post 有一个类似的问题,但它没有为漂亮的格式提供任何解决方案。

目前有什么解决方案/建议吗?

我会对 JSON 格式或其他任何具有间距/换行符并使当前输出更易于阅读的内容感到满意。

【问题讨论】:

    标签: hyperledger-fabric hyperledger-chaincode


    【解决方案1】:

    您可以更新 core.yaml,也可以在 docker compose 文件中使用“FABRIC_LOGGING_FORMAT”。

    下面给出了一个 core.yaml 的例子:

        # Logging section for the chaincode container
    logging:
      # Default level for all loggers within the chaincode container
      level:  info
      # Override default level for the 'shim' logger
      shim:   warning
      # Format for the chaincode container logs
      format: json
    

    你可以在“fabric-samples/config”目录中找到core.yaml。

    链接:https://github.com/hyperledger/fabric/blob/master/sampleconfig/core.yaml

    如果您下载最新的 Fabric 示例,您可以在“fabric-samples/config”目录中找到示例 core.yaml。

    下面给出了 docker compose 文件中带有“FABRIC_LOGGING_FORMAT”的示例: 您必须使用“-FABRIC_LOGGING_FORMAT=json”编辑cli容器的环境

      cli:
    container_name: cli
    image: hyperledger/fabric-tools:$IMAGE_TAG
    tty: true
    stdin_open: true
    environment:
      - GOPATH=/opt/gopath
      - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
      #- FABRIC_LOGGING_SPEC=DEBUG
      - FABRIC_LOGGING_FORMAT=json
      - FABRIC_LOGGING_SPEC=INFO
      - CORE_PEER_ID=cli
      - CORE_PEER_ADDRESS=peer0.org1.example.com:7051
      - CORE_PEER_LOCALMSPID=Org1MSP
      - CORE_PEER_TLS_ENABLED=true
      - CORE_PEER_TLS_CERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/server.crt
      - CORE_PEER_TLS_KEY_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/server.key
      - CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
      - CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
    working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
    command: /bin/bash
    volumes:
        - /var/run/:/host/var/run/
        - ./../chaincode/:/opt/gopath/src/github.com/hyperledger/fabric-samples/chaincode
        - ./crypto-config:/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/
        - ./scripts:/opt/gopath/src/github.com/hyperledger/fabric/peer/scripts/
        - ./channel-artifacts:/opt/gopath/src/github.com/hyperledger/fabric/peer/channel-artifacts
    depends_on:
      - orderer.example.com
      - peer0.org1.example.com
      - peer1.org1.example.com
      - peer0.org2.example.com
      - peer1.org2.example.com
    networks:
      - byfn
    

    【讨论】:

    • 您好 Ta-seen Junaid,谢谢您的回复!您知道可以使用哪些格式参数来改进输出格式(例如插入适当的换行符和间距)吗?我仍然不确定如何做这部分(或者是否可以使用 core.yaml 或 FABRIC_LOGGING_FORMAT 环境变量来完成。)
    • 您好 Ta-seen Junaid,感谢您的回复和编辑。由于我正在使用的最新结构示例中没有 cli 容器,因此我将“-FABRIC_LOGGING_FORMAT=json”变量添加到两个对等节点。但是它并没有改变输出。我尝试直接在 CLI 中设置变量——这一次,它改变了输出,但它没有添加换行符,而是添加了额外的“/”。 (请参阅我在编辑后的帖子中添加的代码输出。)
    • 你可以在“fabric-samples/config”目录中找到core.yaml。请更新 core.yaml 中的“格式:json”。我也更新了我的答案。 core.yaml 和 docker compose 文件都对我有用。
    • 是的,您使用的是对等 cli,而不是容器。链接:hyperledger-fabric.readthedocs.io/en/release-2.2/…
    • 你好 Ta-seen Junaid,我在 fabric-samples/config/core.yaml 中添加了“格式:json”,清理了网络(./network down)并重新启动了网络和链码 - 我我的输出中仍然有'/'。我还尝试登录对等容器并修改对等的内部 core.yaml(位于 /etc/hyperledger/fabric/core.yaml),然后重新运行链代码,但仍然收到相同的输出。
    猜你喜欢
    • 2017-11-04
    • 2013-11-19
    • 2010-09-28
    • 1970-01-01
    • 2011-01-07
    • 2017-09-16
    • 2016-08-26
    • 2011-02-04
    • 2022-11-18
    相关资源
    最近更新 更多