Erlang/OTP中的日志与事件处理(二)

用gen_event编写自定义事件处理器

可能你并不喜欢错误日志记录器的默认输出格式。它与所有其他系统所使用的格式确实有较大的差异。你所在的企业可能已经围绕自己的日志格式开发了大量工具,这些工具无法与Erlang的日志格式兼容。这时你该怎么办呢?还好,错误日志记录器允许你在日志系统中穿插自定义的逻辑并输出自定义的错误信息。

1.gen_event行为模式简介

日志功能是构筑在Erlang的事件处理框架之上的,而该框架又以gen_event行为模式为基础。该行为模式为事件处理器封装了简单易用的接口。要想进一步调整Erlang/OTP的日志框架,就得编写新的gen_event行为模式的实现模块,好在这个任务并不难。gen_event行为模式接口gen_server的类似:其中包含你所熟悉的init、code_change和terminate回调函数,也包含handle_call和handle_info回调。不过gen_event接口用handle_event/2取代了handle_cast/2,你大概猜到了,这儿正是你接收错误日志事件的地方。
gen_event和gen_server之间的一个重要区别在于当你启动新的gen_server容器时,你需要告诉它应该使用哪个回调模块(这样也就可以了);但在启动gen_event容器(有时也被称作事件管理器)时,起初是无须任何回调模块的。相反,在容器完成初始化之后,可以动态添加(或删除)一个或多个处理器。当事件被投递至事件管理器时,事件管理器会调用当前已注册的所有处理器模块来处理事件。二者之间的区别如图所示:

正是由于这种一对多的关系,在实现了gen_event行为模式的回调模块中一般是找不到start_link函数的;即便有,该函数一般也都会先检查容器进程是否已经启动(当然,仅在容器进程是经过注册的单例进程时这么做才有意义)。另外请记住,事件管理器要调用的回调模块可不止这一个,因此,不要对事件管理器进程的状态做出什么异乎寻常的举动,至于其他处理器,只能祈祷它们同样守规矩了。
和gen_server一样,为了便于访问,gen_event进程启动时也可以有一个注册名。接下来,你将向注册名为error_logger的标准系统进程中添加一个处理器,该进程在所有Erlang/OTP系统中都存在。(这正是SASL启动时的工作。)当你调用error_logger模块中的日志函数时,所有日志事件都会被发送给这个进程。error_logger模块中还有一个专用于添加报告处理器的API函数,有了它你就无须关心事件处理器进程的定位问题了﹔该函数知道应该把处理器添加至哪个进程,并会连同该进程的注册名一起将调用委托给gen_event :add_handler/3。

2.事件处理器示例

你即将开发的简单日志事件处理器的骨架参见代码custom_error_report.erl。这只是错误日志记录器gen_event行为模式的一个最简单的实现。接收事件后它只会说:“OK,继续吧。”别的就什么也不会了。

