问题描述
在我的应用程序中,每分钟10个温度传感器将通过syslog从字段向服务器发送温度读数。 然后,需要定期从rsyslog的/ var / log / messages中提取温度读数。
我想知道什么是有效但仍然简单的算法。
以下是系统日志内容的一些示例:
Aug 24 15:50:01 csedev-yshen systemd: Created slice User Slice of root.
Aug 24 15:50:01 csedev-yshen systemd: Started Session 8118 of user root.
Aug 24 15:50:01 csedev-yshen systemd: Removed slice User Slice of root.
Aug 24 15:50:01 csedev-yshen systemd-logind: New session 8119 of user yshen.
Aug 24 15:50:01 csedev-yshen systemd: Started Session 8119 of user yshen.
Aug 24 15:50:01 csedev-yshen dbus[950]: [system] Activating service name='org.freedesktop.problems' (using servicehelper)
Aug 24 15:50:01 csedev-yshen dbus[950]: [system] Successfully activated service 'org.freedesktop.problems'
Aug 24 22:49:42 abc.165.52.xy ENVIROMUX-MICRO 1598309382,85.14,39.94,14.48,n/a,O,O#012#015
Aug 24 22:50:42 abc.165.52.xy ENVIROMUX-MICRO 1598309442,85.16,39.92,O#012#015
Aug 24 15:51:56 csedev-yshen su: Failed SU (to root) yshen on pts/0
Aug 24 22:51:42 abc.165.52.xy ENVIROMUX-MICRO 1598309502,85.18,39.86,14.47,O#012#015
Aug 24 15:52:08 csedev-yshen su: (to root) yshen on pts/0
Aug 24 22:52:42 abc.165.52.xy ENVIROMUX-MICRO 1598309562,39.93,O#012#015
我只需要提取这些温度读数:
Aug 24 22:52:42 abc.165.52.xy ENVIROMUX-MICRO 1598309562,O#012#015
每5分钟
grep "ENVIROMUX-MICRO" /var/log/messages >> temperature.log
该解决方案非常浪费,因为它将每5分钟重复一次已经提取的温度读数!
一种改进但仍不防弹的解决方案可能是:
tail -n 100 /var/log/messages | grep "ENVIROMUX-MICRO" /var/log/messages >> temperature.log
可能需要调整100条线,上述数字是5分钟内20个传感器的读数,每个传感器每分钟发送一个读数。如果100太小,此解决方案可能会丢失一些读数。如果100个太大,可能还会有一些重复项。
我想知道是否有更好的解决方案,从概念上讲,我只需要获取尚未提取的数据。如果我从头开始访问文件并从头到尾遍历记录,则只需提取未访问的记录。
可能可以廉价地计算散列或CRC,以判断是否已访问记录,即上次访问记录的存储签名。任何记录的哈希值(如果等于上次访问的记录),则表明我已到达上一个访问的记录。
在伪代码中,它可能类似于:
file <- /var/log/messages
lask_visited <- hash(last_visited_record)
visiting_record <- last(file)
while hash(visiting_record) != last_visited:
visiting_record >> temperatures_extracted
visiting_record <- prevIoUs(visiting_record)
reverse(temperatures_extracted)
我想应该已经有了一些更好的和成熟的东西。
我想知道它是否与流服务的概念有关。但是我需要一个轻巧的解决方案。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)