如何很好地格式化“漂亮打印”Fabric链码查询输出?

问题描述

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

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

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\":{},\"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        \"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\\\",\\\"Owner\\\":\\\"Brad\\\",\\\"AppraisedValue\\\":400,{\\\"Key\\\":\\\"asset3\\\",\\\"Record\\\":{\\\"ID\\\":\\\"asset3\\\",\\\"Color\\\":\\\"green\\\",\\\"Size\\\":10,\\\"Owner\\\":\\\"Jin Soo\\\",\\\"AppraisedValue\\\":500,{\\\"Key\\\":\\\"asset4\\\",\\\"Record\\\":{\\\"ID\\\":\\\"asset4\\\",\\\"Color\\\":\\\"yellow\\\",\\\"Owner\\\":\\\"Max\\\",\\\"AppraisedValue\\\":600,{\\\"Key\\\":\\\"asset5\\\",\\\"Record\\\":{\\\"ID\\\":\\\"asset5\\\",\\\"Color\\\":\\\"black\\\",\\\"Size\\\":15,\\\"Owner\\\":\\\"Adriana\\\",\\\"AppraisedValue\\\":700,{\\\"Key\\\":\\\"asset6\\\",\\\"Record\\\":{\\\"ID\\\":\\\"asset6\\\",\\\"Color\\\":\\\"white\\\",\\\"Owner\\\":\\\"Michel\\\",\\\"AppraisedValue\\\":800,\\\"docType\\\":\\\"asset\\\"}}]\" "}

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

我也尝试过从应用程序(而不是直接从CLI)调用chaincode。结果输出字符串不再具有“ /”(但仍然没有换行符/缩进):

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":{},"DIM4":{}}}

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

user@server$ node query2.js
Wallet path: /home/user/Project/application/wallet
Transaction has been evaluated,result is: "{\"actualDimensions\":{\"DIM1\":{},\"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,4)}`);
 48   ¦ ¦ ¦ //console.log(`Transaction has been evaluated,result is: ${result.toString()}`);

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

目前是否有解决方案/建议?

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

解决方法

您可以更新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-samples / config”目录中找到样品core.yaml。

在docker撰写文件中使用“ 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/[email protected]/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