通过参考Testin的SDK实现方式,我们大致可以确定他们背后的实现方式:

首先,通过加载Testin的SDK,然后收集各种七七八八的数据,再通过socket发送数据到云端。

云端我们已经有了,就是http://log.qa.huayu.nd:8088

但是如何从iOS收集数据呢,我们需要自己写SDK,SDK的实现一般是采用framework来打包,但是这里简单为主,我将使用静态库来实现,我这里实现的是libHyLog01.a

要编写这样的库,你需要一台Mac,需要xcode开发环境

使用xcode新建一个静态库项目

新建一个类:

MyClass

然后,开始写探针日志发送代码:

  1. //
  2. // MyClass.m
  3. // HyLog01
  4. //
  5. // Created by 林 志宏 on 15-6-10.
  6. // Copyright 2015年 网龙公司. All rights reserved.
  7. //
  8.  
  9. #import "MyClass.h"
  10. #import <arpa/inet.h>
  11. #import <errno.h>
  12. #import <netdb.h>
  13. #import <netinet/in.h>
  14. #import <stdbool.h>
  15. #import <stdio.h>
  16. #import <stdlib.h>
  17. #import <string.h>
  18. #import <sys/socket.h>
  19. #import <sys/types.h>
  20. #import <unistd.h>
  21.  
  22. static const in_port_t kPortNumber = 11215;
  23.  
  24. @implementation MyClass
  25. -(void) getConn
  26. {
  27.     const char* hostname = "log.qa.huayu.nd";
  28.  
  29.     struct sockaddr_storage* server_addr_ptr;
  30.     struct sockaddr_in* sock_addr_ptr;
  31.     struct sockaddr_storage server_addr;
  32.     struct hostent *host = NULL;
  33.  
  34.     host = gethostbyname2(hostname, AF_INET);
  35.  
  36.     server_addr_ptr = &server_addr;
  37.  
  38.     server_addr.ss_family = host->h_addrtype;
  39.     sock_addr_ptr = (struct sockaddr_in*)server_addr_ptr;
  40.     sock_addr_ptr->sin_len = sizeof(*sock_addr_ptr);
  41.     sock_addr_ptr->sin_port = htons(kPortNumber);
  42.     sock_addr_ptr->sin_addr = *(struct in_addr*)host->h_addr_list[0];
  43.     memset(&sock_addr_ptr->sin_zero, 0, sizeof(sock_addr_ptr->sin_zero));
  44.     int sockfd;
  45.     sockfd = socket(server_addr.ss_family, SOCK_STREAM, 0);
  46.     int err = connect(sockfd, (struct sockaddr *)&server_addr, server_addr.ss_len);
  47.     const char *bytes = "9996:hello, ios\n";
  48.     char buffer[30];
  49.     int i;
  50.     for (i = 0; i < 15; i++) {
  51.         buffer[i] = bytes[i];
  52.     }
  53.     buffer[i] = '\0';
  54.     write(sockfd, buffer, 15);
  55.     close(sockfd);
  56.     NSLog(@"conn: %d %d", err, (int)sizeof(buffer));
  57.     // memset(&sock_addr_ptr-
  58.     NSLog(@"hello");
  59.     NSLog(@"send log to huayu");
  60. }
  61. @end

然后,开始编译

接下来,就是在我们的实际项目中进行引用了

我创建了一个View_Switcher项目来引用我刚刚开发的库

运行:

然后,我们可以看到我们的日志系统服务端收到了数据了:

http://log.qa.huayu.nd:8088/

参考文献:

http://blog.sina.com.cn/s/blog_7b9d64af0101jlym.html

