Cloud Foundry中syslog_aggregator的实现分析

2023-12-08 00:32

本文主要是介绍Cloud Foundry中syslog_aggregator的实现分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        在Cloud Foundry中,用来收集Cloud Foundry各组件日志信息的组件,名为syslog_aggregator。

        syslog_aggregator可以做到方便的收集Cloud Foundry中所有组件的日志信息,并将这些信息进行初步处理,比如说:将不同月份产生的日志,进行分类存储;另外还对同一月份内产生的日志,将其通过不同的日期进行分类。这样的话,当Cloud Foundry平台的开发者,在运营该平台时需要查看Cloud Foundry中某一个组件产生的日志时,可以方便的查找到对应日期的日志。syslog_aggregator除了可以对日志进行分组件,分月份,分日期进行存储外,还提供一些对日志进行打包或剪枝的功能,比如:syslog_aggregator会将一定期限内的日志,进行压缩,以达到节省存储空间的功能;另外syslog_aggregator还会定期对日志进行清除,比如只保存一定期限时间长度的日志,当日志超过该时限,syslog_aggregator会将其清除。

        以下是对syslog_aggregator实现的简单分析:

        syslog_aggregator组件主要包括monit模块,日志管理模块。


monit模块

       monit模块主要是实现:监控syslog_aggregator组件的运行状态,一旦监控过syslog_aggregator组件中该进程不存活时,即刻重启该进程;另外,syslog_aggregator组件还将自身的信息通过cloud_agent传送给NATS,这里的信息包括syslog_aggregator组件所在的宿主机的存活状态以及资源使用情况。

       以下通过monit监控进程的代码:

check process syslog_aggregatorwith pidfile /var/vcap/sys/run/syslog_aggregator/syslog_aggregator.pidstart program "/var/vcap/jobs/syslog_aggregator/bin/syslog_aggregator_ctl start"stop program "/var/vcap/jobs/syslog_aggregator/bin/syslog_aggregator_ctl stop"group vcap
       该段代码中清晰的标明了进程的pid,进程的start命令以及stop命令。

       cloud_agent作为BOSH监控Cloud Foundry组件级信息的辅助工具,负责收集syslog_aggregator组件所在宿主机的运行状态以及资源使用情况,并发送给health_monitor,由health_monitor统一管理。由于cloud_agent不是本文的重点,所以本文不再赘述。


日志管理模块

       实现日志管理,syslog_aggregator是通过启动syslog_aggregator_ctl脚本来实现的。上文中提到的monit模块中,也正是监控这个脚本命令启动的进程。以下来分析一下该脚本的代码实现:

#!/bin/bashRUN_DIR=/var/vcap/sys/run/syslog_aggregator
LOG_DIR=/var/vcap/store/log
JOB_DIR=/var/vcap/jobs/syslog_aggregator
PACKAGE_DIR=/var/vcap/packages/syslog_aggregatorBIN_DIR=$JOB_DIR/bin
PIDFILE=$RUN_DIR/syslog_aggregator.pidsource /var/vcap/packages/common/utils.shcase $1 instart)apt-get -y install rsyslog-relppid_guard $PIDFILE "Syslog aggregator"mkdir -p $RUN_DIRmkdir -p $LOG_DIRchown -R vcap:vcap $LOG_DIRrm -f /etc/cron.daily/bzip_old_logscp -a $BIN_DIR/gzip_old_logs /etc/cron.dailycp -a $BIN_DIR/reap_old_logs /etc/cron.hourlycp -a $BIN_DIR/symlink_logs /etc/cron.hourlycp -a $PACKAGE_DIR/send_error_mail /etc/cron.dailyexec /usr/sbin/rsyslogd -f $JOB_DIR/config/rsyslogd.conf -i $PIDFILE -c 4 \>>$LOG_DIR/rsyslogd.stdout.log \2>>$LOG_DIR/rsyslogd.stderr.log;;stop)kill_and_wait $PIDFILErm /etc/cron.daily/gzip_old_logsrm /etc/cron.hourly/reap_old_logs;;*)echo "Usage: syslog_aggregator_ctl {start|stop}";;esac
       在通过该脚本来实现启动syslog_aggregator进程的时候,使用的是start命令。进入start命令,可以看到,安装了rsyslog-relp;然后通过/var/vcap/packages/common/utils.sh中定义的pid_guard()方法来实现对该进程pid的保护,当系统中已经由相应的进程以该pid在运行时,删除该进程,以保证syslog_aggregator可以按预先设置的pid进行运行;随后创建几个定义好的目录,RUN_DIR,LOG_DIR,还对LOG_DIR进行拥有用户修改。

       脚本中随后的5行代码,涉及到的是Linux操作系统中cron 定期任务删除与添加的实现:

    rm -f /etc/cron.daily/bzip_old_logscp -a $BIN_DIR/gzip_old_logs /etc/cron.dailycp -a $BIN_DIR/reap_old_logs /etc/cron.hourlycp -a $BIN_DIR/symlink_logs /etc/cron.hourlycp -a $PACKAGE_DIR/send_error_mail /etc/cron.daily
        首先在每日的执行任务中删除掉bzip_old_logs任务,如果该任务存在的话;随后将4个任务分别加入到了指定的目录位置,分别是:gzip_old_logs, reap_old_logs, symlink_logs, send_error_mail。也就是让Linux操作系统每天一次执行gzip_old_logs脚本,每小时执行一次reap_old_logs脚本,每小时执行一次symlink_logs脚本,每周一次执行一次send_error_mail脚本。

        添加完这些定义任务之后,syslog_aggregator随后启动了rsyslog server,实现日志服务器的启动:

