OpenSIPS 2.4.2 高并发下,日志丢失怎么办

- CentOS 7.4
- Rsyslogd 8.24.0
- OpenSIPS 2.4.2
log_level=
log_stderror=no
log_facility=LOG_LOCAL0
log_name="/usr/local/opensips/sbin/opensips"
xlog_buf_size=
1.2 rsyslog.conf 自定义日志配置如下:
将设施为local0的所有级别的日志,都输出到指定文件
local0.* /var/log/opensips/opensips.log
1.3 OpenSIPS日志输出方式:
xlog("L_INFO", "[$fU->$rU] Route to user [$tu] [ci:$ci] [xcid:$hdr(X-CID)]");
- 在低并发测试场景,按上述方式使用L_INFO级别输出日志时,都能在 /var/log/opensips/opensips.log 中正常打印日志,但是在高并发(20 CPS、1500并发)下,使用L_INFO级别输出的日志,经常会丢失。
- 高并发下,opensips的日志文件,经常出现输出一次后,会等30秒才输出后续的日志。
- 高并发下 /var/log/message 文件偶尔输出提示因日志输出速率超标,而强制丢弃部分日志的信息。如下所示:
Aug :: uat16599 rsyslogd: imjournal: messages lost due to rate-limiting
Aug :: uat16599 rsyslogd: imjournal: messages lost due to rate-limiting
Aug :: uat16599 rsyslogd: imjournal: messages lost due to rate-limiting
# Turn off message reception via local log socket;
# local messages are retrieved through imjournal now.
$OmitLocalLogging on
然而Systemd Journal 默认情况下,30秒内只允许记录1000条日志文件,并且每10分钟累计最大处理20000条日志,这显然不够用啊。所以我们可以通过修改 Systemd Journal 的配置/etc/systemd/journald.conf来解决该问题。

