【工作笔记】syslog,kern.log大量写入invalid cookie错误信息问题

news2025/2/27 8:34:06

任务描述

错误出现出现过四五次,应该是诊断单元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" ]];
then
    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
    supervisorctl restart MotorServer
    echo "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);//这句返回的只是一个时间cuo
	tm* 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"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/361439.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

将maven项目打包成可执行的jar(加入外部依赖)

在有些场景下我们需要将编写的Java工程编译打包成为一个完整的jar包&#xff0c;如果你的项目是使用maven构建的话可以通过以下方法来完成这个打包的过程。添加maven打包插件。在项目的pom.xml配置文件的build标签中添加以下代码&#xff0c;其中 mainClass 属性需要替换成你项…

多种调度模式下的光储电站经济性最优储能容量配置分析(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

安装MQTT Server遇到报错“cannot verify mosquitto.org‘s certificate”,该如何解决?

MQTT是基于发布/订阅的轻量级即时通讯协议&#xff0c;很适合用于低带宽、不稳定的网络中进行远程传感器和控制设备通讯等操作中。在我们的软件研发中&#xff0c;也经常使用MQTT协议进行消息通信等。今天来和大家分享一些关于在安装MQTT Server中遇到的疑难问题及解决思路。当…

为什么阳康后,感觉自己变傻了?

不少人在阳康后出现脑力下降的情况&#xff0c;好像脑子里被雾笼罩。脑雾并不是新名词&#xff0c;已经存在了十几年。以前慢性疲劳综合征患者和脑震荡患者会用它来形容自己的症状。脑雾其实是认知障碍&#xff0c;它可由多种原因引起。比如过度劳累、长期酗酒、缺乏睡眠、久坐…

Semi-supervised(半监督)布料缺陷检测实战

数据及源码链接见文末 1.任务目标和流程概述 对于常规的缺陷检测,常常需要我们准备好数据,使用分割或者检测的方法选择模型,进行训练。但是有一个问题。在日常生产中,我们接触到的往往都是正常的,缺陷数据往往很难收集,更何况我们还要打标签。我们能不能通过训练正常数据…

独立搭建 handle server

本节主要介绍,如何搭建一个与 GHR隔离的 handle sever,不与外界有任何连通。 下载文件 访问地址下载最新版:http://www.handle.net/download_hnr.html 这里以 9.3.0 版本作为讲解 解压服务端,解压客户端 # 解压 tar -xzvf handle-9.3.0-distribution.tar.gz# 到目录下 …

NestJS学习:图片上传、下载

参考 大神的这两篇文章讲的很详细&#xff0c;这里自己也来试一下 小满nestjs&#xff08;第十三章 nestjs 上传图片-静态目录&#xff09; 小满nestjs&#xff08;第十四章 nestjs 下载图片&#xff09; 上传图片 安装包 需要&#xff1a;multer 和 nestjs/platform-expre…

深入理解Java的Lambda原理

1、前言 Lambda函数的概念其实有很久远的历史了&#xff0c;在Lisa&#xff0c;C#中早有实现。且近年来&#xff0c;开发者对语言的表现力有了更高的要求&#xff0c;Java也在JDK 1.8 中引入了Lambda函数这一概念。虽然截止到写下这段文字的一刻已经过去七年之久&#xff0c;但…

Mybatis框架详解(全)

目录 MyBatis简介 MyBatis整体架构及运行流程 1.数据源配置文件 2.Sql映射文件 3.会话工厂与会话 4.运行流程 mybatis实现增删改查 Mybatis的获取参数的方式 mapper中自定义映射 mybatis注解开发 mybatis缓存 mybatis分页插件 MyBatis简介 MyBatis 是一款优秀的持久…

程序员如何向架构师转型?看完就明白该怎么做了

软件行业技术开发从业人员众多&#xff0c;但具备若干年开发经验的普通的开发人员往往面临个人发展的瓶颈&#xff0c;即如何从普通开发人员转型成高层次的系统架构师和技术管理人员。想成为一名架构师&#xff0c;应当具备全面的知识体系&#xff0c;需要进行系统的学习和实践…

数组(一)-- LeetCode[26][80] 删除有序数组中的重复元素

1 删除有序数组中的重复项 1.1 题目描述 给你一个 升序排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次&#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。 由于在某些语言中不能改变数组的长度&#xff0c…

FreeRTOS与UCOSIII任务状态对比

FreeRTOS任务状态 1、运行态 正在运行的任务&#xff0c;正在使用处理器的任务。 单核处理器中任何时候都有且只有一个任务处于运行态。 2、就绪态 已经准备就绪&#xff08;非阻塞或挂起&#xff09;&#xff0c;可以立即运行但还没有运行的任务。 正在等待比自己高优先级…

Kafka——消息队列学习总结

定义 Kafka是一个分布式的基于发布/订阅模式的消息队列&#xff08;MQ)&#xff0c;主要应用于大数据实时处理领域。 模式 点对点模式 一对一&#xff0c;消费者主动拉取数据&#xff0c;消费收到后消息清除。 发布/订阅模式 一对多&#xff0c;消费者消费数据后不会清除消息…

JavaScript:使用for in不是一个很好的抉择

for in 如果让你遍历对象中的key和value&#xff0c;你第一个想到的一定是使用for in const o{name:"chengqige",age:23 } for (let key in o){console.log(key,o[key]); }看起来是没有问题的&#xff0c;但是如果我在下面加一行代码&#xff0c;输出的结果就可能让…

JUC并发编程——进程与线程

目录一、进程和线程的概念1.1 进程1.2 线程1.3 进程与线程对比二、并行和并发的概念三、线程基本应用3.1 多线程应用——异步调用一、进程和线程的概念 1.1 进程 ● 程序由指令和数据组成&#xff0c;但这些指令要运行&#xff0c;数据要读写&#xff0c;就必须将指令加载至 …

内容生态与新业务双突破,汽车之家反转逻辑将延续

2022年&#xff0c;疫情对汽车市场的影响不容忽视。但从财报来看&#xff0c;汽车之家在宏观压力下仍实现了有力的V型反转。 北京时间2月16日美股盘前&#xff0c;汽车之家发布2022Q4及全年财报。财报显示&#xff0c;其四季度实现总营收18.93亿元&#xff0c;同比增长11.8%。…

java并发笔记

文章目录HashMapput方法resize方法ConcurrentHashMapput方法initTable方法sizectl代表什么&#xff1a;扩容计数器ConcurrentHashMap的读操作会阻塞嘛AQS唤醒线程时&#xff0c;AQS为什么从后往前遍历&#xff1f;AQS为什么要有一个虚拟的head节点AQS为什么用双向链表&#xff…

无线网络渗透测试系列学习(一) - 在Windows系统下使用虚拟机安装Kali Linux操作系统

目录 引言&#xff1a; 过程&#xff1a; 配置以及安装VMware虚拟机&#xff1a; 下载Kali Linux的镜像文件&#xff1a; 在虚拟机中打开Kali Linux并执行安装&#xff1a; 配置Kali Linux操作系统&#xff1a; 调整Kal Linux中的时区&#xff1a; 重新设定管理员root的…

Sketch+摹客,100M文件上传最快47s

哈喽&#xff0c;小摹来啦~ 去年12月底&#xff0c;摹客Sketch插件上新了「规范检查工具」&#xff0c;自功能上线以来&#xff0c;小摹收到了许多的好评及赞扬。 虽好评如潮&#xff0c;但我们不会止步不前&#xff0c;将持续攻克难点&#xff0c;旨在为大家提供更加稳定高效…

考公和大厂40万年薪的offer,选哪个?

眼看毕业将至&#xff0c;相信很多小伙伴已经摩拳擦掌&#xff0c;在为毕业季就业做准备了。2023年高校毕业生规模预计1158万人&#xff0c;同比增加82万人。在资深人力资源服务家汪张明看来&#xff0c;2023年的就业态势不仅是大学毕业生数量有增加&#xff0c;还存在一定的存…