个人开发者的服务器日志收集

本文使用「署名 4.0 国际 (CC BY 4.0)」许可协议,欢迎转载、或重新修改使用,但需要注明来源。 署名 4.0 国际 (CC BY 4.0)

本文作者: 苏洋

创建时间: 2018年06月13日 统计字数: 6448字 阅读时间: 13分钟阅读 本文链接: https://soulteary.com/2018/06/13/server-log-collection-for-individual-developers.html


个人开发者的服务器日志收集

互联网时代,数据的价值被无限强调,对于开发人员来说,日志并不陌生,但是不知道有多少人有尝试过系统化的收集和处理日志,本文尝试从服务器日志收集建设开始讲起,给出一套相对简单、经济的日志采集方案。

这几年各家云主机轮番价格战之后,我们的云主机越来越多,网站也越来越多,除了在云主机管理面板或者通过API进行资源查询之外,有什么更好的方式可以尽可能在不大量编码,把不同云主机厂商的日志收归一处么?

当然,现在的公司一般都配置了数据团队,会使用ELK技术栈或者SPARK技术栈去进行数据的ETL,但是对于个人来说,这些都过于笨重了,即使因为容器技术蓬勃发展,几个配置文件一两条命令就能够把服务启动起来,但是有2个小问题:

  1. ELK本身对维护和对硬件资源要求不低。
  2. 周边对接的系统,对维护和资源的要求不低。

本着节约(穷)的精神,本文使用家里的宽带和一台闲置小主机进行日志的采集收归,相关资源配置,我在Home-Network-Note有提及,一台ATOM群晖兼容机即可,还能偷懒不折腾界面。

数据桥梁

公网和家里的机器想愉快进行日志采集,有这么几个方式:

  • 家庭宽带有固定IP,暴露端口到最外层路由,公网机器和家庭机器公网IP到公网IP。
    • 前几年还有这类宽带,现在已经基本绝迹,商用宽带太贵,而且需要公司进行申请。
  • 家庭宽带有浮动IP,使用DDNS将家庭IP绑定到一个域名上,随着IP更新,域名指向更新。
    • 如果动态域名指向的最外层设备存在安全隐患,将会危害整个内网,以及需要考虑域名解析被劫持的问题,域名解析存在生效时间、域名解析服务商选择也比较麻烦。
  • 使用被动连接的方式,将家庭内部应用流量转发到一个固定IP的公网机器,充当数据桥梁,云主机到云主机,然后再从这台桥梁的机器转发到内网。
    • 本文采取这种方案。

配置日志采集服务端

我们先进行服务端配置。

在群晖Web管理界面中找到 套件中心,选择 日志中心进行安装,软件安装之后。

安装日志服务

我们可以ssh到机器上,通过 ps进行进程查看,我们可以看到:

 
  1. soulteary@Lemon:/$ ps -ef | grep log
  2. system 4325 1 0 01:27 ? 00:03:09 /usr/bin/syslog-ng -F --worker-threads=4 -u system -g log
  3. root 4747 1 0 01:27 ? 00:00:02 /usr/syno/sbin/synologaccd -f
  4. root 4881 1 0 01:27 ? 00:00:00 /usr/syno/bin/synologrotated
  5. soultea+ 5741 5722 0 12:06 pts/17 00:00:00 grep --color=auto log
  6. root 11594 1 0 01:28 ? 00:00:18 /var/packages/LogCenter/target/usr/bin/syslog-ng --cfgfile=/var/packages/LogCenter/target/etc/syslog-ng/syslog-ng.conf -F --worker-threads=4

群晖的日志系统是使用 syslog-ng 这个软件来做的服务端,简单扫了一眼这个开源项目的仓库,了解到这个工具有一个将日志进行数据库化落地的能力,支持 RFC3164 和 RFC5424 两种风格的日志消息。

简单进行一番配置,选择好文件数据库存放位置,归档配置(synologrotated),新建一个接收日志的配置(syslog-ng)。

配置日志服务

下面是我的配置:

 
  1. 名称: CloudServer
  2. 日志格式: BSD格式
  3. 规则参数: 不填
  4. 传输协议: UDP
  5. 端口: 514
  6. SSL安全连接:不勾选

为了测试这个服务是否正常,我写了一个简单的脚本来进行验证:

 
  1. const os = require('os');
  2. const syslog = require('syslog-client');
  3.  
  4. const reportHost = '10.9.8.180';
  5. const port = 514;
  6. const mode = 'UDP';
  7. const facility = syslog.Facility.User;
  8. const appName = 'Test';
  9. const syslogHostname = os.hostname();
  10. const severity = syslog.Severity.Informational;
  11. const transport = (mode === 'UDP' ? syslog.Transport.Udp : syslog.Transport.Tcp);
  12. const testTimes = 100000;
  13.  
  14. const options = {syslogHostname, transport, port, facility, appName, severity};
  15. const logger = syslog.createClient(reportHost, options);
  16.  
  17. for (let i = 0; i < 10; i++) {
  18. setTimeout(() => {
  19. for (let i = 0; i < testTimes / 10; i++) {
  20. logger.log('example message');
  21. }
  22. }, 10);
  23. }
  24.  
  25. logger.on('close', () => {
  26. console.log('socket closed');
  27. });
  28.  
  29. logger.on('error', (error) => {
  30. console.error(error);
  31. });

