Как включить ведение журнала в смарт-контракте Hyperledger Fabric?

#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 причины.

  1. Возможно, вы захотите сопоставить здесь свои собственные изменения уровня ведения журнала для своего собственного кода смарт-контракта.
  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