1

我用 Java 和 NodeJS 编写了一个 Hyperledger Fabric 智能合约。如何打开不同级别的日志记录?

Fabric 智能合约类本身记录在 INFO 级别,在部署和运行合约时如何更改它?

编辑:包括 Node.js(用于 JavaScript 和 Typescript)以及 Java。

4

2 回答 2

1

解决方案是实现一个简单的“助手”事务。例如,您可以创建另一个类,如下所示。

在 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级别是

  • CRITICAL, ERROR映射到Level.SEVERE
  • WARNING映射到Level.WARNING
  • INFO映射到Level.INFO
  • NOTICE映射到Level.CONFIG
  • DEBUG映射到Level.FINEST

其他任何内容都映射到 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 使用的关卡

  • 关键映射到致命
  • ERROR映射到错误
  • WARNING映射到警告
  • DEBUG映射到调试
  • INFO映射到信息

如果提供了其他内容,则 INFO 是默认值。

我提交或评估? 在示例中,我将此标记为评估。请记住,此注释是一个建议,最终由客户端应用程序提交事务的方式决定它是否发送以进行排序。

因为这不会影响分类帐,但您可以使用评估或提交实际运行的链代码。重要的是要考虑哪些链码实例将运行代码。

评估将发送给一个对等点,因此一个链码将启用日志记录。提交将发送给其他组织中的潜在其他同行。您想在所有这些中启用额外的日志记录吗?

最好使用评估,然后在获得所需诊断后将级别返回到 INFO。

为什么我必须自己编写代码? 有效的问题,有两个原因。

  1. 您可能希望在此处为您自己的智能合约代码映射您自己的日志记录级别更改。
  2. 对于其他事务功能,您可能希望对谁提交日志更改进行一些验证。您甚至可能想要更新分类帐中的特定键以记录更改。

日志去哪儿了?

它们进入链码进程的标准输出,通常会被环境捕获,例如 Kubernetes。

于 2020-12-01T09:52:55.697 回答
1

开发链码时,推荐使用 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
于 2020-12-03T06:13:42.050 回答