Hyperledger fabric 如何很好地格式化(“漂亮打印”)结构链码查询输出?

Hyperledger fabric 如何很好地格式化(“漂亮打印”)结构链码查询输出?,hyperledger-fabric,hyperledger-chaincode,Hyperledger Fabric,Hyperledger Chaincode,我试图生成一个格式良好的特定分类账分录(或分录范围)视图,其中包含所有相关值 运行链码查询时,会得到如下输出: user@server:~/fabric-samples/test-network$ peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile $ORDERER_CA -C mychannel -n myFirstChaincode --

我试图生成一个格式良好的特定分类账分录(或分录范围)视图,其中包含所有相关值

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

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字符串,其换行符替换为
\

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

我曾尝试向chaincode查询函数添加类似于
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之后格式化输出

建议您可以使用环境变量修改peer命令所使用的日志记录格式,尽管除了这一网页之外,我没有找到任何示例或详细信息。 当我尝试将环境变量添加到cli时:
export FABRIC\u LOGGING\u FORMAT=json
,没有多大帮助(它添加了更多“/”而不是换行):

(上面的测试是在一个单独的服务器上运行的,使用的是股票样本链码。) 注意:我还尝试用“format:json”更新fabric samples/config/core.yaml文件,然后重新运行链码(在正确关闭所有内容并重新启动网络之后)。这提供了与以前相同的输出(与原始输出没有变化)。我还尝试在/etc/hyperledger/fabric/core.yaml处编辑对等docker容器的内部core.yaml文件,这似乎也不会影响输出

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

如果我尝试在输出字符串上使用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行是第二个版本)

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

目前对此是否有任何解决方案/建议


我很乐意使用JSON格式或任何其他具有空格/换行符的格式,并使当前输出更具可读性。

您可以更新core.yaml,也可以在docker compose文件中使用“FABRIC\u LOGGING\u 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

链接:

如果下载最新的结构示例,可以在“fabric samples/config”目录中找到sample core.yaml

docker compose文件中的“FABRIC_LOGGING_FORMAT”示例如下所示: 您必须使用“-FABRIC\u LOGGING\u FORMAT=json”编辑cli容器的环境


您好,谢谢您的回复!您知道可以使用哪些格式参数来改进输出的格式(例如插入适当的换行符和间距)吗?我仍然不确定如何完成这部分(或者是否可以使用core.yaml或FABRIC_LOGGING_FORMAT环境变量完成)。Hi Ta seen Junaid,感谢您的回复和编辑。由于我正在使用的最新结构示例中没有cli容器,因此我向两个对等节点添加了“-fabric\u LOGGING\u FORMAT=json”变量。然而,它并没有改变输出。我尝试直接在CLI中设置变量-这一次,它更改了输出,但没有添加换行符,而是添加了额外的“/”。(请参阅我在编辑的帖子中添加的代码输出。)您可以在“fabric samples/config”目录中找到core.yaml。请在core.yaml中更新“format:json”。我也更新了我的答案。core.yaml和docker compose文件都适合我。是的,您使用的是对等cli,而不是容器。链接:你好,我在fabric samples/config/core.yaml中添加了“format:json”,清理了网络(./network down),重新启动了网络和链码-我的输出中仍然有“/”。我还尝试登录到对等容器并修改对等容器的内部core.yaml(位于/etc/hyperledger/fabric/core.yaml),然后重新运行链码,但仍然收到相同的输出。
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\":{}}}"
 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()}`);
    # 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
  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