iOS发送探针日志到日志系统的简单实现的更多相关文章

  1. iOS各框架功能简述以及系统层次结构简单分析

    iOS各个框架所对应的功能简单介绍 iOS系统结构层次:

  2. Es+kafka搭建日志存储查询系统(设计)

    现在使用的比较常用的日志分析系统有Splunk和Elk,Splunk功能齐全,处理能力强,但是是商用项目,而且收费高.Elk则是Splunk项目的一个开源实现,Elk是ElasticSearch(Es ...

  3. iOS 中捕获程序崩溃日志

    iOS 中捕获程序崩溃日志 (2014-04-22 17:35:59) 转载▼     iOS开发中遇到程序崩溃是很正常的事情,如何在程序崩溃时捕获到异常信息并通知开发者,是大多数软件都选择的方法.下 ...

  4. 海量日志实时收集系统架构设计与go语言实现

    日志收集系统应该说是到达一定规模的公司的标配了,一个能满足业务需求.运维成本低.稳定的日志收集系统对于运维的同学和日志使用方的同学都是非常nice的.然而这时理想中的日志收集系统,现实往往不是这样的. ...

  5. 企业日志大数据分析系统ELK+KAFKA实现【转】

    背景: 最近线上上了ELK,但是只用了一台Redis在中间作为消息队列,以减轻前端es集群的压力,Redis的集群解决方案暂时没有接触过,并且Redis作为消息队列并不是它的强项:所以最近将Redis ...

  6. 用ELK搭建简单的日志收集分析系统【转】

    缘起 在微服务开发过程中,一般都会利用多台服务器做分布式部署,如何能够把分散在各个服务器中的日志归集起来做分析处理,是一个微服务服务需要考虑的一个因素. 搭建一个日志系统 搭建一个日志系统需要考虑一下 ...

  7. Linux下日志文件监控系统Logwatch的使用记录

    Linux下日志文件监控系统Logwatch的使用记录 原文:http://www.cnblogs.com/kevingrace/p/6519504.html 在维护Linux服务器时,经常需要查看系 ...

  8. centos7安装Logwatch配合msmtp邮件客户端发送服务器监控分析日志

    ########################### #DATE 2016-07-29                         # #Authur by Denilas Yeung     ...

  9. Kubernetes-20:日志聚合分析系统—Loki的搭建与使用

    日志聚合分析系统--Loki 什么是Loki? Loki 是 Grafana Labs 团队最新的开源项目,是一个水平可扩展,高可用性,多租户的日志聚合系统.它的设计非常经济高效且易于操作,因为它不会 ...

  10. Cisco配置发送日志到日志服务器

    Cisco配置发送日志到日志服务器logging 172.16.6.22logging onlogging trap 7  //指定日志消息的级别 (0:紧急(Emergencies) 1:告警(Al ...

随机推荐

  1. 数学建模 Excel的批量写入与批量导出

    数学建模中编程手们常常会被要求将大量的数据进行批量的预测操作,并写入某个文件中 Excel的批量导出数据,用循环就可以简单实现,例如 import pandas as pd for i in list ...

  2. Spring Boot 3.1中如何整合Spring Security和Keycloak

    在今年2月14日的时候,Keycloak 团队宣布他们正在弃用大多数 Keycloak 适配器.其中包括Spring Security和Spring Boot的适配器,这意味着今后Keycloak团队 ...

  3. 【C#/.NET】record介绍

    ​  目录 什么是record? 使用record record解构 record原理 结论 什么是record? record是.NET 5中的一种新特性,可以看作是一种概念上不可变的类.recor ...

  4. @Repeatable元注解的使用

    @Repeatable注解表明标记的注解可以多次应用于相同的声明或类型,此注解由Java SE 8版本引入.以下示例如何使用此注解: 第一步,先声明一个重复注解类: package org.sprin ...

  5. 如何通过数据warehouse更好地支持企业数字化转型战略

    目录 1. 引言 2. 技术原理及概念 3. 实现步骤与流程 4. 应用示例与代码实现讲解 5. 优化与改进 <如何通过数据 warehouse 更好地支持企业数字化转型战略> 随着企业数 ...

  6. 行行AI人才直播第3期:浙江大学周鑫博士《空中机器人复杂环境高效自主导航—从单机到集群》

    行行AI人才是博客园和顺顺智慧共同运营的AI行业人才全生命周期服务平台. 空中飞行的无人车.无人机集群是科幻电影的常客,也往往是未来科技的一大代表.在电影<星球大战:西斯的复仇>(2005 ...

  7. Java 基础复习——StringBuffer 和 StringBuilder

    StringBuffer 和 StringBuilder StringBuffer 类 简介 java.lang.StringBuffer 代表可变的字符序列,可以对字符串内容进行增删 很多方法和 S ...

  8. 从头学Java17-Lambda表达式

    Lambda表达式 这一系列教程,旨在介绍 lambda 的概念,同时逐步教授如何在实践中使用它们. 回顾表达式.语句 表达式 表达式由变量.运算符和方法调用组成,其计算结果为单个值.您已经看到了表达 ...

  9. Visual Studio C# 多环境配置 Web.config

    目录 添加解决方案配置 添加配置转换 添加应对的配置 Visual Studio 为多环境配置 Web.config 不同的环境,存在不同的配置,如:数据库连接字符串,通过多配置,方便做环境切换,配置 ...

  10. 5.2 基于ROP漏洞挖掘与利用

    通常情况下栈溢出可能造成的后果有两种,一类是本地提权另一类则是远程执行任意命令,通常C/C++并没有提供智能化检查用户输入是否合法的功能,同时程序编写人员在编写代码时也很难始终检查栈是否会发生溢出,这 ...