【问题标题】:In a Hyperledger Fabric Smart Contract how do I turn on logging?在 Hyperledger Fabric 智能合约中,我如何打开日志记录?
【发布时间】:2020-12-01 09:52:55
【问题描述】:

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

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

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

【问题讨论】:

    标签: java node.js hyperledger-fabric hyperledger-chaincode chaincode


    【解决方案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
    • 注意映射到 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 使用的关卡

    • CRITICIAL 映射到致命
    • ERROR 映射到到错误
    • WARNING 映射到警告
    • DEBUG 映射到进行调试
    • INFO 映射到到信息

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

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

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

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

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

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

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

    日志去哪里了?

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

    【讨论】:

      【解决方案2】:

      在开发链码时,推荐使用 dev-mode。您可以从下面的链接中查看。

      hyperledger/fabric/peer-devmode

      此时,您可以在启动chaincode时通过更改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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-11
        • 2019-11-17
        • 2019-10-23
        • 1970-01-01
        • 2020-06-05
        • 2021-06-27
        • 2018-04-02
        • 1970-01-01
        相关资源
        最近更新 更多