日志采集的流程

客户端埋点

客户端埋点就是在客户系统植入日志发送的代码,可以是前端页面、app界面、后端服务等,把需要的日志信息发送到指定的日志采集接口。
日志的发送应该采用异步方式,这样不会对客户系统代码的执行造成影响。

日志采集

日志采集接口把接收过来的日志数据写入到日志文件,日志文件以天为单位进行存储。

日志采集接口代码

接口采用@IgnoreToken标记不需要进行令牌校验。
采用@CrossOrigin标记,让接口能够跨域访问,支持AJAX跨域请求。

    @ApiOperation(value = "提交日志")@ApiImplicitParams({@ApiImplicitParam(name = "logData", value = "日志数据", dataType = "LogData", paramType = "body")})@RequestMapping(path = "/log/add", method = RequestMethod.POST, produces = "application/json;charset=UTF-8")@IgnoreToken@CrossOriginpublic ResponseData addLog(@RequestBody LogData logData) {String logID = logService.logToFile(logData);return ResponseData.success(logID);}

日志文件格式的设计

日志以文本格式保存,每条日志按行写入。
日志行的格式如下:

时间戳|日志ID|日志数据JSON


日志按行保存的好处是,可以利用BufferedReader的readLine方法进行日志的按行读取。
日志按行保存,要对日志数据JSON部分进行处理,把换行符替换掉。

