
区块链【免费下载链接】eosAn open source smart contract platform项目地址https://gitcode.com/gh_mirrors/eo/eos点击查看免费下载本指南以 EOSIO 仓库中 Deep-mind Logger 集成文档 为核心系统讲解如何在nodeos上启用 Deep-mind logger、识别以DMLOG为前缀的结构化日志行并深入nodeos、chain_plugin与chain库源码说明这些日志事件从何处产生、如何输出帮助你为区块链数据索引、审计与分析类系统如 dfuse 平台提供完整的链上数据源。OverviewDeep-mind Logger 是什么Deep-mind logger是 dfuse 平台一个高可扩展、高性能的开源区块链数据搜索与处理平台的核心组件之一。它通过与 EOSIO 的nodeos核心服务守护进程深度集成将节点在出块、验证、资源限制、授权、数据库读写等链上操作过程中的内部细节以结构化、可机器解析的日志行完整输出出来。与面向人眼排障的普通nodeos日志不同Deep-mind 日志的目标读者是外部数据索引与处理程序下游系统例如 dfuse 的索引器可以消费这些日志重建出完整的链状态变化历史谁创建了表、哪一行数据被插入/更新/删除、每笔交易的完整 trace、协议特性何时激活等而无需解析区块二进制或依赖节点内存状态。在 EOSIO 中Deep-mind 日志功能由chain_plugin提供--deep-mind命令行开关其日志输出经由fc日志框架的专用dmlogappender 完成。与 Zipkin tracer 的关系在 第三方日志与追踪集成总览 中EOSIO 官方将 Deep-mind logger 与 Zipkin tracer 并列为两种官方支持的遥测集成方式遥测工具关注点输出形式Deep-mind logger链上操作细节区块、交易、资源、DB 变更、协议特性文本日志行DMLOG前缀Zipkin tracer节点内部请求/处理的分布式追踪时序Zipkin spanHTTP 上报二者用途互补Deep-mind 回答链上发生了什么Zipkin 回答节点内部处理耗时如何。如何启用 Deep-mind Logger要获得完整的 Deep-mind 日志功能只需在启动nodeos实例时追加--deep-mind标志nodeos --deep-mind该标志在源码中定义于 chain_plugin.cpp(contracts-console, bpo::bool_switch()-default_value(false), print contracts output to console) (deep-mind, bpo::bool_switch()-default_value(false), print deeper information about chain operations)类型为布尔开关默认关闭false开启后nodeos会输出关于链操作的更深层信息print deeper information about chain operations。启动后即可在nodeos控制台输出中观察到 Deep-mind logger 生成的详细信息。这些日志行与默认nodeos输出行的区别在于它们以DMLOG关键字开头。此外chain_plugin还会同时输出一条独立的启动日志行以dm-log相关文本标识便于确认 Deep-mind 已激活。启用时的底层处理--deep-mind开启后chain_plugin.cpp 会执行两件关键操作// initialize deep mind logging if ( options.at( deep-mind ).asbool() ) { // ...注释说明见下 setbuf(stdout, NULL); // 1. 将 stdout 切换为无缓冲 I/O my-chain-enable_deep_mind( _deep_mind_log ); // 2. 在 controller 上启用 Deep-mind 并挂接日志器 }setbuf(stdout, NULL)将标准输出从行缓冲切换为无缓冲模式。源码注释chain_plugin.cpp解释了原因Deep-mind 会向进程外输出海量数据在高压力下fwrite等系统调用可能在中途失败如果使用 libc 持有的缓冲恢复与重试几乎不可能正确完成。改为无缓冲后fc::dmlog_appender可以在写入失败时自行重试从而获得更健壮的输出。注释同时提到未来版本计划改用 FIFO 文件方式输出以彻底摆脱对stdout的依赖。enable_deep_mind(_deep_mind_log)将 Deep-mind 日志器注入链控制器controller此后区块、交易、数据库、资源等环节都会向该日志器发送结构化事件。日志器与 appender 的注册nodeos在 main.cpp 中通过add_deep_mind_logger将deep-mind日志器注册进fc日志框架fc::logging_config add_deep_mind_logger(fc::logging_config config) { config.appenders.push_back( fc::appender_config( deep-mind, dmlog ) ); fc::logger_config dmlc; dmlc.name deep-mind; dmlc.level fc::log_level::debug; dmlc.enabled true; dmlc.appenders.push_back(deep-mind); config.loggers.push_back( dmlc ); return config; }要点appender 类型为dmlogDeep-mind 专用输出器日志器名为deep-mind日志级别固定为debugenabled true当用户没有提供logging.json时main.cppinitialize_logging会使用默认配置并注入该 Deep-mind 日志器若提供了logging.jsonDeep-mind 的日志配置则交由配置文件中对应的 logger/appender 控制日志配置热重载由logging_conf_handler支持见 main.cpp。DMLOG 日志行详解你在控制台会看到什么下面是启用--deep-mind后在nodeos输出控制台中实际可见的DMLOG日志行示例来自 Deep-mind Logger 集成文档DMLOG START_BLOCK 30515 DMLOG TRX_OP CREATE onblock 308f77bf49ab4ddde74d37c7310c0742e253319d9da57ebe51eb7b35f1ffe174 {expiration:2020-11-12T10:13:06,ref_block_num:30514,...} DMLOG CREATION_OP ROOT 0 DMLOG RLIMIT_OP ACCOUNT_USAGE UPD {owner:eosio,net_usage:{last_ordinal:1316982371,value_ex:0,consumed:0},cpu_usage:{last_ordinal:1316982371,value_ex:24855,consumed:101},ram_usage:27083} DMLOG APPLIED_TRANSACTION 30515 {id:308f77bf49ab4ddde74d37c7310c0742e253319d9da57ebe51eb7b35f1ffe174,block_num:30515,block_time:2020-11-12T10:13:05.500,...} DMLOG RLIMIT_OP STATE UPD {average_block_net_usage:{last_ordinal:30514,value_ex:0,consumed:0},average_block_cpu_usage:{last_ordinal:30514,...} DMLOG ACCEPTED_BLOCK 30516 {block_num:30516,dpos_proposed_irreversible_blocknum:30516,dpos_irreversible_blocknum:30515,... ... DMLOG FEATURE_OP ACTIVATE 0ec7e080177b2c02b278d5088611686b49d739925a92d9bfcacd7fc6b74053bd {feature_digest:0ec7e080177b2c02b278d5088611686b49d739925a92d9bfcacd7fc6b74053bd,subjective_restrictions:{enabled:true,preactivation_required:false,earliest_allowed_activation_time:1970-01-01T00:00:00.000},description_digest:64fe7df32e9b86be2b296b3f81dfd527f84e82b98e363bc97e40bc7a83733310,dependencies:[],protocol_feature_type:builtin,specification: [{name:builtin_feature_codename,value:PREACTIVATE_FEATURE}]} ... DMLOG FEATURE_OP ACTIVATE 825ee6288fb1373eab1b5187ec2f04f6eacb39cb3a97f356a07c91622dd61d16 {feature_digest:825ee6288fb1373eab1b5187ec2f04f6eacb39cb3a97f356a07c91622dd61d16,subjective_restrictions:{enabled:true,preactivation_required:true,earliest_allowed_activation_time:1970-01-01T00:00:00.000},description_digest:14cfb3252a5fa3ae4c764929e0bbc467528990c9cc46aefcc7f16367f28b6278,dependencies:[],protocol_feature_type:builtin,specification: [{name:builtin_feature_codename,value:KV_DATABASE}]} ... DMLOG FEATURE_OP ACTIVATE c3a6138c5061cf291310887c0b5c71fcaffeab90d5deb50d3b9e687cead45071 {feature_digest:c3a6138c5061cf291310887c0b5c71fcaffeab90d5deb50d3b9e687cead45071,subjective_restrictions:{enabled:true,preactivation_required:true,earliest_allowed_activation_time:1970-01-01T00:00:00.000},description_digest:69b064c5178e2738e144ed6caa9349a3995370d78db29e494b3126ebd9111966,dependencies:[],protocol_feature_type:builtin,specification: [{name:builtin_feature_codename,value:ACTION_RETURN_VALUE}]}各事件类型语义结合文档示例与仓库源码可以归纳出以下核心事件类型DMLOG后第一个字段为事件类型事件类型语义示例/来源START_BLOCK开始处理/生产一个区块后跟区块号如30515出块循环入口TRX_OP交易生命周期操作如CREATE onblock后跟交易 id 与交易 JSON交易创建/恢复阶段CREATION_OP作用域/对象创建操作如ROOT 0标识根对象及其 id数据库会话初始化RLIMIT_OP资源限制状态变化ACCOUNT_USAGE UPD账户资源用量更新含 net/cpu 用量 ordinal、value_ex、consumed与ram_usage字节数、STATE UPD全局资源状态更新如平均区块 net/cpu 用量见下文源码位置APPLIED_TRANSACTION一笔交易已被完整执行应用后跟区块号与交易 trace JSON含id、block_num、block_time等chain_plugin.cppACCEPTED_BLOCK一个区块被接受后跟区块号与区块状态 JSON含dpos_proposed_irreversible_blocknum、dpos_irreversible_blocknum等chain_plugin.cppFEATURE_OP协议特性protocol feature操作如ACTIVATE激活后跟特性摘要feature_digest、主观限制subjective_restrictions、依赖dependencies、特性类型protocol_feature_type与规格说明protocol_feature_manager相关值得注意的细节FEATURE_OP ACTIVATE是理解协议演进的入口。示例中三条ACTIVATE分别对应PREACTIVATE_FEATUREpreactivation_required: false、KV_DATABASEpreactivation_required: true与ACTION_RETURN_VALUEpreactivation_required: true三个内建协议特性完整记录了每个特性激活时的摘要与约束条件。这为外部系统还原网络在何时启用了哪些协议特性提供了精确依据。RLIMIT_OP是资源计量审计的数据源。ACCOUNT_USAGE UPD给出了eosio账户在某个时间点的net_usagelast_ordinal、value_ex、consumed、cpu_usage与ram_usage字节数下游可据此重建资源使用历史。事件主体部分是 JSON 对象可能跨行输出其后紧跟的十六进制字符串如交易 id或 JSON 字段可作为关联键。源码视角DMLOG 事件从哪些环节产生Deep-mind 日志并非由单一模块集中生成而是分散在链执行管线的多个关键节点。除上面已展示的 chain_plugin.cppACCEPTED_BLOCK、APPLIED_TRANSACTION分别挂在accepted_block与applied_transaction信号上将整个区块/交易 trace 序列化并输出之外链库内部同样大量埋点数据库操作事件TBL_OP/DB_OP在 db_context.cpp 中表创建/删除输出TBL_OP INS/REM行记录插入/更新/删除输出DB_OP INS/UPD/REM字段依次为动作 idaction_id、付费账户payer、表所属合约code、作用域scope、表名、主键primkey以及以十六进制表示的记录数据ndata/odata。例如插入一行DMLOG DB_OP INS ${action_id} ${payer} ${table_code} ${scope} ${table_name} ${primkey} ${ndata}授权操作事件AUTH_OPauthorization_manager.cpp 在授权检查与权限更新路径上如check_authorization、update_permission等会写入 Deep-mind 日志记录权限变更与授权判定细节。资源限制事件RLIMIT_OPlibraries/chain/resource_limits.cpp是文档示例中RLIMIT_OP ACCOUNT_USAGE/STATE UPD的实现载体负责在资源账户用量与全局资源状态更新时输出对应 JSON。合约调用上下文apply_context.cpp 内含大量if (auto dm_logger control.get_deep_mind_logger())守卫式埋点如动作执行、inline action、上下文变更等环节仅在 Deep-mind 启用时才会进入日志分支从而在默认情况下保持零开销。KV 数据库rocksdb路径libraries/chain/backing_store/kv_context.cpp、db_context_rocksdb.cpp与db_key_value_any_lookup.cpp等文件同样包含 Deep-mind 埋点覆盖 KV 表操作事件KV_OP类配合KV_DATABASE协议特性使用。这种守卫式埋点 集中式 appender的设计带来两个工程优势默认零成本get_deep_mind_logger()未启用时返回空指针日志分支被短路不影响正常节点性能输出可审计所有 Deep-mind 事件最终统一经deep-mindloggerdmlogappender输出格式一致、可被下游工具流式消费。性能考虑与使用建议第三方日志与追踪集成总览 明确提示一切皆有代价。遥测工具一旦激活必然会对nodeos性能造成一定影响影响程度取决于多种因素区块吞吐、交易密度、数据库变更量、输出落盘/管道消费速度等但无论何种情况性能都会被拖累。因此官方建议按需开启仅在你确实需要 Deep-mind 提供的额外详细信息例如搭建区块链数据索引服务、调试协议特性激活、进行链状态审计时启用--deep-mind用后即关完成数据采集后立刻移除该标志并重启nodeos让节点回归无埋点的正常运行模式配套治理输出由于 Deep-mind 输出量巨大建议将nodeos的 stdout 重定向到专门的文件或管道供下游消费避免与控制台人工排障日志混流。总结Deep-mind logger 为 EOSIO 链数据生态提供了一个链上操作全记录的标准输出通道一个--deep-mind标志即可让nodeos输出覆盖区块生产START_BLOCK、交易生命周期TRX_OP、APPLIED_TRANSACTION、资源计量RLIMIT_OP、区块接受ACCEPTED_BLOCK、协议特性激活FEATURE_OP以及表/行级数据库变更TBL_OP、DB_OP等全链路事件。理解其事件格式与源码埋点位置是构建基于 EOSIO 的区块链索引、分析与审计系统的第一步。进一步阅读Deep-mind Logger 官方集成文档本指南的原始出处第三方日志与追踪集成总览Zipkin tracer 集成chain_plugin 插件文档nodeos 原生日志配置赞分享区块链【免费下载链接】eosAn open source smart contract platform项目地址https://gitcode.com/gh_mirrors/eo/eos点击查看免费下载相关推荐EOSIO nodeos 原生日志配置完全指南logging.json、Appender 与 Logger 机制深度解析EOSIO nodeos 原生日志配置完全指南logging.json、Appender 与 Logger 机制深度解析 nodeos 的原生日志体系由 lo区块链EOSIO nodeos 区块日志重放Replay实战指南——从 blocks.log 重建链状态EOSIO nodeos 区块日志重放Replay实战指南——从 blocks.log 重建链状态 导读 本文聚焦 EOSIOeos核心节点程序 nod区块链Deep Image Prior训练日志分析TensorBoard集成方法Deep Image Prior训练日志分析TensorBoard集成方法 在深度学习项目中训练过程的可视化与监控对模型调优至关重要。本文将详细介绍如何为D深度学习计算机视觉图像处理创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考