解决方案是实现一个简单的“助手”事务。例如,您可以创建另一个类,如下所示。
在 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 个原因。
- 您可能希望在此处为您自己的智能合约代码映射您自己的日志记录级别更改。
- 对于其他事务功能,您可能希望对提交日志更改的人员进行一些验证。您甚至可能想要更新分类帐中的特定键以记录更改。
日志去哪里了?
它们进入链码进程的标准输出,通常会被环境捕获,例如 Kubernetes。