日志按行保存的主要代码

    public String logToFile(LogData logData){LogGroupData groupData = getLogGroup(logData.getKey());logData.setGroupID(groupData.getGroupID());String date = ConvertUtil.formatDate(new Date(), "yyyyMMdd");String path = PathUtil.combine(logFolder, "LOG" + date + ".log");String uuid = UUID.randomUUID().toString();String json = JSON.toJSONString(logData);StringBuilder sb = new StringBuilder();sb.append("[" + ConvertUtil.formatDate(new Date()) + "]|");sb.append(uuid + "|");for (int i = 0; i < json.length(); i++) {char c = json.charAt(i);if (c == '\r' || c == '\n')//换行符替换为空格sb.append(" ");elsesb.append(c);}FileUtil.appendLine(path, sb.toString());return uuid;}

日志写入文件的主要代码

利用RandomAccessFile类写入,用文件琐控制并发。如果是海量日志的场合,可以部署多几个采集点。

    public static void appendLine(String path, String line) {RandomAccessFile fout = null;FileChannel channel = null;try {File file = new File(path);if (!file.getParentFile().exists()) {file.getParentFile().mkdirs();}byte[] bytes = line.getBytes("utf-8");fout = new RandomAccessFile(file, "rw");long filelength = fout.length();//获取文件的长度fout.seek(filelength);//将文件的读写指针定位到文件的末尾channel = fout.getChannel();//打开文件通道FileLock fileLock = null;while (true) {try {fileLock = channel.tryLock();//不断的请求锁,如果请求不到,等一秒再请求break;} catch (Exception e) {logger.error("[FileUtil.appendLine]请求琐失败。");Thread.sleep(1000);}}fout.write(bytes);fout.writeChar('\n');fileLock.release();channel.close();fout.close();} catch (Exception e1) {logger.error(e1.getMessage(), e1);} finally {IOUtil.close(channel);IOUtil.close(fout);}}

日志汇总

通过定时任务,把各个采集点的日志文本导入数据库/大数据存储。

syslog日志系统——日志采集相关推荐

  1. potainer 日志_日志系统落地:制定日志规范

    我们的系统,已经接入阿里云的日志服务很长一段时间了,存了数以TB级别的日志,突然有一天,领导说,我们需要所有订单的ip信息用于审计订单的真实性,突然发现日志系统无法一次性查找到我所有需要的信息,让我很 ...

  2. 使用XLog、Spring-Boot、And-Design-Pro搭建日志系统

    一.前言:移动端为什么要三方日志系统 日志系统用于记录用户行为和数据以及崩溃时的线程调用栈,以帮助程序员解决问题,优化用户体验. iOS系统就有自带Crash收集应用程序"ReportCra ...

  3. 创业公司 互联网架构方案 整体技术栈 基础设施 数据库 服务治理 消息中间件 日志系统 ELK 自动化部署

    欢迎关注博主公众号:[矿洞程序员]文章由陈晓阳原创. 本人微信:chenxiaoyangzxy. 免费提供本人大量学习资料. 从零开始搭建创业公司后台技术栈 原创: 潘锦 说到后台技术栈,脑海中是不是 ...

  4. python后台架构Django教程——日志系统

    全栈工程师开发手册 (作者:栾鹏) python教程全解 python日志的相关内容可以先参考:http://blog.csdn.net/luanpeng825485697/article/detai ...

  5. Linux内核学习:EXT4文件JBD日志系统(Journaling Block Device)

    目录 0 Ext4的日志模式 1 日志系统的作用 2 日志系统工作场景 3 JDB日志块设备 3.1 JBD2的数据结构 3.1.1 buffer_head 3.1.2 handle 3.1.3 tr ...

  6. syslog日志系统——框架选型

    syslog日志系统--框架选型 sysog概述 syslog日志系统主要作用是采集有价值的日志信息,然后进行日志的汇总以及数据分析,最后展现分析结果报告为决策提供数据支撑. 本系列文章将逐一讲述sy ...

  7. golang日志服务器_日志系统 | log/syslog (log) – Go 中文开发手册 - Break易站

    Go 中文开发手册 日志系统 | log/syslog (log) - Go 中文开发手册 import "log/syslog"概述索引示例 概述 软件包系统日志为系统日志服务提 ...

  8. syslog打印不带等级_syslog之一:Linux syslog日志系统详解

    目录: 一.syslog简介 syslog是一种工业标准的协议,可用来记录设备的日志.在UNIX系统,路由器.交换机等网络设备中,系统日志(System Log)记录系统中任何时间发生的大小事件.管理 ...

  9. Linux syslog日志系统详解

    一. syslog简介 syslog是一种工业标准的协议,可用来记录设备的日志.在UNIX系统,路由器.交换机等网络设备中,系统日志(System Log)记录系统中任何时间发生的大小事件.管理者可以 ...

最新文章

  1. php原生开发规范,php开发规范
  2. 深度学习中的随机种子
  3. 【大脑】改善记忆力的食物有哪些
  4. C语言中malloc为字符型指针分配内存引起的缓冲区泄露
  5. thinkphp memcache mysql_thinkphp中memcache的用法实例
  6. JDK8新特性之重复注解
  7. SEO怎么做?从排名和关键字优化入手
  8. 客快物流大数据项目(六十八):工作流调度
  9. NumPy学习笔记21. IO
  10. 街区最短路径问题——曼哈顿距离
  11. 使用Metricbeat和Filebeat监控Nginx性能指标和日志
  12. 【Windows Server 2019】路由服务的配置和管理
  13. 2017年软考程序员下午题第二题
  14. 微信小程序如何引入直播组件?
  15. 设计原则之【开闭原则】
  16. ble 读写特征值特征值_ap.readBLECharacteristicValue 读取低功耗蓝牙设备特征值中的数据 - 支付宝 Alipay JSSDK 开发文档...
  17. 【笔记】期权v1.0(python版)
  18. 数字图像融合相关评价指标
  19. XXL-JOB ORACLE版本-Version 2.0.2
  20. wwise集成到unreal

热门文章

  1. Hybird APP混合开发升级方法
  2. 谁来挑战imessage 米聊微信还是Youni?
  3. 英特尔携手腾讯云,打造应用云试玩新玩法
  4. 普通人一部手机也可以做,在自媒体平台赚钱的几种方式,分享一下
  5. seata分布式事务解决方案
  6. gunicorn的基本使用
  7. 软件系统的哲学对于吸引追随者的重要性
  8. 经典网页设计:原来404错误页面可以这样设计
  9. web前端三大主流框架介绍
  10. 对JPA的理解与回顾总结(二)