执行脚本,尝试在短时间内快速发送10万个日志,看到日志中心有实时的消息进来了,但是数量有很大的出入。

发送UDP日志测试

将脚本中定义的发送方式改为TCP,同时修改接受服务端的模式,再次尝试发送。

可以看到10w个日志一条不差的都收集过来了。

发送TCP日志测试

接下来把内网的日志服务通过一台公网服务器暴露出去就可以对外提供服务了。

这里采取frp的方式进行,之前的文章里有提过这个方式,不过这次要转发的不是HTTP/HTTPS协议的内容,而是TCP。

前文提过数据桥梁的事情,内网服务器虽然是日志采集服务端,但是在数据传递上面来讲,它是数据桥梁的消费者,所以要执行frp客户端。

下面直接给出一份客户端配置参考:

 
  1. [common]
  2. server_addr = 你的公网服务器地址
  3. server_port = 公网frp服务端口
  4.  
  5. token = 连接token
  6. dns_server = DNS服务器地址,这里填写内网DNS服务器地址
  7.  
  8. [syslog]
  9. type = tcp
  10. local_ip = 0.0.0.0
  11. local_port = 514
  12. remote_port = 公网服务器服务端口

使用方式同之前的文章中提到的,在服务端执行服务端程序并指定配置文件,客户端同理:

 
  1. frpc -c frpc.ini

(群晖进程守护部分稍后补上。)

接下来我们来配置日志采集客户端。

日志采集客户端

在搭建日志采集的客户端,数据提供方之前,我们需要把网络先联通,把之前提到的数据桥梁先搭建起来。

同样给出frp的服务端配置:

 
  1. [common]
  2. bind_port = 公网frp服务端口
  3.  
  4. token = 连接token
  5.  
  6. dashboard_addr = 0.0.0.0
  7. dashboard_port = 公网管理端口
  8.  
  9. # dashboard user and passwd for basic auth protect, if not set, both default value is admin
  10. dashboard_user = 管理用户账号
  11. dashboard_pwd = 管理用户密码

启动服务,可以看到frp客户端和服务端显示已经连接成功,出于信息敏感就不贴日志输出了。

 
  1. frpc -c frpc.ini

一般来说,服务器的运行是很稳定的,但是服务器有可能因为提供商的种种原因而升级或者迁移而重启、进程可能因为系统资源不足而被干掉,为了保障服务的稳定,我们使用进行管理工具来进一步加固这个服务。

这里推荐使用 supervisor 进行进程守护,先进行安装,并进行:

 
  1. sudo apt install supervisor -y

在 /etc/supervisor/conf.d 创建一个frp的配置文件,:

 
  1. [program:syslog-frp]
  2. user=root
  3. command=/data/syslog/frps -c /data/syslog/frps.ini
  4. autostart=true
  5. startsecs=3
  6. startretries=100
  7. autorestart=true
  8. stderr_logfile=/data/syslog/error.log
  9. stderr_logfile_maxbytes=50MB
  10. stderr_logfile_backups=10
  11. stdout_logfile=/data/syslog/access.log
  12. stdout_logfile_maxbytes=50MB
  13. stdout_logfile_backups=10

重启 supervisor ,加载刚刚创建的配置,然后查看配置是否被正确的加载。

 
  1. sudo systemctl restart supervisor
  2. sudo supervisorctl status

可以看到配置文件被正确的加载,frp进程得到了守护。

 
  1. syslog-frp RUNNING pid 3781, uptime 1:09:34

好了,那么接着来配置日志上报服务。

刚才提到服务端支持两种协议,所以我们不必使用同样的软件,只要软件支持这两种协议即可。

这里推荐使用rsyslog进行日志的采集传输,Linux系统中一般都会默认安装,如果没有安装可以使用下面的命令进行安装:

 
  1. sudo apt-get install rsyslog -y

在使用之前,需要先检查一下版本,新老版本支持的配置有一些不同。

 
  1. rsyslogd -version
  2. rsyslogd 8.16.0, compiled with:
  3. PLATFORM: x86_64-pc-linux-gnu
  4. PLATFORM (lsb_release -d):
  5. FEATURE_REGEXP: Yes
  6. GSSAPI Kerberos 5 support: Yes
  7. FEATURE_DEBUG (debug build, slow code): No
  8. 32bit Atomic operations supported: Yes
  9. 64bit Atomic operations supported: Yes
  10. memory allocator: system default
  11. Runtime Instrumentation (slow code): No
  12. uuid support: Yes
  13. Number of Bits in RainerScript integers: 64
  14.  
  15. See http://www.rsyslog.com for more information.

