随笔 - 936  文章 - 0  评论 - 3  阅读 - 30万

国标GB28181协议国标视频智能分析平台EasyGBS运行过程中日志持续打印导致存量过大的问题排查

国标GB28181视频智能分析平台EasyGBS运行过程中,每个步骤都会通过日志打印来反馈运行的成功与否,正常情况下,每个步骤的日志会打印一次,如果重新建立连接或者重新开启某一步骤,则会重复打印运行情况,日志是TSINGSEE青犀视频运维团队排查问题时的一种依据。

EasyGBS国标安防视频可视化平台在运行中,我们发现日志一直在打印,导致日志过大,对服务的运行带来了阻碍,经过排查日志内容发现是一个推流地址被重复推流导致的。

随后我们排查了代码,了解到当有多个设备开启非按需直播时,重启EasyGBS后,程序会自动对摄像头进行视频流保活,但是因为传入的是通道指针所以导致,同样的通道被传入了多次,造成了同一路设备流播放多次的情况,引发日志频繁打印错误。

if start {
		if _, ok := atsMap.Load(key); !ok {
			atsMap.Store(key, true)
			go func(channelInfo *models.Channel, key string) {
				ticker := time.NewTicker(15 * time.Second)
				defer ticker.Stop()
				//先执行一次
				sipDev := Server.GetDevice(channelInfo.DeviceID)
				if sipDev != nil {
					StreamStart(sipDev, channelInfo.ToSIPChannel(), "", false, "", "", "")
				}
				for {
					select {
					case <-ticker.C:
						if _, ok := atsMap.Load(key); !ok {
							return
						}
						sipDev := Server.GetDevice(channelInfo.DeviceID)
						if sipDev != nil {
							log.Println("key===", key, "===========sipDev DeviceID===", sipDev.DeviceID)
							StreamStart(sipDev, channelInfo.ToSIPChannel(), "", false, "", "", "")
						}
					}
				}
			}(channelInfo, key)
		}

所以需要对传入参数进行只传递,不使用引用传递,参考代码如下:

func AutoTouchStream(channelInfo *models.Channel, start bool) {
	key := fmt.Sprintf("%s_%s", channelInfo.DeviceID, channelInfo.ID)
	fmt.Println("AutoTouchStream======key", key)
	if start {
		if _, ok := atsMap.Load(key); !ok {
			atsMap.Store(key, true)
			go func(channelInfo models.Channel, key string) {
				ticker := time.NewTicker(15 * time.Second)
				defer ticker.Stop()
				//先执行一次
				sipDev := Server.GetDevice(channelInfo.DeviceID)
				if sipDev != nil {
					StreamStart(sipDev, channelInfo.ToSIPChannel(), "", false, "", "", "")
				}
				for {
					select {
					case <-ticker.C:
						if _, ok := atsMap.Load(key); !ok {
							return
						}
						sipDev := Server.GetDevice(channelInfo.DeviceID)
						if sipDev != nil {
							log.Println("key===", key, "===========sipDev DeviceID===", sipDev.DeviceID)
							StreamStart(sipDev, channelInfo.ToSIPChannel(), "", false, "", "", "")
						}
					}
				}
			}(*channelInfo, key)
		}

经过验证,日志过大问题得到解决,再次打印的日志如下,情况恢复正常。

EasyGBS国标视频流媒体平台的一大特点就是支持通过GB28181协议与第三方国标平台进行级联,也能够接收TSINGSEE青犀视频平台EasyNVR的级联,如果大家对EasyGBS的级联功能或者告警功能比较感兴趣,欢迎联系我们了解,EasyGBS、EasyNVR等视频平台均提供试用版本供大家测试,欢迎咨询。

posted on   EasyGBS  阅读(123)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· 地球OL攻略 —— 某应届生求职总结
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示