我用 Java 和 NodeJS 编写了一个 Hyperledger Fabric 智能合约。如何打开不同级别的日志记录?
Fabric 智能合约类本身记录在 INFO 级别,在部署和运行合约时如何更改它?
编辑:包括 Node.js(用于 JavaScript 和 Typescript)以及 Java。
我用 Java 和 NodeJS 编写了一个 Hyperledger Fabric 智能合约。如何打开不同级别的日志记录?
Fabric 智能合约类本身记录在 INFO 级别,在部署和运行合约时如何更改它?
编辑:包括 Node.js(用于 JavaScript 和 Typescript)以及 Java。
解决方案是实现一个简单的“助手”事务。例如,您可以创建另一个类,如下所示。
在 Java 中:
@Contract(name = "ContractSupport")
public class ContractSupport implements ContractInterface {
/**
* Required Default Constructor.
*/
public ContractSupport() {
}
/**
* Sets the log level.
*
* The setLogLevel method has the required parsing to manage the levels.
*
* @param ctx Transactional Context
* @param level string id
*/
@Transaction(intent = TYPE.EVALUATE)
public void setLogLevel(final Context ctx, final String level) {
Logging.setLogLevel(level);
}
}
请注意,这具有@Contract()
注释,因此可以从客户端 SDK 调用它作为任何其他事务函数。请记住确保注释中的名称与您的其他合同不同,并且不要使用@Default()
注释 - 您自己的代码应该使用该注释。
该Logging.setLogLevel
方法接受的字符串以及它们如何映射到java.util.logging
级别是
其他任何内容都映射到 INFO。
所有启动的记录器都org.hyperledger
将被更新。
在 Node.js中(此示例在 Typescript 中)
@Info({ title: 'ContractSupport', description: 'Utilties to support the contract' })
export class ContractSupport extends Contract {
@Transaction(false)
public async setLogLevel(ctx: Context, loglevel: string): Promise<void> {
const logger = ctx.logger.setLevel(loglevel);
}
}
这是使用@Info
注解来指定合同标题并使用超类Contract
。请记住将此合约类添加到 index.js/index.ts 中的导出列表中,否则将不会被拾取。
这里的映射映射到 Winston 使用的关卡
如果提供了其他内容,则 INFO 是默认值。
我提交或评估? 在示例中,我将此标记为评估。请记住,此注释是一个建议,最终由客户端应用程序提交事务的方式决定它是否发送以进行排序。
因为这不会影响分类帐,但您可以使用评估或提交实际运行的链代码。重要的是要考虑哪些链码实例将运行代码。
评估将发送给一个对等点,因此一个链码将启用日志记录。提交将发送给其他组织中的潜在其他同行。您想在所有这些中启用额外的日志记录吗?
最好使用评估,然后在获得所需诊断后将级别返回到 INFO。
为什么我必须自己编写代码? 有效的问题,有两个原因。
日志去哪儿了?
它们进入链码进程的标准输出,通常会被环境捕获,例如 Kubernetes。
开发链码时,推荐使用 dev-mode。您可以从下面的链接中查看。
hyperledger/fabric/peer-devmode
此时,您可以通过更改CORE_CHAINCODE_LOGLEVEL
启动链码时的选项来轻松修改日志级别。
cd examples/chaincode/go/chaincode_example02
go build
CORE_CHAINCODE_LOGLEVEL=debug CORE_PEER_ADDRESS=127.0.0.1:7052 CORE_CHAINCODE_ID_NAME=mycc:0 ./chaincode_example02