【工作笔记】syslog,kern.log大量写入invalid cookie错误信息问题
任务描述
错误出现出现过四五次,应该是诊断单元tf卡读写出问题导致下面这条告警一直高频写入到/var/log/下的syslog、kern.log、messages中
Nov 23 06:25:12 embest kernel: omap_hsmmc 48060000.mmc: [omap_hsmmc_pre_dma_transfer] invalid cookie: data->host_cookie 1 host->next_data.cookie -2107299097
等系统分区写满后WebServer
(一个node.js实现的可视化系统)会卡死(也可能tf出错时就已经卡死,但是WebServer中日志中没报任何异常),只能删掉日志重启诊断单元
(一个硬件设备,arm64,ubuntu系统)才能恢复,尝试重新该问题,重现不了就想办法识别该问题发生就重启诊断单元
前期思考
思路1
我在网上翻到一个有点类似的问题讨论,不确定是什么问题,有可能是板子的事,不过楼主建议“如果内核关闭SMP,或是uboot启动的时候nosmp 参数禁用SMP就不会出现该问题”https://bbs.21ic.com/icview-903274-1-1.html
所以最开始的解决方法是日志中出现这个错误就直接停止MotorServer然后重启诊断单元吧,把重启的记录也写到MotorServer.log中。
因此我完成了一个shell脚本,代码如下。
#!/bin/bash
_var=""
_var1=""
_var2=""# 判断日志文件是否存在
if [ -f /var/log/syslog ] ;then_var=`grep -w 'invalid cookie' /var/log/syslog`;
fi
if [ -f /var/log/kern.log ] ;then_var1=`grep -w 'invalid cookie' /var/log/kern.log`;
fi
if [ -f /var/log/messages ];then_var2=`grep -w 'invalid cookie' /var/log/messages`;
fi# 判断日志文件是否有'invalid cookie'相关的错误
if [[ "$_var" || "$_var1"|| "$_var2" ]];
thenecho `date +"%Y-%m-%d %H:%M:%S MotorServer will restart because /var/log/ exist error of invalid cookie"` >> /media/eMMC-Flasher/motor/log/MotorServer.logsupervisorctl restart MotorServerecho "exist"sudo reboot
fi
我的打算是脚本执行就写到系统的定时任务,每隔12小时定时执行一次,检查/var/log下的syslog,kern.log,messages是否有invalid cookie这种错误信息,有就记录到moter-server.log,重启motor-server和诊断单元。但是并不可行,因为出现这个错误之后会不断写入,很快就满了,不能用定时任务,应该看一下syslog和kern.log有没有回调钩子
思路2
因此我也找到一个可以监听到文件事件的回调钩子函数及其相关介绍,相关参考链接如下:https://blog.csdn.net/sesiria/article/details/119721118
https://www.cnblogs.com/PikapBai/p/14480881.html
不过这个是针对所有的文件的,用这种也可行,不过效率可能没有专门针对syslog的高,但我觉得syslog、kern.log应该会提供专门的接口。
我也专门寻找了一些博客文章,发现系统日志syslog也是有提供linux内核接口,syslog.h,但是只有写入日志的接口,并没有监听写入事件的,具体了解syslog.h可以参考下面这些文章
https://blog.csdn.net/zhizhengguan/article/details/111597389
https://blog.csdn.net/u012247418/article/details/83684052
https://blog.csdn.net/qq_23274715/article/details/106138885
思路3
过滤日志,可以用syslog filter来监测是否有日志文件中的cookie invalid,从而可以过滤掉这一类的日志,从而可以防止系统日志被大量写入,磁盘空间占满。
利用rsyslog进行系统日志过滤的相关文章参考如下:
https://blog.csdn.net/FaceThePast/article/details/114483026
https://blog.csdn.net/Jailman/article/details/115956157
查看rsyslog版本:https://blog.csdn.net/jeonkc/article/details/79986634
解决方案敲定
- 初步想法:如果要根据写入syslog的内容进行判断,对诊断单元重启,目前我能想到的就是用inotify监听syslog的写入事件,然后再c++调用tail命令获取日志最新写入的前50条数据,对里面的内容进行判断是否存在“invalid cookie”错误,决定要不要重启诊断单元
- 深入思考,假如日志写入增长快,日志内容多,获取前k条的想法并不好,一来有可能出现错过漏掉的情况;就算不会出现错过漏掉的情况,假如日志内容大,写入缓存,然后利用字符串对比较,这样的效率也不好;三,syslog作为系统日志,写入会相对记录的信息相对多,同时“invalid cookie”这样的错误信息是偶发事件,并不容易复现,这样子程序则会长时间去进行无用的判断,浪费系统资源。
- 优化后最终决策:syslog filter过滤出cookie invalid再触发inotify,只要触发了就重启,不用传递日志内容。设置rsyslog规则,把包含cookie invalid的日志信息写入一个A文件,inotify就监听A文件,A文件有写入事件了就重启。
这样子做,一来是保留了错误日志信息,也方便监听,而且inotify的c++程序可以挂在后台supervisor进程,同时偶发事件不占用程序一直判断。
实现过程
配置rsyslog过滤包含“invalid error”的日志
(1)这一步我们的想法是写过滤规则,将包含指定内容的日志信息写入自定义的文件。在根据https://blog.csdn.net/FaceThePast/article/details/114483026 博客里面的方式设置rsylog.conf,但是发现并不生效。
(2)后面查了其他博客,例如https://blog.csdn.net/Jailman/article/details/115956157。发现不同版本的rsyslog服务是的配置文件有一些不同,可以用下面命令去查看版本
rsyslogd -ver
图片上面看是V8的,格式差不多是下面这样,但是下面这个的意思是,日志内容与keyword相等的就停止写入,并且修改了内容后要重启reyslog
这不符合我们的要求,那我们参考v7的,写成这样,意思是将包含invalid cookie内容的日志写入/var/log/invalid_cookie_error.log文件中
syslog.conf
:rawmsg, contains, "invalid cookie" /var/log/invalid_cookie_error.log
然后将写好的过滤规则文件syslog.conf放到/etc/rsyslog.d/目录下,因为规则文件存放的路径是/etc/rsyslog.conf里面原来配置好的
最后重启服务
service rsyslog restart
还要看看服务有没有正常运行,有没有错误信息
service rsyslog status
invotify监听指定文件是否被写入
这里附上invotify监听的c++代码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <sys/inotify.h>
#include <sys/reboot.h>
#include <iostream>
#include <sys/time.h>
using namespace std;
#define EVENT_NUM 12
void GetTime(string& strtime)
{time_t tt = time(NULL);//这句返回的只是一个时间cuotm* t = localtime(&tt);char buffer[50];snprintf(buffer, sizeof(buffer), "%04d-%02d-%02d %02d:%02d:%02d", t->tm_year + 1900, t->tm_mon + 1, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec);strtime.append(buffer);
}string GetTime()
{string strtime;GetTime(strtime);return strtime;
}
const char *event_str[EVENT_NUM] =
{"IN_ACCESS","IN_MODIFY","IN_ATTRIB","IN_CLOSE_WRITE","IN_CLOSE_NOWRITE","IN_OPEN","IN_MOVED_FROM","IN_MOVED_TO","IN_CREATE","IN_DELETE","IN_DELETE_SELF","IN_MOVE_SELF"
};int inotifyTask(char *argv[])
{cout<<GetTime().c_str()<<":inotify event start....."<<endl;int fd = -1;fd = inotify_init();int wd1 = -1;struct inotify_event *event;int length;int nread;char buf[BUFSIZ];int i = 0;buf[sizeof(buf) - 1] = 0;wd1 = inotify_add_watch(fd, argv[1], IN_ALL_EVENTS);if(wd1 < 0){fprintf(stderr, "%s:inotify_add_watch %s failed\n", GetTime().c_str(),argv[1]);printf("%s:Error no.%d: %s\n", GetTime().c_str(),errno, strerror(errno));}length = read(fd, buf, sizeof(buf) - 1);nread = 0;// inotify 事件发生时while(length > 0){printf("\n");event = (struct inotify_event *)&buf[nread];// 遍历所有事件for(i = 0; i< EVENT_NUM; i++){ // 判断事件是否发生if( (event->mask >> i) & 1 ){ // 该监控项为目录或目录下的文件时if(event->len > 0){fprintf(stdout, "%s:%s --- %s\n",GetTime().c_str(), event->name, event_str[i]);}// 该监控项为文件时else if(event->len == 0){if(event->wd == wd1){if(strcmp(event_str[i],"IN_MODIFY")==0){fprintf(stdout, "%s:%s --- %s\n",GetTime().c_str(), argv[1], event_str[i]);system("echo `date +\"%Y-%m-%d %H:%M:%S MotorServer will restart because /var/log/ exist error of invalid cookie\"` >> /media/eMMC-Flasher/motor/log/MotorServer.log");system("nice -n 19 supervisorctl stop MotorServer");system("nice -n 19 supervisorctl stop WebServer");sync(); // 同步磁盘数据,将缓存数据回写到硬盘,以防数据丢失[luther.gliethttp]printf("%s:system will reboot\n",GetTime().c_str());return system("sudo reboot");// return reboot(RB_AUTOBOOT);}}}}}nread = nread + sizeof(struct inotify_event) + event->len;length = length - sizeof(struct inotify_event) - event->len;}close(fd);return 0;
}int main(int argc, char *argv[])
{ if(argc < 2){fprintf(stderr, "Usage: %s path\n", argv[0]);return -1;}if(inotifyTask(argv) == -1){return -1;}return 0;
}
- 在linux中可以用logger "xxx"模拟将日志信息写入syslog
logger "embest kernel: omap_hsmmc 48060000.mmc: [omap_hsmmc_pre_dma_transfer] invalid cookie: data->host_cookie 1 host->next_data.cookie -2107299097"
相关文章:

