#java #node.js #hyperledger-fabric #hyperledger-chaincode #chaincode
#java #node.js #hyperledger-fabric #hyperledger-цепной код #цепной код
Вопрос:
Я написал смарт-контракты Hyperledger Fabric на Java и NodeJS. Как мне включить разные уровни ведения журнала?
Сами классы смарт-контрактов Fabric регистрируются на информационном уровне, как мне изменить это, когда контракт развернут и запущен?
РЕДАКТИРОВАТЬ: включено Node.js (для JavaScript и Typescript), а также Java.
Ответ №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
уровнями, являются
- КРИТИЧНО, ОШИБКА отображается на уровень.СЕРЬЕЗНЫЙ
- ПРЕДУПРЕЖДЕНИЕ отображается на уровень.ПРЕДУПРЕЖДЕНИЕ
- ИНФОРМАЦИЯ отображается на Level.INFO
- ОБРАТИТЕ ВНИМАНИЕ на сопоставление с уровнем.КОНФИГУРАЦИЯ
- ОТЛАДКА сопоставляется с уровнем.FINEST
Все остальное сопоставляется с INFO.
Все запускаемые регистраторы org.hyperledger
будут обновлены.
В Node.js (этот пример приведен на машинописном языке)
@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
указания заголовка контракта используется аннотация и используется суперкласс of Contract
. Не забудьте добавить этот класс contract в список экспорта в index.js/ index.ts, иначе он не будет получен.
Приведенное здесь сопоставление соответствует уровням, используемым Winston
- КРИТИЧЕСКИЕ сопоставления с фатальными
- ОШИБКА сопоставляется с ошибкой
- ПРЕДУПРЕЖДЕНИЕ сопоставляется с предупреждением
- ОТЛАДКА сопоставляется с отладкой
- ИНФОРМАЦИЯ сопоставляется с информацией
ИНФОРМАЦИЯ по умолчанию, если указано что-то еще.
Отправлять или оценивать?В примере я пометил это как оценить. Помните, что эта аннотация является рекомендацией, в конечном итоге именно то, как клиентское приложение отправляет транзакцию, определяет, отправлена ли она для заказа.
Поскольку это влияет не на регистр, а на фактически выполняемый цепной код, который вы можете использовать либо для оценки, либо для отправки. Важно подумать о том, какие экземпляры chaincode будут запускать код.
Оценка будет отправлена одному одноранговому узлу, и, следовательно, один цепной код включит ведение журнала. Отправка отправит потенциально другим одноранговым узлам в других организациях. Вы хотите включить дополнительное ведение журнала для всех из них?
Вероятно, лучше всего использовать evaluate , а затем вернуть уровень в INFO, когда у вас будет необходимая диагностика.
Почему я должен сам это кодировать?Действительный вопрос, есть 2 причины.
- Возможно, вы захотите сопоставить здесь свои собственные изменения уровня ведения журнала для своего собственного кода смарт-контракта.
- Для других функций транзакций вы, вероятно, захотите реализовать некоторую проверку того, кто отправляет изменения в журнал. Возможно, вам даже захочется обновить определенный ключ в книге учета, чтобы записать изменения.
Куда идут журналы?
Они переходят к стандартному выходу процесса цепного кода, который обычно фиксируется средой, например, Kubernetes.
Ответ №2:
При разработке цепного кода рекомендуется использовать режим разработки. Вы можете проверить это по ссылке ниже.
hyperledger / fabric / peer-devmode
В настоящее время вы можете легко изменить уровень журнала, изменив CORE_CHAINCODE_LOGLEVEL
параметр при запуске chaincode.
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