参考资料
https://blog.youkuaiyun.com/xianjie0318/article/details/72920400
https://blog.youkuaiyun.com/myloveqingmu/article/details/53501987
在此基础上测试;
1、linux syslog
Linux系统拥有非常灵活和强大的日志功能,可以保存几乎所有的操作记录,并可以从中检索出我们需要的信息。
大部分Linux发行版默认的日志守护进程为 syslog(后续升级rsyslog),位于 /etc/syslog 或 /etc/syslogd,默认配置文件为 /etc/syslog.conf,任何希望生成日志的程序都可以向 syslog 发送信息。
syslog 是一个系统日志记录程序,在早期的大部分 Linux 发行版都是内置 syslog,让其作为系统的默认日志收集工具,后来被 rsyslog 所代替了,较新的Ubuntu、Fedora 等等都是默认使用 rsyslog 作为系统的日志收集工具。
rsyslog的全称是 rocket-fast system for log,它提供了高性能,高安全功能和模块化设计。rsyslog能够接受从各种各样的来源,将其输入,输出的结果到不同的目的地。rsyslog可以提供超过每秒一百万条消息给目标文件。
2、rsyslog配置
1)rsyslog版本
[root@localhost Desktop]# rsyslogd -version
rsyslogd 5.8.10, compiled with:
FEATURE_REGEXP: Yes
FEATURE_LARGEFILE: No
GSSAPI Kerberos 5 support: Yes
FEATURE_DEBUG (debug build, slow code): No
32bit Atomic operations supported: Yes
64bit Atomic operations supported: Yes
Runtime Instrumentation (slow code): No
See http://www.rsyslog.com for more information.
2)rsyslog配置文件
配置文件分为三部分,#### MODULES ####,#### GLOBAL DIRECTIVES ####,和#### RULES ####
#### MODULES ####主要针对接收做配置
#### GLOBAL DIRECTIVES ####主要全局配置,比如日志格式等
#### RULES ####主要配置哪些日志写入哪些文件
3、syslog系统函数
void openlog(const char *ident, int option, int facility);
void syslog(int priority, const char *format, ...);
void closelog(void);
openlog函数(打开日志设备) :
ident - 标记,添加到每行日志前,通常用当前程序名。
option - 选项,常用值为LOG_PID即包含每个消息的PID,更详细信息参考man syslog。
facility - 记录日志的程序的类型,配置文件可根据不同的登录类型来区别处理消息,常用值LOG_DAEMON即其它系统守护进程,一般为自己创建的守护进程。更详细信息参考man syslog。
syslog函数(生成日志) :
priority - 优先级,说明消息的重要性,可取值如下:
LOG_EMERG 系统不可用
LOG_ALERT 消息需立即处理
LOG_CRIT 重要情况
LOG_ERR 错误
LOG_WARNING 警告
LOG_NOTICE 正常情况,但较为重要
LOG_INFO 信息
LOG_DEBUG 调试信息
closelog函数(关闭日志设备)。
3、具体实例
1)环境
A,B两台服务器,A产生log并发送到syslog服务器,B作为syslog接收服务器;
2)A服务器配置
2.1)产生log的程序代码
include <syslog.h>
int main(int argc, char **argv)
{
int k = 0;
openlog("HHHH", LOG_PID, LOG_USER);
for (k = 0; k < 100000; k++)
{
syslog(LOG_INFO, "informational message %d", k);
}
closelog();
return 0;
}
syslog类型填写user,syslog级别填写info;
2.2)rsyslog.conf配置
#### MODULES ####不需要修改
#### GLOBAL DIRECTIVES ####不需要修改
#### RULES ####
默认任何类型的info级别以上的log都会记录到/var/log/messages文件中
*.info;mail.none;authpriv.none;cron.none /var/log/messages
去掉注释,修改syslog服务器的ip,@@表示使用tcp,默认端口514
# ### begin forwarding rule ###
# The statement between the begin ... end define a SINGLE forwarding
# rule. They belong together, do NOT split them. If you create multiple
# forwarding rules, duplicate the whole block!
# Remote Logging (we use TCP for reliable delivery)
#
# An on-disk queue is created for this action. If the remote host is
# down, messages are spooled to disk and sent when it is up again.
$WorkDirectory /var/lib/rsyslog # where to place spool files
$ActionQueueFileName fwdRule1 # unique name prefix for spool files
$ActionQueueMaxDiskSpace 1g # 1gb space limit (use as much as possible)
$ActionQueueSaveOnShutdown on # save messages to disk on shutdown
$ActionQueueType LinkedList # run asynchronously
$ActionResumeRetryCount -1 # infinite retries if host is down
# remote host is: name/ip:port, e.g. 192.168.0.1:514, port optional
*.* @@192.168.1.113:514
# ### end of the forwarding rule ###
3)B服务器配置
3.1)rsyslog.conf配置
#### MODULES ####作为接收服务器,需要去掉tcp或者udp的注释,此例中使用tcp接收
# Provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514
#### GLOBAL DIRECTIVES ####不需要修改
#### RULES ####可以不修改
默认任何类型的info级别以上的log都会记录到/var/log/messages文件中
*.info;mail.none;authpriv.none;cron.none /var/log/messages
3.2)防火墙配置,放开tcp 514端口
4)测试
4.1)重启A,B服务器的rsyslog服务;
4.2)启动A服务器产生log的程序,在B服务器上查看/var/log/messages文件,可以看到A服务器产生的log
4.3)存在的问题
4.3.1)当log数量超过200,就会产生如下错误,原因是rsyslog默认有限速配置;
May 30 15:29:04 localhost rsyslogd-2177: imuxsock begins to drop messages from pid 62456 due to rate-limiting
rsyslog的默认配置是5秒日志数量不超过200条,如下
$SystemLogRateLimitInterval 5
$SystemLogRateLimitBurst 200
想要不限速,可以在A服务器的rsyslog.conf中添加或者修改为:
$SystemLogRateLimitInterval 0
4.3.2)A服务器产生的log在A服务器的/var/log/messages也会记录一份,冗余;
如果想去掉,修改A服务器的rsyslog.conf,添加user.none,不记录user的日志
*.info;mail.none;authpriv.none;cron.none;user.none /var/log/messages
4.3.3)A服务器产生的所有log都会发送到B服务器的/var/log/messages;
修改A服务器的rsyslog.conf中转发规则,只有user.info级别以上的log发送到syslog服务器;
user.info @@192.168.1.113:514