【工作笔记】syslog,kern.log大量写入invalid cookie错误信息问题
任务描述 错误出现出现过四五次,应该是诊断单元tf卡读写出问题导致下面这条告警一直高频写入到/var/log/下的syslog、kern.log、messages中 Nov 23 06:25:12 embest kernel: omap_hsmmc 48060000.mmc: [omap_hsmmc_pre_dma_transfer] invalid cookie: data->hos…...

【C++】多线程
多任务处理有两种形式,即:多进程和多线程。 基于进程的多任务处理是程序的并发执行。基于线程的多任务处理是同一程序的片段的并发执行 文章目录1. 多线程介绍2. Windows多线程1. 多线程介绍 每一个进程(可执行程序)都有一个主线…...

0202插入删除-算法第四版红黑树-红黑树-数据结构和算法(Java)
文章目录4 插入4.1 序4.2 向单个2-结点插入新键4.3 向树底部的2-结点插入新键4.4 向一棵双键树(3-结点)中插入新键4.5 颜色调整4.6 根结点总是黑色4.7 向树底部的3-结点插入新键4.8 将红链接在树中向上传递4.9 实现5 删除5.1 删除最小键5.2 删除6 有序性…...

vue 生成二维码插件 vue-qr使用方法
一、安装 npm install vue-qr --save二、引入 import VueQr from vue-qrcomponents:{VueQr,},三、使用 <vue-qr:text"dyQrcode":size"170":logoSrc"logo":margin"6":logoScale"0.2"></vue-qr>四、属性说明 …...