-module(custom_error_report).
-behaviour(gen_event).
-export([register_with_logger/0]).
-export([init/1, handle_event/2, handle_call/2,handle_info/2, terminate/2, code_change/3]).
-record(state, {}).
register_with_logger() ->error_logger:add_report_handler(?MODULE).
init([])->{ok, #state{}}.
handle_event(_Event, State) ->{ok, State}.
handle_call(_Request, State) ->Reply = ok,{ok, Reply, State}.
handle_info(_Info, State) ->{ok, State}.
terminate(_Reason, _State) ->ok.
code_change(_OldVsn, State, _Extra) ->{ok, State}.
现在你只需重新编译模块并调用模块中的API函数custom_error_report:register_with_logger()将它挂载到错误日志记录器的事件流中即可。

3.处理错误事件

 接收到事件后就要进行处理。在当前这个例子中,我们仅需要将它们输出到屏幕。要恰当地展现这些事件,就必须了解它们的确切含义。error_logger中的函数会产生一组特定的事件。Erlang/OTP文档对此作了总结。

调用汇报函数时,如果没有指定类型,事件将被赋予默认的报告类型。其中由error_rep-ort、warning_report和info_report标记的事件,默认类型分别为std_error、std_warn-ing和std_info。除了这3个类型之外,任意类型标识符都可用于用户自定义的报告类型。Gleader(进程组主管)字段暂且可以忽略,该字段用于指定标准输出的目的地。
 

这段代码的作用仅仅是将数据以略为不同的格式直接打印至标准输出,但通过它你应该能明白该如何编写自定义插件。请注意,有时你会收到一些无法与上述格式列表相匹配的事件,它们一般都是些可以忽略的系统消息,但你仍然需要在最后加上一个通配子句来处理这些事件,说上一句“OK”就够了。

至此,我们已经完成了对Erlang日志基础功能中最重要的内容的介绍。
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/631098.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端面试题-html5新增特性有哪些

HTML html5新增特性有哪些 1.新增了语义化标签 标签用法header定义文档或区块的页眉,通常包含标题,导航和其他有关信息nav定义导航链接的容器,用于包裹网站的导航部分section定义文档的一个独立节或区块,用于组织相关的内容art…

51单片机_智能家居终端

实物演示效果: https://www.bilibili.com/video/BV1bh4y1A7ZW/?vd_source6ff7cd03af95cd504b60511ef9373a1d 51单片机是否适合做多功能智能家居控制系统?51单片机的芯片是否具有与WiFi通信的能力?如果有的话,具体有哪些芯片啊&a…

银河麒麟操作系统 v10 中离线安装 Docker

银河麒麟操作系统 v10 中离线安装 Docker 1. 查看系统版本2. 查看 Linux 内核版本(3.10以上)3. 查看 iptabls 版本(1.4以上)4. 判断处理器架构5. 离线下载 Docker 安装包6. 移动解压出来的二进制文件到 /usr/bin 目录中7. 配置 Do…

Python ❀ 使用代码实现API接口调用详解

文章目录 1. 工具准备1.1. requests代码包1.2. BurpSuite抓包工具 2. 操作过程2.1. 一个简单的请求2.1.1. Burp获取响应2.1.2. 转发获取响应 2.2. 构造GET类型URL参数2.3. 构造请求头部2.4. 构造POST类型payload数据 本文主要讲解常用API接口如何使用python实现。 API&#xff…

JMeter请求参数Parameters,带中文或特殊字符(+/=)时,例如登录密码或者token等,需要勾选编码

以前的登录接口密码参数不包含特殊字符,为了安全,产品今天修改了需求,密码必须由数字,字母和特殊字符构成,之前利用JMeter接口编写的脚本报错了,调整了一下,里面踩了一点坑,记录下来…

mysql数据迁移报错Specified key was too long; max key length is 767 bytes

目录 场景: 说明: 疑问: 解决: 验证: 场景: 线上项目支持的过程中遇到mysql库表结构和数据由A库迁移到B库上提示Specified key was too long; max key length is 767 bytes报错,第一次遇到特此…

SSM(Spring,SpringMVC,MyBatis)整合项目

文章目录 SSM(Spring,SpringMVC,MyBatis)整合项目1.创建表2.创建工程3.pom.xml4.log4j.properties5.db.properties6.applicationContext-dao.xml7.applicationContext-tx.xml8.applicationContext-service.xml9.springmvc.xml10.web.xml11.pojo12.mapper13.service14.controlle…

维权控价的步骤有哪些

做维权控价不难,但要把控价工作做好,对品牌或者第三方来说,都是一项考验,在做这项工作前,要有明确的计划和流程,再开始做,一定能够事半功倍,当控价朝着越来越好的方向发展时&#xf…

最全对象存储(云盘)挂载本地主机或服务器

1.对象存储介绍 1.1 分类 分布式存储的应用场景相对于其存储接口,现在流行分为三种: 块存储: 这种接口通常以QEMU Driver或者Kernel Module的方式存在,这种接口需要实现Linux的Block Device的接口或者QEMU提供的Block Driver接口,块存储一般…

Three.js Tri-panner (三面贴图) 材质 两种实现方式

文章目录 介绍自定义shaderNodeMaterial修复:骨骼材质特殊处理修复:使用法相贴图时整体变色 介绍 Tri-panner 在babylonjs中有支持 但是three.js目前的基础材质并不支持 需要自己定义shader 或者使用目前还没有什么完善的文档的 NodeMaterial 下面展示两…

智能安全帽定制_基于联发科MT6762平台的智能安全帽方案

智能安全帽是一种具备多项功能的高科技产品,其功能集成了视频通话监控、高清图像采集、无线数据传输、语音广播对讲、定位轨迹回放、静默报警、危险救援报警、脱帽报警、碰撞报警、近电报警以及智能调度系统等,同时还支持多功能模块的自由添加&#xff0…

【LeetCode】206. 反转链表

leetcode链接 206. 反转链表 #include <stdio.h>struct ListNode {int val;struct ListNode* next; }; typedef struct ListNode ListNode;struct ListNode* reverseList1(struct ListNode* head) {if (head ! NULL) {ListNode* n1 NULL;ListNode* n2 head;ListNode*…

day4:多点通信与域套接字

思维导图 使用tftp实现简单文件的上传 #include <head.h> #define SER_PORT 69 #define SER_IP "192.168.125.223" int link_file() {int sfdsocket(AF_INET,SOCK_DGRAM,0);if(sfd-1){perror("socket error");return -1;}return sfd; } int filedow…

什么是小程序?特点和技术架构详解

小程序是一种新的移动应用程序格式&#xff0c;一种结合了 Web 技术以及客户端技术的混合解决方案。 传统的原生应用运行起来比较流畅&#xff0c;但是也有天然的基因缺陷&#xff1a; 不支持动态化&#xff0c;发布周期长需要开发Android和iOS两套代码&#xff0c;开发成本高…

本地电脑远程控制工控现场一台丰炜PLC上,实现读写与监控PLC程序

准备工作 一台可联网操作的电脑一台单网口的远程透传网关及博达远程透传配置工具网线一条&#xff0c;用于实现网络连接和连接PLC一台丰炜 PLC及其编程软件一张4G卡或WIFI天线实现通讯(使用4G联网则插入4G SIM卡&#xff0c;WIFI联网则将WIFI天线插入USB口&#xff09; 第一步…

【C语言基础考研向】05 scanf读取标准输入超详解

文章目录 一.scanf函数的原理 样例问题原因解决方法 二.多种数据类型混合输入 错误样例正确样例 一.scanf函数的原理 C语言未提供输入/输出关键字&#xff0c;其输入和输出是通过标准函数库来实现的。C语言通过scanf函数读取键盘输入&#xff0c;键盘输入又被称为标准输入。…

khbc靶场小记(upload 666靶场)

尝试上传正常的png jpg gif php的格式的文件发现老是提示烦人的消息&#xff08;上传不成功&#xff09;&#xff1b; 通过抓包对MIME进行爆破没爆出来&#xff0c;当时可能用成小字典了&#xff1b; 猜测可能是把后缀名和MIME绑定检测了&#xff1b; 反正也没思路&#xff0c;…

Linux shell美化 zsh+oh-my-zsh+power10k

文章目录 安装zsh安装on-my-zsh安装power10k主题安装power10k将oh-my-zsh主题改为power10k字体 设置安装字体配置字体 power10k配置相关插件安装zsh-autosuggestionszsh-syntax-highlighting安装插件完成&#xff0c;重新加载配置文件 美化效果示意&#xff1a; 安装zsh 安装…

学生护眼台灯哪种好一点?分享专业的学生护眼台灯

当代孩子的学业依旧繁重&#xff0c;而随着孩子年龄的增长&#xff0c;作业功课也会越来越多&#xff0c;每天用眼的时间也会越来越长。而且现在很多孩子晚上都会学习到很晚&#xff0c;如果光源不合适是很容易导致视力下降的&#xff01; 因此我认为一款好的台灯是每个家庭必备…

Peter算法小课堂—并查集

我们先来看太戈编程467题 攀亲戚 题目描述&#xff1a; 最近你发现自己和古代一个皇帝长得很像&#xff1a;都有两个鼻子一个眼睛&#xff0c;你想知道这皇帝是不是你的远方亲戚&#xff0c;你是不是皇亲国戚。目前你能掌握的信息有m条&#xff0c;关于n个人&#xff1a;第i条…