问题描述
我正在尝试生成具有所有相关值的特定分类帐条目(或条目范围)的格式良好的视图。
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