网络工程课(二)
ensp配置vlan 一、配置计算机ip地址和子网掩码 二、配置交换机LSW1 system-view [Huawei]sysname SW1 [SW1]vlan batch 10 20 [SW1]interface Ethernet0/0/1 [SW1-Ethernet0/0/1]port link-type access 将接口设为access接口 [SW1-Ethernet0/0/1]port default vlan 10 [SW1-E…...

Pytorch并行计算(三): 梯度累加
梯度累加 梯度累加(Gradient Accmulation)是一种增大训练时batch size的技巧。当batch size在一张卡放不下时,可以将很大的batch size分解为一个个小的mini batch,分别计算每一个mini batch的梯度,然后将其累加起来优…...

蓝桥杯入门即劝退(十八)最小覆盖子串(滑动窗口解法)
欢迎关注点赞评论,共同学习,共同进步! ------持续更新蓝桥杯入门系列算法实例-------- 如果你也喜欢Java和算法,欢迎订阅专栏共同学习交流! 你的点赞、关注、评论、是我创作的动力! -------希望我的文章…...

Android一~
进程和线程的区别https://zhuanlan.zhihu.com/p/60375108https://zhuanlan.zhihu.com/p/138689342线程池的用法和原理tcp三次握手和四次挥手、tcp基础http请求报文格式二叉树中序遍历(算法)activity启动模式OKhttp源码讲解Java修饰符Java线程同步的方法s…...

一月券商金工精选
✦研报目录✦ ✦简述✦ 按发布时间排序 国盛证券 “薪火”量化分析系列研究(二)-票据逾期数据中的选股信息 发布日期:2023-01-04 关键词:股票、票据、票据预期 主要内容:本文深入探讨了“票据持续逾期名单”这一…...

UML中常见的9种图
UML是Unified Model Language的缩写,中文是统一建模语言,是由一整套图表组成的标准化建模语言。UML用于帮助系统开发人员阐明,展示,构建和记录软件系统的产出。通过使用UML使得在软件开发之前, 对整个软件设计有更好的…...

使用SpringBoot实现无限级评论回复功能
评论功能已经成为APP和网站开发中的必备功能。本文采用springbootmybatis-plus框架,通过代码主要介绍评论功能的数据库设计和接口数据返回。我们返回的格式可以分三种方案,第一种方案是先返回评论,再根据评论id返回回复信息,第二种方案是将评论回复直接封装成一个类似于树的数据…...

Kafka 介绍和使用
文章目录前言1、Kafka 系统架构1.1、Producer 生产者1.2、Consumer 消费者1.3、Consumer Group 消费者群组1.4、Topic 主题1.5、Partition 分区1.6、Log 日志存储1.7、Broker 服务器1.8、Offset 偏移量1.9、Replication 副本1.10、Zookeeper2、Kafka 环境搭建2.1、下载 Kafka2.…...

[学习笔记]Rocket.Chat业务数据备份
Rocket.Chat 的业务数据主要存储于mongodb数据库的rocketchat库中,聊天中通过发送文件功能产生的文件储存于/app/uploads中(文件方式设置为"FileSystem"),因此在对Rocket.Chat做数据移动或备份主要分为两步,…...

【ZOJ 1090】The Circumference of the Circle 题解(海伦公式+正弦定理推论)
计算圆的周长似乎是一项简单的任务——只要你知道它的直径。但如果你没有呢? 我们给出了平面中三个非共线点的笛卡尔坐标。 您的工作是计算与所有三个点相交的唯一圆的周长。 输入规范 输入文件将包含一个或多个测试用例。每个测试用例由一条包含六个实数x1、y1、x…...

【go】slice原理
slice包含3个部分: 1.内存的起始位置 2.切片的大小(已经存放的元素数量) 3.容量(可以存放的元素数量) 使用make初始化切片会开辟底层内存,并初始化元素值为默认值,如数字为0,字符串为空 使用New初始化切片不会开辟底层数组&…...

【数据库】MySQL概念知识语法-基础篇(DQL),真的很详细,一篇文章你就会了
目录通用语法及分类DQL(数据查询语言)基础查询条件查询聚合查询(聚合函数)分组查询排序查询分页查询内连接查询外连接查询自连接查询联合查询子查询列子查询行子查询表子查询总结通用语法及分类 ● DDL: 数据定义语言,…...

博客界的至高神:属于自己的WordPress网站,你值得拥有!
【如果暂时没时间安装,可以直接跳转到最后先看展示效果】 很多朋友都想有一个对外展示的窗口,在那里放一些个人的作品或者其他想对外分享的东西。大部分人选择了在微博、公众号等平台,毕竟这些平台流量大,我们可以很轻易地把自己…...

操作系统(day13)-- 虚拟内存;页面分配策略
虚拟内存管理 虚拟内存的基本概念 传统存储管理方式的特征、缺点 一次性: 作业必须一次性全部装入内存后才能开始运行。驻留性:作业一旦被装入内存,就会一直驻留在内存中,直至作业运行结束。事实上,在一个时间段内&…...

SQL零基础入门学习(四)
SQL零基础入门学习(三) SQL INSERT INTO 语句 INSERT INTO 语句用于向表中插入新记录。 SQL INSERT INTO 语法 INSERT INTO 语句可以有两种编写形式。 第一种形式无需指定要插入数据的列名,只需提供被插入的值即可: INSERT …...

19岁就患老年痴呆!这些前兆别忽视!
在大部分人的印象中,阿尔兹海默症好像是专属于老年人的疾病,而且它的另一个名字就是老年痴呆症。然而,前不久,一位19岁的男生患上了阿尔兹海默症,是迄今为止最年轻的患者。这个男生从17岁开始,就出现了注意…...

【C++】thread|mutex|atomic|condition_variable
本篇博客,让我们来认识一下C中的线程操作 所用编译器:vs2019 阅读本文前,建议先了解线程的概念 👉 线程概念 1.基本介绍 在不同的操作系统,windows、linux、mac上,都会对多线程操作提供自己的系统调用接口…...

学成在线项目笔记
业务层开发 DAO开发示例 生成实体类对应的mapper和xml文件 定义MybatisPlusConfig,用于扫描mapper和配置分页拦截器 MapperScan("com.xuecheng.content.mapper") Configuration public class MybatisPlusConfig {Beanpublic MybatisPlusInterceptor myb…...

FreeRTOS队列
队列简介队列是一种任务到任务,任务到中断,中断到任务数据交流得一种机制。在队列中可以存储数量有限,大小固定得多个数据,队列中的每一个数据叫做队列项目,队列能够存储队列项目的最大数量称为队列的长度,…...

rancher2安装nfs-subdir-external-provisioner为PVC/PV动态提供存储空间(动态分配卷)
接上一篇《centos7部署rancher2.5详细图文教程》 一、 安装nfs服务 1. 所有节点都需要操作 $ # 下载 nfs 相关软件 $ sudo yum -y install nfs-utils rpcbind$ # 启动服务并加入开机自启 $ sudo systemctl start nfs && systemctl enable nfs $ sudo systemctl star…...

1.JAVA-JDK安装
前言:工具下载地址阿里云盘:Java-Jdk:https://www.aliyundrive.com/s/JpV55xhVq2A提取码: j53y一、jdk下载:前往Oracle官网可免费下载地址:https://www.oracle.com/java/technologies/downloads/ 此处我下载的是jdk8&a…...

Java必备小知识点4——数据类型、数组、位运算符
数据类型Java的数据类型由基本数据类型和引用类型基本数据类型和C语言的一致,除了基本类型其余的都是引用类型。引用类型主要有:类(class)、接口(interface)、数组、枚举(enum)、注解࿰…...

麦克风分类汇总
1.麦克风分类汇总 1)按声电转换原理分为:电动式(动圈式、铝带式),电容式(直流极化式)、压电式(晶体式、陶瓷式)、以及电磁式、碳粒式、半导体式等。 2)按声场作用力分为:…...

九龙证券|机制改革激发转融券活力 全面注册制释放两融展业新空间
在全面注册制准则规矩正式发布的同时,修订后的转融通事务规矩也应约与商场碰头。2月17日,中证金融发布《中国证券金融公司转融通事务规矩(试行)(2023年修订)》等规矩(简称“转融通新规”&#x…...

6——JVM调优工具详解及调优实战
Jmap、Jstack、Jinfo命令详解 Jmap 此命令可以用来查看内存信息,实例个数,以及占用内存大小 生成dump文件 把dump文件装入Jvisvalvm进行分析 Jstack Jstack加进程id查找死锁 Jstack找出占CPU最高的线程堆栈信息 top -p 进程号:显示进程…...

AcWing语法基础课笔记 第八章 C++ STL 第九章 位运算与常用库函数
第八章 C STL 第八章 C STL 1.#include <vector> 2.#include<queue> 3.#include <stack> 4.#include <deque> 5.#include <set> 6.#include<map> 第九章 位运算与常用库函数 STL是提高C编写效率的一个利器。 ——闫…...