exec /usr/sbin/rsyslogd -f $JOB_DIR/config/rsyslogd.conf -i $PIDFILE -c 4 \>>$LOG_DIR/rsyslogd.stdout.log \2>>$LOG_DIR/rsyslogd.stderr.log
        启动rsyslog server的具体配置可以参看rsyslogd.conf的各参数:

$MaxMessageSize 4k# Caveat - This always binds to all interfaces (cannot specify otherwise).
$ModLoad imtcp
$InputTCPMaxSessions 1024
$InputTCPServerRun 54321
$PrivDropToUser vcap
$PrivDropToGroup vcap# Write each component's messages to a separate log
# programname is assumed to be 'vcap.<component>'
# Directory is created automatically
$template VcapComponentLogFile, "/var/vcap/store/log/%programname:6:$%/%$year%/%$month%/%$day%/%programname:6:$%.log"
$template VcapComponentLogFormat, "%fromhost-ip% -- %msg%\n"# The initial '-' tells rsyslogd to not sync the file after each write
:programname, startswith, "vcap." -?VcapComponentLogFile;VcapComponentLogFormat# Prevent them from reaching anywhere else
:programname, startswith, "vcap." ~

        当然有server的话,自然会accept来自client的请求,所以在Cloud Foundry中每个组件都会安装一个resyslog的client端,然后启动该client,连接rsyslog server,并发送日志请求,以此来实现日志的传输,又通过刚才涉及到的那些脚本实现对日志的管理。

        以下分析添加到周期性任务中的脚本功能。


        1.gzip_old_logs

        该脚本的实现很简单,如下:

#!/bin/bash
# Compress log files that haven't changed in the last day
find /var/vcap/store/log -type f -mmin +1440 -name '*.log' -exec gzip '{}' \;
         功能为找到/var/vcap/store/log目录下,1440分钟(24小时)内没有被修改的文件,然后进行压缩操作。


        2.symlink_logs

        该脚本实现的是:为每一个当天的创建出来的文件创建符号链接,`date + %Y`执行结果为执行时的年份,依此类推。代码如下:

