教你一步一步利用rsyslog搭建自己的日志系统
发布于 7 年前 作者 zy445566 15496 次浏览 最后一次编辑是 5 年前 来自 分享

rsyslog是什么

rsyslog 是一个syslog的升级版,可用于处理大型的系统的日志需求。并且可以把输入到日志转换到各个数据系统上,如图。 rsyslog

教程开始

本教材使用centos系统,其他系统只能作为参考作用

如何安装

一般来说centos都自带了rsyslog,当然你也可以通过源码包来安装 源码包下载地址:http://www.rsyslog.com/downloads/download-v8-stable/ 或使用

sudo yum install rsyslog

这里就不再赘述,相信这一步很快能度过

如何开启我们的rsyslog远程服务

由于我们要远程写入日志,所以我们要打开支持远程的连接,使用vim打开文件

sudo vim /etc/rsyslog.conf

并将以下注释打开

# Provides UDP syslog reception
$ModLoad imudp #打开udp模块
$UDPServerRun 514 #打开udp服务,并监听514端口
# Provides TCP syslog reception
$ModLoad imtcp #打开tcp模块
$InputTCPServerRun 514 #打开tcp服务,并监听514端口

然后重启我们的服务

sudo service rsyslog restart

如何使用我们的node进行连接来写入日志

其实这一步很简单,根据上面开启的服务,直接使用原生的socket即可 直接上代码

const net = require('net');
function writeLog(port,host,logInfo)
    {
        var client = new net.Socket();
        return new Promise((resolve,reject)=>{
            client.connect(port, host, () => {
                client.end(logInfo);
                client.destroy();
                resolve(true);
            });
            client.once('error', (err) => {
                console.log(err);
                reject(err);
            });
        });
       
    }
writeLog(514,'127.0.0.1','hello!rsyslog!');

这时我们如何查看信息呢?很简单,默认是在/var/log/message文件中

tail -f /var/log/message

我们应该可以在末端看到“hello!rsyslog!” 但所有文件都在message,我存其他地方行不行? 这就要涉及rsyslog规则了

如何使用rsyslog规则

在配置文件/etc/rsyslog.conf里面,我们能看到默认规则

#### RULES ####

# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.*                                                 /dev/console

# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none                /var/log/messages

# The authpriv file has restricted access.
authpriv.*                                              /var/log/secure

# Log all the mail messages in one place.
mail.*                                                  -/var/log/maillog


# Log cron stuff
cron.*                                                  /var/log/cron

# Everybody gets emergency messages
*.emerg                                                 :omusrmsg:*

# Save news errors of level crit and higher in a special file.
uucp,news.crit                                          /var/log/spooler

# Save boot messages also to boot.log
local7.*                                                /var/log/boot.log

为什么我们会访问/var/log/messages,这里很明显, 所有info数据类型都会进入/var/log/messages文件中 这里就要说明Facility(设备)和Severity(日志等级)了 比如我在/etc/rsyslog.conf增加以下代码

local1.info   /var/log/local1.info.log #别忘了增加配置要重启服务哦
# 这里的Facility就是local1,Severity就是info

Facility和Severity有以下几种

Facility:有0-23种设备
0 kernel messages 
1 user-level messages 
2 mail system 
3 system daemons 
4 security/authorization messages 
5 messages generated internally by syslogd 
6 line printer subsystem 
7 network news subsystem 
8 UUCP subsystem 
9 clock daemon 
10 security/authorization messages 
11 FTP daemon 
12 NTP subsystem 
13 log audit 
14 log alert 
15 clock daemon 
16-23     local0 - local7

Severity:日志等级

0 Emergency
1 Alert
2 Critical
3 Error
4 Warning
5 Notice
6 Informational
7 Debug

问题又来了,我们应该如何写入进local1.info的local1.info.log文件中呢?

这里就涉及到syslog的日志协议了,如图 syslog-stant 比如我们要发送到local1.info中

writeLog(514,'127.0.0.1','<142>Jul 26 21:02:30 127.0.0.1 myApp[0]: hello!local1.info!');

那我们来拆解着一段

PRI:

那你<142>怎么来的呢? 因为local1.info对应的Facility是17,Severity是6 而PRI计算规则是Facility乘8+6即是17乘8+6=142

TIME:

Jul 26 21:02:30 就是时间

IP或主机名

127.0.0.1 就是ip,你也可以填写你的主机名如 zsComputer

程序名和错误编号

myApp[0]: 这里myApp就是我们的应用名称(后面可以根据这个做日志拆分),0代表的是该应用的错误编码,如果是错误则大于0

我们要发送的消息

hello!local1.info!

接下来我们进去查看信息是否进入

tail -f /var/log/local1.info.log

这时你应该会看到以下信息在/var/log/local1.info.log文件中

Jul 26 21:02:30 127.0.0.1 hello!local1.info!

当然规则也有高级用法比如按应用名创建

$template myFormat,"/var/log/%programname%/%$year%%$month%%$day%.log"
*.* -?myFormat #本机测试使用
#fromhost-ip, !isequal, "127.0.0.1" ?myFormat #实际线上格式
#这里会创建myApp目录并根据年月日生成日志

可使用变量如下

msg,rawmsg,hostname,source,fromhost,fromhost-ip,syslogtag,programname,pri-text,iut,syslogfacility,syslogfacility-text,syslogseverity,syslogseverity-text,syslogpriority,syslogpriority-text,timegenerated,timereported,timestamp,protocol-version,structured-data,app-name,procid,msgid,inputname

系统常量

$bom,$now,$year,$month,$day,$hour,$hhour,$qhour,$minute,$myhostname

简单的rsyslog教程结束

10 回复

不错,晚点试下

干货总是没人鸟,非要取高大上名字才行。 难道就没有需要搭建专门的 远程日志服务器 吗? 没有自己的日志仓库,集群的的日志,难道每台机器去找?

@enternoder 其实我这个有问题, 我这个node用的是TCP协议 建议你用udp协议 https://nodejs.org/api/dgram.html 性能高很多,本来打算下节讲的,但估计星凑不齐,就当给你福利了 udp服务已经开启了,只要改node代码就行

我们似乎 elk 用的比较多

来自酷炫的 CNodeMD

先赞一个

来自酷炫的 CNodeMD

@hyj1991 nonono,rsyslog是可以配合其它日志系统的,也可以配合elk。rsyslog目前应该属于很多日志系统的基本配置吧,因为centos默认的日志系统也是它。如果elk没配合rsyslog,估计是你这边只要应用级的日志,而系统级日志及状态要求不高吧。网上应该也有elk结合rsyslog的使用。

来自酷炫的 CNodeMD

@zy445566 系统日志监控走 zabbix,elk 采集规整查看应用详细日志,open-falcon+grafana 做状态趋势图

@zy445566 哈哈哈,已赞,坐等更新

回到顶部