如果你的软件大版本也是8.x的话,可以参考下面的配置方法:

先修改位于 /etc/rsyslog.conf 的配置文件。

 
  1. # 添加或者去掉配置文件中被注释的内容
  2. module(load="imtcp")
  3. input(type="imtcp" port="514")
  4.  
  5.  
  6. # 在文件底部添加网络故障进行本地缓存,稍后重试
  7. $ActionQueueFileName queue
  8. $ActionQueueMaxDiskSpace 1g
  9. $ActionQueueSaveOnShutdown on
  10. $ActionQueueType LinkedList
  11. $ActionResumeRetryCount -1
  12.  
  13. # 在文件底部添加使用TCP模式转发日志数据
  14.  
  15. *.* @@公网服务器地址:公网服务端端口

重启服务,让本次修改生效。

 
  1. service rsyslog restart

为了验证服务是否配置正确,输入测试语句:

 
  1. logger -p local0.info "Hello World"

测试日志接收

可以看到客户端已经可以成功接收来自云服务器的日志消息了。

之前提到我有使用traefik来提供服务发现,作为应用网关。

当时把输出日志保存成了文件,对于这类日志该如何处理呢,再次修改位于 /etc/rsyslog.conf 的配置文件。

 
  1. # 在配置顶部添加读取文件的模块,配置更新间隔为1s
  2. module(load="imfile" PollingInterval="1")

创建一个 /etc/rsyslog.d/30-traefik.conf 配置文件,内容如下:

 
  1. # proc log
  2. $InputFileName /data/traefik/logs/access.log
  3. $InputFileTag traefik-proc:
  4. $InputFileStateFile stat-traefik-proc
  5. $InputFileSeverity debug
  6. $InputFileFaility local6
  7. $InputFilePollInterval 1
  8. $InputRunFileMonitor
  9.  
  10. # access log
  11. $InputFileName /data/traefik/logs/access.log
  12. $InputFileTag traefik:
  13. $InputFileSeverity debug
  14. $InputFileFaility local6
  15. $InputFilePollInterval 1
  16. $InputRunFileMonitor

再次重启进程之后,我们发现客户端已经可以正确接受这些消息了。

来自云服务器的日志

额外要提的一些事

对所有的机器和应用进行类似的配置之后,你的日志采集服务就搭设完毕了。

最终运行效果

在服务运行一定时间之后,我们就可以尝试进行简单的ETL数据操作了。

另外,日志文件虽然不见得有“业务文件”和“业务数据”重要,但是备份也是必须的。

建议使用Raid或者Rsync之类的方案将数据进行合理备份,避免后续想进行分析的时候缺少数据。

最后

先写到这里,后面有机会聊聊日志文件的分析整理,以及采集服务的安全加固。

如果你对本篇文章的内容有疑问或者想讨论,欢迎联系我,我的联系方式聪明的你应该找的到吧?

--EOF

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Docker Loki Grafana是一种开源的日志聚合与可视化解决方案。它结合了Docker容器化技术、Loki日志收集工具和Grafana数据可视化平台,为用户提供了一种简单且高效的方法来收集、存储、查询和可视化日志数据。 首先,Docker是一种容器化技术,它可以将应用程序及其依赖项打包成一个独立的可执行容器,使应用程序可以在不同的环境中运行。Loki是一个轻量级的日志聚合工具,它可以在Docker容器中收集和存储大量的日志数据。Grafana是一个流行的数据可视化平台,它可以将Loki收集日志数据以图形化的方式展示出来。 使用Docker Loki Grafana,用户可以轻松地构建一个高度可扩展的日志分析平台。首先,用户可以使用Docker容器化技术将Loki与Grafana部署在不同的服务器上,实现高可用和负载均衡。然后,在应用程序中配置Loki代理,使其将日志数据发送到Loki服务器进行集中存储。最后,用户可以使用Grafana创建仪表板,通过图表、指标和警报等方式,对收集到的日志数据进行可视化分析。 使用Docker Loki Grafana的好处是多方面的。首先,它可以大大简化日志收集和存储的过程,无需手动部署和配置复杂的日志收集工具。其次,Loki具有高度可扩展性和效率,可以处理大量的日志数据。此外,Grafana提供了强大的数据可视化功能,用户可以根据自己的需求自定义仪表板,轻松地监控和分析日志数据。 总之,Docker Loki Grafana是一种简便、高效且强大的日志聚合与可视化解决方案。它利用Docker容器化技术、Loki日志收集工具和Grafana数据可视化平台,为用户提供了一种简单且高效的方法来收集、存储、查询和可视化日志数据。无论是个人开发者还是企业用户,都可以从中受益,并更好地理解和优化自己的应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值