#!/bin/bash
# create symlinks to today's logs in /var/vcap/store/log
for x in /var/vcap/store/log/*/`date +%Y`/`date +%m`/`date +%d`/* ; do if [ -f "$x" ]; then ln -sf "$x" /var/vcap/store/log; fi; done
     

        3.reap_old_logs

        该脚本实现的是:清除保存已超过7天的日志。代码如下:

#!/bin/bashset -uLOG_DIR=/var/vcap/store/log
# Reap logs that are older than 7 days
DAYS_TO_KEEP=7
let "MIN_TO_KEEP=${DAYS_TO_KEEP}*24*60"# get the last $DAYS_TO_KEEP date to exclude from the rmdirDAYS_TO_EXCLUDE=$(
for i in $(seq 0 ${DAYS_TO_KEEP}); do
date -d "now - $i days" +%Y/%m/%d
done
)
# example output: "2012/09/21|2012/09/20|.....|2012/09/15|2012/09/14"
EGREP_FORMAT_DAYS_TO_EXCLUDE=$(echo $DAYS_TO_EXCLUDE | tr ' ' '|')find ${LOG_DIR} -mmin +${MIN_TO_KEEP} -name '*.log.gz' -exec rm -f '{}' \;# Reap empty dirs in 3 passes, clear empty 'day' dirs, then 'month'
# and lastly 'year'
for i in '/[0-9]{4}/[0-1][0-9]/[0-9]{2}$' \'/[0-9]{4}/[0-1][0-9]$' \'/[0-9]{4}$'; do/usr/bin/find ${LOG_DIR} -type d -empty |egrep -v "${EGREP_FORMAT_DAYS_TO_EXCLUDE}" |egrep ${i} |xargs -r -n 200 rmdir
done
        其中,EGREP_FORMAT_DAYS_TO_EXCLUDE是为了获取一个通过‘|’字符串联起来的字符串,随后实现对指定路径进行清除。

        以上便是对Cloud Foundry中syslog_aggregator的简单分析。


关于作者:

孙宏亮,DAOCLOUD软件工程师。两年来在云计算方面主要研究PaaS领域的相关知识与技术。坚信轻量级虚拟化容器的技术,会给PaaS领域带来深度影响,甚至决定未来PaaS技术的走向。

 


转载请注明出处。

这篇文档更多出于我本人的理解,肯定在一些地方存在不足和错误。希望本文能够对接触Cloud Foundry中syslog_aggregator的人有些帮助,如果你对这方面感兴趣,并有更好的想法和建议,也请联系我。

我的邮箱:allen.sun@daocloud.io

新浪微博:@莲子弗如清 






这篇关于Cloud Foundry中syslog_aggregator的实现分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/467872

相关文章

C++对象布局及多态实现探索之内存布局(整理的很多链接)

本文通过观察对象的内存布局,跟踪函数调用的汇编代码。分析了C++对象内存的布局情况,虚函数的执行方式,以及虚继承,等等 文章链接:http://dev.yesky.com/254/2191254.shtml      论C/C++函数间动态内存的传递 (2005-07-30)   当你涉及到C/C++的核心编程的时候,你会无止境地与内存管理打交道。 文章链接:http://dev.yesky

Spring Cloud:构建分布式系统的利器

引言 在当今的云计算和微服务架构时代,构建高效、可靠的分布式系统成为软件开发的重要任务。Spring Cloud 提供了一套完整的解决方案,帮助开发者快速构建分布式系统中的一些常见模式(例如配置管理、服务发现、断路器等)。本文将探讨 Spring Cloud 的定义、核心组件、应用场景以及未来的发展趋势。 什么是 Spring Cloud Spring Cloud 是一个基于 Spring

[职场] 公务员的利弊分析 #知识分享#经验分享#其他

公务员的利弊分析     公务员作为一种稳定的职业选择,一直备受人们的关注。然而,就像任何其他职业一样,公务员职位也有其利与弊。本文将对公务员的利弊进行分析,帮助读者更好地了解这一职业的特点。 利: 1. 稳定的职业:公务员职位通常具有较高的稳定性,一旦进入公务员队伍,往往可以享受到稳定的工作环境和薪资待遇。这对于那些追求稳定的人来说,是一个很大的优势。 2. 薪资福利优厚:公务员的薪资和

通过SSH隧道实现通过远程服务器上外网

搭建隧道 autossh -M 0 -f -D 1080 -C -N user1@remotehost##验证隧道是否生效,查看1080端口是否启动netstat -tuln | grep 1080## 测试ssh 隧道是否生效curl -x socks5h://127.0.0.1:1080 -I http://www.github.com 将autossh 设置为服务,隧道开机启动

时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测

时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测 目录 时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测基本介绍程序设计参考资料 基本介绍 MATLAB实现LSTM时间序列未来多步预测-递归预测。LSTM是一种含有LSTM区块(blocks)或其他的一种类神经网络,文献或其他资料中LSTM区块可能被描述成智能网络单元,因为

vue项目集成CanvasEditor实现Word在线编辑器

CanvasEditor实现Word在线编辑器 官网文档:https://hufe.club/canvas-editor-docs/guide/schema.html 源码地址:https://github.com/Hufe921/canvas-editor 前提声明: 由于CanvasEditor目前不支持vue、react 等框架开箱即用版,所以需要我们去Git下载源码,拿到其中两个主

android一键分享功能部分实现

为什么叫做部分实现呢,其实是我只实现一部分的分享。如新浪微博,那还有没去实现的是微信分享。还有一部分奇怪的问题:我QQ分享跟QQ空间的分享功能,我都没配置key那些都是原本集成就有的key也可以实现分享,谁清楚的麻烦详解下。 实现分享功能我们可以去www.mob.com这个网站集成。免费的,而且还有短信验证功能。等这分享研究完后就研究下短信验证功能。 开始实现步骤(新浪分享,以下是本人自己实现

基于Springboot + vue 的抗疫物质管理系统的设计与实现

目录 📚 前言 📑摘要 📑系统流程 📚 系统架构设计 📚 数据库设计 📚 系统功能的具体实现    💬 系统登录注册 系统登录 登录界面   用户添加  💬 抗疫列表展示模块     区域信息管理 添加物资详情 抗疫物资列表展示 抗疫物资申请 抗疫物资审核 ✒️ 源码实现 💖 源码获取 😁 联系方式 📚 前言 📑博客主页:

探索蓝牙协议的奥秘:用ESP32实现高质量蓝牙音频传输

蓝牙(Bluetooth)是一种短距离无线通信技术,广泛应用于各种电子设备之间的数据传输。自1994年由爱立信公司首次提出以来,蓝牙技术已经经历了多个版本的更新和改进。本文将详细介绍蓝牙协议,并通过一个具体的项目——使用ESP32实现蓝牙音频传输,来展示蓝牙协议的实际应用及其优点。 蓝牙协议概述 蓝牙协议栈 蓝牙协议栈是蓝牙技术的核心,定义了蓝牙设备之间如何进行通信。蓝牙协议

python实现最简单循环神经网络(RNNs)

Recurrent Neural Networks(RNNs) 的模型: 上图中红色部分是输入向量。文本、单词、数据都是输入,在网络里都以向量的形式进行表示。 绿色部分是隐藏向量。是加工处理过程。 蓝色部分是输出向量。 python代码表示如下: rnn = RNN()y = rnn.step(x) # x为输入向量,y为输出向量 RNNs神经网络由神经元组成, python