- 方式一、去掉第一个参数“L_INFO”(将采用默认的 L_ERR级别),高压下打印也都正常
xlog("[$fU->$rU] Route to user [$tu] [ci:$ci] [xcid:$hdr(X-CID)]");
- 方式二、指定OpenSIPS的默认日志级别:xlog_default_level=3或4, 这样高并发下基本正常,偶尔依旧会丢失部分日志
xlog_default_level=
xlog("L_INFO", "[$fU->$rU] Route to user [$tu] [ci:$ci] xcid:$hdr(X-CID)]");
xlog("[$fU->$rU] Route to user [$tu] [ci:$ci] [xcid:$hdr(X-CID)]");
- 方式一、采用rsyslog同步模式处理日志【简单粗暴】
- 注释掉下面一行即可
- #$OmitLocalLogging on
- 方式二、关闭ystemd Journal的速率限制【野蛮暴力】
- 调整Systemd Journal的配置文件/etc/systemd/journald.conf
- RateLimitInterval=0
- RateLimitBurst=0
- CentOS6下:修改/etc/rsyslog.conf文件,增加下面几行(CentOS6下没有Journal)
- $SystemLogRateLimitInterval 0
- $IMUXSockRateLimitInterval 0
- 方式三、增大速率限制上限【温文尔雅】
- 调整Systemd Journal的配置文件/etc/systemd/journald.conf
- RateLimitInterval=5s (默认值30s)
- RateLimitBurst=20000 (默认值200)
- 修改/etc/rsyslog.conf文件,增加下面几行(CentOS7下可不配置下面几项,CentOS6下没有Journal,只需增加下面前两项)
- $SystemLogRateLimitInterval 5 (默认值5)
- $SystemLogRateLimitBurst 20000 (默认值200)
- $imjournalRatelimitInterval 600 (默认值600)
- $imjournalRatelimitBurst 2400000 (默认值20000)
|
参数
|
说明
|
默认值
|
| log_level | OpenSIPS输出的日志详细程度,值越大,代表输出日志越详细 | [-3, 4] |
| xlog_default_level | 是否需要将日志输出到启动OpenSIPS的控制台 | -1 |
| log_stderror | 是否需要将日志输出到启动OpenSIPS的控制台 | no |
| log_name | 以守护进程方式运行OpenSIPS时,输出日志的进程名称,如默认是启动OpenSIPS的命令名 /usr/local/opensips/sbin/opensips | argv[0] |
| log_facility | 指定使用rsyslogd 的facility 输出日志,默认会将日志输出到 /var/log/messages 文件中 | LOG_DAEMON |
| xlog_buf_size | 用于缓存单行日志的空间大小,如果待输出的日志超过该阈值,OpenSIPS将丢弃,并输出一个 buffer overflow 的错误 | 4096 |
5.2 xlog函数介绍
函数:xlog([log_level, ]format_string)
- L_ALERT (-3)
- L_CRIT (-2)
- L_ERR (-1) - 如果不填写log_level,则默认选这个
- L_WARN (1)
- L_NOTICE (2)
- L_INFO (3)
- L_DBG (4)
样例:
xlog("Received $rm from $fu (callid: $ci)\n");
xlog("L_ERR", "key $var(username) not found in cache!\n");
5.3 syslog 功能测试
- 使用下面命令,可以手动发送日志到syslog :
logger -p local1.info "hello world"
- C语言代码测试syslog : ztest_rsyslog.c
#include<stdio.h>
#include<stdlib.h>
#include <syslog.h>
#include <unistd.h> void Info(void)
{
int i;
int j;
openlog("info",LOG_PID,LOG_LOCAL1);/*注意这里的数字1要跟 /etc/rsyslog.conf中的配置一致 local1.* /home/admin/z_test_rsyslog.log */
syslog(LOG_INFO, "hello %s","info log test");
for(j = ; j < ; j++) {
for(i = ; i < ; i++ ) {
syslog(LOG_INFO|LOG_LOCAL1, "hello not execute openlog for specify progress name : %s, loop=%d, index=%d", "info log test", j, i);
syslog(LOG_ERR|LOG_LOCAL1, "hello not execute openlog for specify progress name : %s, loop=%d, index=%d", "ERROR log test", j, i);
}
sleep();
}
} void Woring(void)
{
openlog("woring",LOG_PID,LOG_LOCAL1);
syslog(LOG_WARNING, "hello %s","warning log test");
} int main()
{
Woring();
Info();
closelog();
return ;
}
编译运行:
Aug :: LPT0570 progress-name-info[]: hello info log test
Aug :: LPT0570 progress-name-woring[]: hello warning log test
Aug :: LPT0570 ztest_rsyslog_bin: hello not execute openlog for specify progress name : info log test, loop=, index=
Aug :: LPT0570 ztest_rsyslog_bin: hello not execute openlog for specify progress name : ERROR log test, loop=, index=
OpenSIPS 2.4.2 高并发下,日志丢失怎么办的更多相关文章
- 为何要打印日志?C++在高并发下如何写日志文件(附源码)?
为何要打印日志?让程序裸奔不是一件很快乐的事么? 有些BUG就像薛定谔的猫,具有波粒二象性,当你试图去观察它时它就消失了,当你不去观察它时,它又会出现.当你在测试人员面前赌咒发誓,亲自路演把程序跑一遍 ...
- 高吞吐koa日志中间件
Midlog中间件 node服务端开发中少不了日志打点,而在koa框架下的日志打点在多进程环境中日志信息往往无法对应上下文,而且在高并发下直接进行写buffer操作(内核调用writev)也会造成内存 ...
- 高并发下的 Nginx 优化与负载均衡
高并发下的 Nginx 优化 英文原文:Optimizing Nginx for High Traffic Loads 过去谈过一些关于Nginx的常见问题; 其中有一些是关于如何优化Nginx. ...
- 高并发下的Nginx优化
高并发下的Nginx优化 2014-08-08 13:30 mood Nginx 过去谈过一些关于Nginx的常见问题; 其中有一些是关于如何优化Nginx. 很多Nginx新用户是从Apach ...
- 《高并发下的.NET》第2季 - 《memcached连接暴增案》第1集:问题表现
在<.NET 5.0 背锅案>第7集-大结局之后,园子和 .NET 继续过上了幸福生活...剧情很美好,现实很残酷...现实是旧案刚结,新案立至,而且新案与旧案有关联,被迫继续拍剧,并对该 ...
- 《高并发下的.NET》第2季 - 故障公告:高并发下全线崩溃
大家好,非常抱歉,在昨天下午(12月3日)的访问高峰,园子迎来更高的并发,在这样的高并发下,突发的数据库连接故障造成博客站点全线崩溃,由此给您带来很大的麻烦,请您谅解. 最近,我们一边在忙于AWS合作 ...
- php结合redis实现高并发下的抢购、秒杀功能
抢购.秒杀是如今很常见的一个应用场景,主要需要解决的问题有两个:1 高并发对数据库产生的压力2 竞争状态下如何解决库存的正确减少("超卖"问题)对于第一个问题,已经很容易想到用缓存 ...
- 高并发下MySQL出现checking permissions
在某些数据访问层框架中,会使用show full tables from test like 'demo',来检查数据库的状态.当数据库中表的数量较少时,并没有出现严重的问题.但是当数据库中的表数量多 ...
- EF+MySQL乐观锁控制电商并发下单扣减库存,在高并发下的问题
下订单减库存的方式 现在,连农村的大姐都会用手机上淘宝购物了,相信电商对大家已经非常熟悉了,如果熟悉电商开发的同学,就知道在买家下单购买商品的时候,是需要扣减库存的,当然有2种扣减库存的方式, 一种是 ...
随机推荐
- git原理及如何选择分支模式
一.git 原理介绍 1.git的四个工作区域 Git有四个工作区域:工作目录(Working Directory).暂存区(Stage/Index).资源库(Repository或Git Direc ...
- JDK8的LocalDateTime用法
参考资料:好好学Java https://mp.weixin.qq.com/s/Dd_7yUh3lq3TqE2cjsYXvw JDK8新特性里提供了3个时间类:LocalDate.LocalTime ...
- mapstruct解放Java对象转换
摘要 当前web后端开发,都是使用多层工程结构,需要在VO,BO,DTO,DO等各种数据结构中相互转换.这些转换代码都是些比较简单的字段映射,类型转换,重复性工作比较高,可以使用一些工具解放我们的双手 ...
- java动态代理——jvm指令集基本概念和方法字节码结构的进一步探究及proxy源码分析四
前文地址 https://www.cnblogs.com/tera/p/13336627.html 本系列文章主要是博主在学习spring aop的过程中了解到其使用了java动态代理,本着究根问底的 ...
- 当面试官问我ArrayList和LinkedList哪个更占空间时,我这么答让他眼前一亮
前言 今天介绍一下Java的两个集合类,ArrayList和LinkedList,这两个集合的知识点几乎可以说面试必问的. 对于这两个集合类,相信大家都不陌生,ArrayList可以说是日常开发中用的 ...
- 迷之自信的Single_User Mode
Alter database Set Single_User 对于任何DBA来说,恐怕都不陌生.在我们需要获取数据库独占访问权来做一些数据库紧急维护的时候,这可能是大多数DBA的首选,但它真的可以实现 ...
- Qt编译出现cc1plus.exe: out of memory allocating 65536 bytes问题
今天编译Qt程序,出现这个问题: cc1plus.exe: out of memory allocating 65536 bytes 这个还没有遇到过,上网查了下.问题原因是资源文件过大. qt的资源 ...
- Docker初探之Windows篇
一.什么是Docker? Docker是一个开源的应用容器引擎,可以轻松地为任何应用创建一个轻量级.可移植.自给自足的容器.开发者在本地编译测试通过的容器可以批量地在生产环境中部署,包括虚拟机和其他平 ...
- 028_go语言中的超时处理
代码演示 package main import "fmt" import "time" func main() { c1 := make(chan strin ...
- Windows10 无法完全关闭Hyper-V导致VirtualBox 虚拟机无法启动
win10本来已经安装使用了VirtualBox. 突然心血来潮决定试试系统自带的虚拟机Hyper-V.发现并没有想象中的好用.随后在启用或关闭 Windows功能中关闭了Hyper-V. 这时我发现 ...