go语言自定义日志 go 自定义error

Go语言之log(如何将日志写到指定文件里面)对于Go语言的日志来说 , 如何将log写到指定的文件里面,下面是一个例子 。
output:
output:
golang 怎样控制自己实现log的位置log是日志文件可以用记事本 , 直接打开查看内容,具体方法为:
1、Log文件上右键,然后选择【打开方式】--再选择【记事本】,如下图所示 。
2、之后我们就可以查看到Log文件内容了,如下示意图所示 。
有时候时间记事本打开某些Log文件里面全是乱码又或者Log文件太大,比如超过100M,那么使用Windows自带的记事本就无法打开此类Log文件,需要借助一些更为专业的Log文件查看器 。具体步骤如下:
1、首先下载LogViewPro工具 。
2、下载后解压文件,然后直接运行名为“LogViewPro”应用程序文件即可打开软件即可 。
3、接下来我们再从顶部左侧的【文件】菜单选择【打开】 。
4、最后通过浏览,找到电脑中的Log文件,将其打开即可 。
用Go来做以太坊开发⑤事件日志智能合约具有在执行期间“发出”事件的能力 。事件在以太坊中也称为“日志” 。事件的输出存储在日志部分下的事务处理中 。事件已经在以太坊智能合约中被广泛使用,以便在发生相对重要的动作时记录,特别是在代币合约(即ERC-20)中,以指示代币转账已经发生 。这些部分将引导您完成从区块链中读取事件以及订阅事件的过程,以便交易事务被矿工打包入块的时候及时收到通知 。
为了订阅事件日志,我们需要做的第一件事就是拨打启用websocket的以太坊客户端 。幸运的是,Infura支持websockets 。
下一步是创建筛选查询 。在这个例子中,我们将阅读来自我们在之前课程中创建的示例合约中的所有事件 。
我们接收事件的方式是通过Go channel 。让我们从go-ethereum core/types 包创建一个类型为 Log 的channel 。
【go语言自定义日志 go 自定义error】 现在我们所要做的就是通过从客户端调用 SubscribeFilterLogs 来订阅 , 它接收查询选项和输出通道 。这将返回包含unsubscribe和error方法的订阅结构 。
最后,我们要做的就是使用select语句设置一个连续循环来读入新的日志事件或订阅错误 。
我们会在下个章节介绍如何解析日志 。
Commands
Store.sol
event_subscribe.go
智能合约可以可选地释放“事件” , 其作为交易收据的一部分存储日志 。读取这些事件相当简单 。首先我们需要构造一个过滤查询 。我们从go-ethereum包中导入 FilterQuery 结构体并用过滤选项初始化它 。我们告诉它我们想过滤的区块范围并指定从中读取此日志的合约地址 。在示例中,我们将从在 智能合约章节 创建的智能合约中读取特定区块所有日志 。
下一步是调用ethclient的 FilterLogs , 它接收我们的查询并将返回所有的匹配事件日志 。
返回的所有日志将是ABI编码,因此它们本身不会非常易读 。为了解码日志,我们需要导入我们智能合约的ABI 。为此 , 我们导入编译好的智能合约Go包,它将包含名称格式为 ContractABI 的外部属性 。之后,我们使用go-ethereum中的 accounts/abi 包的 abi.JSON 函数返回一个我们可以在Go应用程序中使用的解析过的ABI接口 。
现在我们可以通过日志进行迭代并将它们解码为我么可以使用的类型 。若您回忆起我们的样例合约释放的日志在Solidity中是类型为 bytes32 , 那么Go中的等价物将是 [32]byte。我们可以使用这些类型创建一个匿名结构体,并将指针作为第一个参数传递给解析后的ABI接口的 Unpack 函数,以解码原始的日志数据 。第二个参数是我们尝试解码的事件名称,最后一个参数是编码的日志数据 。
此外,日志结构体包含附加信息,例如,区块摘要,区块号和交易摘要 。
若您的solidity事件包含 indexed 事件类型 , 那么它们将成为 主题 而不是日志的数据属性的一部分 。在solidity中您最多只能有4个主题,但只有3个可索引的事件类型 。第一个主题总是事件的签名 。我们的示例合约不包含可索引的事件,但如果它确实包含,这是如何读取事件主题 。
正如您所见,首个主题只是被哈希过的事件签名 。
这就是阅读和解析日志的全部内容 。要学习如何订阅日志,阅读上个章节 。
命令
Store.sol
event_read.go
首先 , 创建ERC-20智能合约的事件日志的interface文件erc20.sol :
然后在给定abi使用 abigen 创建Go包
现在在我们的Go应用程序中,让我们创建与ERC-20事件日志签名类型相匹配的结构类型:
初始化以太坊客户端
按照ERC-20智能合约地址和所需的块范围创建一个“FilterQuery” 。这个例子我们会用 ZRX代币:
用 FilterLogs 来过滤日志:
接下来我们将解析JSON abi,稍后我们将使用解压缩原始日志数据:
为了按某种日志类型进行过滤,我们需要弄清楚每个事件日志函数签名的keccak256哈希值 。事件日志函数签名哈希始终是 topic [0] ,我们很快就会看到 。以下是使用go-ethereum crypto 包计算keccak256哈希的方法:
现在我们将遍历所有日志并设置switch语句以按事件日志类型进行过滤:
现在要解析 Transfer 事件日志,我们将使用 abi.Unpack 将原始日志数据解析为我们的日志类型结构 。解包不会解析 indexed 事件类型,因为它们存储在 topics 下,所以对于那些我们必须单独解析,如下例所示:
Approval日志也是类似的方法:
最后 , 把所有的步骤放一起:
我们可以把解析的日志与etherscan的数据对比:
Commands
erc20.sol
event_read_erc20.go
solc version used for these examples
要读取 0x Protocol 事件日志 , 我们必须首先将solidity智能合约编译为一个Go包 。
安装solc版本 0.4.11
为例如 Exchange.sol 的事件日志创建0x Protocol交易所智能合约接口:
Create the 0x protocol exchange smart contract interface for event logs asExchange.sol :
接着给定abi , 使用 abigen 来创建Go exchange 包:
Then useabigento create the Goexchangepackage given the abi:
现在在我们的Go应用程序中,让我们创建与0xProtocol事件日志签名类型匹配的结构体类型:
初始化以太坊客户端:
创建一个 FilterQuery ,并为其传递0x Protocol智能合约地址和所需的区块范围:
用 FilterLogs 查询日志:
接下来我们将解析JSON abi,我们后续将使用解压缩原始日志数据:
为了按某种日志类型过滤,我们需要知晓每个事件日志函数签名的keccak256摘要 。正如我们很快所见到的那样 , 事件日志函数签名摘要总是 topic[0] :
现在我们迭代所有的日志并设置一个switch语句来按事件日志类型过滤:
现在要解析 LogFill,我们将使用 abi.Unpack 将原始数据类型解析为我们自定义的日志类型结构体 。Unpack不会解析 indexed 事件类型,因为这些它们存储在 topics 下,所以对于那些我们必须单独解析,如下例所示:
对于 LogCancel 类似:
最后是 LogError :
将它们放在一起并运行我们将看到以下输出:
将解析后的日志输出与etherscan上的内容进行比较:
命令
Exchange.sol
event_read_0xprotocol.go
这些示例使用的solc版本
go语言自定义日志的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于go 自定义error、go语言自定义日志的信息别忘了在本站进行查找喔 。

    推荐阅读