日志是应用的镜子,可以发现应用中的问题,重要性不言而喻。

以往设备有问题了,是如何诊断的?我们是现场人员到现场,又是配合抓包,又是配合提供机器日志,效率极其低下。

如今都物联网时代了,能让数据跑路的还让人去跑路,不合适吧。

日志应能实现手工触发上送,或应用中出现严重问题时主动上送,或者远程控制其是否上送。

试想,如果能让问题出现在被客户发现之前,提前被开发人员获知,主动的解决问题,那么无疑提高了产品的竞争力和口碑。为杜绝问题造成的严重性而未及时发现提供先机。

当某天发现一机器偶然吐出一异常的bug日志时,且这日志暴露的问题若不解决将造成严重后果,而你恰好在你的邮箱里看到,这就在不知不觉中主动发现了问题。不用运维人员去找你,客户去找你,机器向你求救了。那么,救救它吧。

以下为在嵌入式linux上实现的一小功能,对终端产生的日志文件进行zip压缩并上送到后台FTP服务器中。

几行代码,轻松实现。又一次体现使用 go开发嵌入式linux应用的强大之处。

若要用c去做,那么呵呵,可以试试。

package mainimport ("archive/zip""flag""fmt""io""log""os""strings""github.com/dutchcoders/goftp""github.com/larspensjo/config"
)var (ftp     *goftp.FTPconFile        = flag.String("ftpcfg", "/ftpcfg.ini", "config file")Server  string = "127.0.0.1:21"User    string = ""Pwd     string = ""
)func checkErr(err error) {if err != nil {fmt.Fprintf(os.Stderr, "Fatal error: %s", err.Error())}
}/**
@files:需要压缩的文件
@compreFile:压缩之后的文件
*/
func CompressZip(files []*os.File, zipfileName string) (err error) {zipfile, err := os.Create(zipfileName)if err != nil {return err}defer zipfile.Close()zw := zip.NewWriter(zipfile)defer zw.Close()for _, file := range files {err := compressZip(file, zw)if err != nil {return err}file.Close()}return nil
}/**
功能:压缩文件
@file:压缩文件
@prefix:压缩文件内部的路径
@tw:写入压缩文件的流
*/
func compressZip(file *os.File, zw *zip.Writer) error {info, err := file.Stat()if err != nil {log.Println("压缩文件失败:", err.Error())return err}log.Println("filesize:", info.Size()/1024, "kb")// 获取压缩头信息head, err := zip.FileInfoHeader(info)if err != nil {log.Println("压缩文件失败:", err.Error())return err}// 指定文件压缩方式 默认为 Store 方式 该方式不压缩文件 只是转换为zip保存head.Method = zip.Deflatefw, err := zw.CreateHeader(head)if err != nil {log.Println("压缩文件失败:", err.Error())return err}// 写入文件到压缩包中_, err = io.Copy(fw, file)file.Close()if err != nil {log.Println("压缩文件失败:", err.Error())return err}return nil
}func main() {log.Println("Hello Go")defer func() {if r := recover(); r != nil {log.Printf("crash occurred!capture:%s\n", r)}}()var fname stringflag.StringVar(&fname, "fname", "", "file name")flag.Parse()flag.Usage()//获取当前路径file, _ := os.Getwd()cfg, err := config.ReadDefault(file + *conFile)checkErr(err)//获取配置文件中的配置项Server, err = cfg.String("SERVERCONFIG", "Server")User, err = cfg.String("USER", "User")Pwd, err = cfg.String("USER", "Pwd")//压缩ZIPvar filezips []*os.Filevar filezip *os.Fileif filezip, err = os.Open(fname); err != nil {panic(err)}filezips = append(filezips, filezip)log.Println("begin compressZip...")err = CompressZip(filezips, fname+".zip")if err != nil {panic(err)}log.Println("compressZip ok!,name=" + fname + ".zip")log.Println("User:" + User)log.Println("->begin connect server:" + Server)// For debug messages: goftp.ConnectDbg("ftp.server.com:21")if ftp, err = goftp.ConnectDbg(Server); err != nil {panic(err)}//ftp.debug = truedefer ftp.Close()log.Println("->Successfully connected !!")// Username / password authenticationif err = ftp.Login(User, Pwd); err != nil {panic(err)}log.Println("->Login success!")if err = ftp.Cwd("/"); err != nil {panic(err)}var curpath stringif curpath, err = ftp.Pwd(); err != nil {panic(err)}log.Printf("Current path: %s\n", curpath)// Upload a filevar fileup *os.Fileif fileup, err = os.Open(fname + ".zip"); err != nil {panic(err)}log.Println("->begin upload file...")info, err := fileup.Stat()if err != nil {panic(err)}log.Println("upload filesize:", info.Size()/1024, "kb")fpath := fname + ".zip"lastidx := strings.LastIndex(fname+".zip", "/")if lastidx != -1 {fpath = fname[lastidx:] + ".zip"}log.Printf("fpath:%s\n", fpath)if err := ftp.Stor(fpath, fileup); err != nil {panic(err)}log.Println("->upload file over!")err = os.Remove(fname + ".zip") //上传成功,删除zip文件if err != nil {log.Println("file remove Error!")panic(err)}}

编译与使用:

GOOS=linux GOARCH=arm GOARM=7 go build ftp.go
ftp -fname=/log/log_b503_20190730.log

root@b_lcd:/app/opt
./ftp -fname=/log/log_b503_20190730.log

Hello Go
Usage of ./ftp:
  -fname string
        file name
  -ftpcfg string
        config file (default "/ftpcfg.ini")
User:qq8864
->begin connect server:015.3vftp.com:21
2019/07/30 17:44:08 begin receiveLine...
2019/07/30 17:44:09 < 220 Serv-U FTP Server v6.4 for WinSock ready...
2019/07/30 17:44:09 receiveLine over!
2019/07/30 17:44:09 220 Serv-U FTP Server v6.4 for WinSock ready...
->Successfully connected !!
2019/07/30 17:44:09 > USER qq8864
2019/07/30 17:44:09 begin receiveLine...
2019/07/30 17:44:09 < 331 User name okay, need password.
2019/07/30 17:44:09 receiveLine over!
2019/07/30 17:44:09 > PASS sars1212
2019/07/30 17:44:09 begin receiveLine...
2019/07/30 17:44:09 < 230 User logged in, proceed.
2019/07/30 17:44:09 receiveLine over!
->Login success!
2019/07/30 17:44:09 > CWD /
2019/07/30 17:44:09 begin receiveLine...
2019/07/30 17:44:09 < 250 Directory changed to /
2019/07/30 17:44:09 receiveLine over!
2019/07/30 17:44:09 > PWD
2019/07/30 17:44:09 begin receiveLine...
2019/07/30 17:44:09 < 257 "/" is current directory.
2019/07/30 17:44:09 receiveLine over!
Current path: /
->begin upload file...
fpath:/log_b503_20190730.log
2019/07/30 17:44:09 > TYPE I
2019/07/30 17:44:09 begin receiveLine...
2019/07/30 17:44:11 < 200 Type set to I.
2019/07/30 17:44:11 receiveLine over!
2019/07/30 17:44:11 > PASV
2019/07/30 17:44:11 begin receiveLine...
2019/07/30 17:44:11 < 227 Entering Passive Mode (52,128,243,181,6,1)
2019/07/30 17:44:11 receiveLine over!
2019/07/30 17:44:11 > STOR /log_b503_20190730.log
2019/07/30 17:44:11 Connecting to 015.3vftp.com:1537
2019/07/30 17:44:11 begin receiveLine...
2019/07/30 17:44:11 < 150 Opening BINARY mode data connection for log_b503_20190730.log.
2019/07/30 17:44:11 receiveLine over!
2019/07/30 17:44:11 a1:150 Opening BINARY mode data connection for log_b503_20190730.log.
2019/07/30 17:44:11 begin receiveLine...
2019/07/30 17:44:13 < 226-Maximum disk quota limited to 102400 kBytes
2019/07/30 17:44:13 receiveLine over!
2019/07/30 17:44:13 begin receiveLine...
2019/07/30 17:44:13 <     Used disk quota 64 kBytes, available 102335 kBytes
2019/07/30 17:44:13 receiveLine over!
2019/07/30 17:44:13 begin receiveLine...
2019/07/30 17:44:13 < 226 Transfer complete.
2019/07/30 17:44:13 receiveLine over!
2019/07/30 17:44:13 a2:226-Maximum disk quota limited to 102400 kBytes
    Used disk quota 64 kBytes, available 102335 kBytes
226 Transfer complete.
->upload file over!

嵌入式linux之go语言开发(六)几行代码实现终端的远程日志诊断相关推荐

  1. 嵌入式 linux 应用 go 语言开发(开篇,缘起)

    go语言被称作互联网时代的c语言,用来开发嵌入式linux是一种享受. 希望能否带来开发工作效率的提升,产品质量稳定性方面的提升,产品功能上的增强. 物联网时代,就是要有所"变革" ...

  2. 嵌入式linux之go语言开发(九)关于嵌入式GUI

    go语言没有官方的GUI. 其实怎么说呢,这一块儿的需求也不怎么迫切.毕竟每个语言都有自己擅长的领域. 在电脑上开发界面还是C#或QT或java的swing来的快.没必要非用go吧,更多的是在电脑上基 ...

  3. 嵌入式linux之go语言开发(三)卡库的封装

    卡库的封装和调用,这是一个重头戏,完成了它,则就完整了所有的封装.至于网络通信,记录存储等,则可以 使用go本身的模块去做.后续做一版完整的go语言版B503应用. 截至目前,非接触式卡库的封装接近尾 ...

  4. 《嵌入式Linux与物联网软件开发——C语言内核深度解析》一第1章 C语言与内存1.1 引言...

    本节书摘来自异步社区<嵌入式Linux与物联网软件开发--C语言内核深度解析>一书中的第1章,第1.1节,作者朱有鹏 , 张先凤,更多章节内容可以访问云栖社区"华章计算机&quo ...

  5. 《嵌入式Linux与物联网软件开发——C语言内核深度解析》一2.4 位运算构建特定二进制数...

    本节书摘来自异步社区<嵌入式Linux与物联网软件开发--C语言内核深度解析>一书中的第2章,第2.4节,作者朱有鹏 , 张先凤,更多章节内容可以访问云栖社区"异步社区" ...

  6. 嵌入式Linux与物联网软件开发:C语言内核深度解析

    嵌入式Linux与物联网软件开发:C语言内核深度解析     1.C语言与内存         1.引言         2.计算机程序运行的目的         3.位.半字.字的概念和内存位宽   ...

  7. 嵌入式 Linux 与物联网软件开发 ——C 语言内核深度解析

    C 语言是嵌入式 Linux 领域的主要开发语言. 对于学习嵌入式.单片机.Linux 驱动开发等技术来说,C 语言是必须要过的一关.C 语言学习的特点是入门容易.深入理解难.精通更是难上加难.很多用 ...

  8. GCC编译器简明教程(Linux下C语言开发环境的搭建)

    GCC编译器简明教程(Linux下C语言开发环境的搭建) 市面上常见的Linux都是发行版本,典型的Linux发行版包含了Linux内核.桌面环境(例如GNOME.KDE.Unity等)和各种常用的必 ...

  9. 关于Linux下C语言开发基础的实验内容。

    Linux下C语言开发基础实验内容 目录 1.Linux下C语言开发流程 2.vi,vim编辑器的使用 3.Gcc编译器的使用 总体选项: 警告选项: 4.GDB 基本命令的使用 5.Make 工程管 ...

最新文章

  1. orm框架有哪些_java技术哪些是必学的?
  2. iOS开发之详解正则表达式
  3. android开发入门与实践_Electron从入门到实践,前端开发者开发桌面App的最佳选择...
  4. Oracle笔记:用户、权限及exp/imp数据
  5. 台式计算机如何升级,台式电脑升级系统的方法
  6. 看KubeEdge携手K8S,如何管理中国高速公路上的10万边缘节点
  7. python 彩票分析_294期钱哥福彩3D预测奖号:杀号分析
  8. 知乎要用AI打造智能社区,专治「答非所问」的瓦力机器人已上线
  9. 5分钟学会五笔 (不用背口诀)
  10. rfid考勤系统mysql_RFID智能考勤管理系统
  11. 硬件工程师入门-基础元器件笔记-1-电阻器
  12. 角色和武器Shader特效开发
  13. 【高数】交换二次积分次序时,为什么要观察上下限大小关系?
  14. 基于mochiweb的chatty聊天室1
  15. chrome插件,常用插件,必备插件,黑科技
  16. Python 通过微信控制实现app定位发送到个人服务器再转发微信服务器接收位置信息
  17. vue中loading chunk-xxx.css failed和net::ERR_ABORTED 404 解决方法
  18. 前馈神经网络【BP神经网络】【newff函数】
  19. 史上最全C++排序算法总结!!!(没有之一)
  20. 你见过最心酸的事是什么?

热门文章

  1. 三菱Q系列plc,11轴标准程序,包含轴回零,相对定位,绝对定位,程序有两轴直线插补
  2. 手游游戏支付接口如何申请,西米支付告诉你。
  3. RecyclerView拖拽卡顿
  4. 建安市option3X“JAB1-JAB3”与“JAC1-JAC3”联合通信
  5. Redisson分布式锁简单应用
  6. 使用jvisualvm工具排查springboot工程内存溢出
  7. 服务器推送消息方法总结及实现(java)
  8. 卡西欧手表接收时间 prw 3100t 7
  9. linux使用nmcli连接无线网络
  10. 扫描程序设计说明文档