windows如何 启动 rsync服务器
目录:
《syslog之一:Linux syslog日志系统详解》
《syslog之二:syslog协议及rsyslog服务全解析》
《syslog之三:建立Windows下面的syslog日志服务器》
《Linux下dmesg命令处理故障和收集系统信息的7种用法》
背景:需求来自于一个客户想将服务器的日志转发到自己的日志服务器上,所以希望我们能提供这个转发的功能,同时还要满足syslog协议。
一、什么是syslog协议
1、介绍(略)
2、syslog标准协议如下图
这里的facility为模块,serverity为等级,由这两个信息共同计算出一个PRI头部。HEADER部分包含了时间和主机名。在HEADER和MSG之间有一个空格,MSG是需要记录的日志部分(日志消息体)。
这里也就是说,理论上使用这种格式构造的字符串发送,接收方就能解析出来。实际上根据实验,我使用了UDP发送,接收方syslog日志服务器能正确解析。
这里需要注意的是,如果使用了程序的库,比如:python的syslog库(同样c++也有相似的库),那么就不再需要关注PRI和HEADER部分,只要将相关的参数(facility,severity,time,ip)传入函数,调用发送就可以,不必自己构造字符串。对服务端来说,接收到的是整个消息,但通常来讲,比如使用linux默认的rsyslog作为接收服务端的话,是不能看到除MSG之外的部分。所看到的消息跟接收端配置有关,这个在下面有具体的讲。
3、以下是各级别及对应的数字代码
Facility:有0-23种设备可选,在python的syslog库中有一部分缺失
Severity:日志等级
这里结合等级再详细讲一下syslog协议:
Priority(优先级) = facility * 8 + severity值。比如说,一个核心信息(facility=0)和一个Emergency的severity将会产生优先级为0。同样, 一个“local use 4”信息(facility=20)和一个Notice的severity(severity=5)将会产生165的优先级。
标题(HEADER)部分由称为TIMESTAMP和HOSTNAME的两个域组成,PRI结尾的“>”会马上跟着一个 TIMESTAMP,任何一个TIMESTAMP或者HOSTNAME域后面都必须跟着一个空格字符。HOSTNAME包含主机的名称,若无主机名或无法 识别则显示IP地址。如果一个主机有多个IP地址,它通常会使用它传送信息的那个IP地址。TIMESTAMP是本机时间,采用的格式是“Mmm dd hh:mm:ss”表示月日时分秒。HOSTNAME域仅仅能够包括主机名称,Ipv4地址或者是信息产生者的Ipv6地址。
MSG部分是Syslog数据包剩下的部分。这通常包含了产生信息进程的额外信息,以及信息的文本部分。MSG部分有两个域,分别为TAG域和 CONTENT域,TAG域的值是产生信息的程序或者进程的名称,CONTENT包含了这个信息的详细内容。传统上来说,这个域的格式较为自由,并且给出 一些时间的具体信息。TAG是一个不许超过32个字符的字母数字字符串,任何一个非字母数字字符都将会终止TAG域,并且被假设是CONTENT域的开 始。在大多数情况下,表示TAG结束的CONTENT域的第一个字符用左大括号( [ ],分号( : )或者是空格来表示。
下面是一个使用socket实现syslog日志的py脚本,大家可以参考,加深理解syslog协议
https:///ucookie/anytools/blob/master/usyslog/usyslog.py
4、Syslog库
以python的库为例:
openlog(ident[, logopt[, facility]])
LOG_PID, LOG_CONS, LOG_NDELAY, LOG_NOWAIT and LOG_PERROR),对应的分别是(包括每个消息PID,直接写入系统控制台,立即打开连接,不等待子进程(因为其有可能在记录消息的时候就被创建了,GNU C库不创建子进程,所以该选项在Linux上没有影响),同时输出到stderr)。facility则是模块参数,需要填入对应的值,这里syslog库中有以下参数使用:
LOG_KERN, LOG_USER, LOG_MAIL, LOG_DAEMON, LOG_AUTH, LOG_LPR LOG_NEWS, LOG_UUCP, LOG_CRON and LOG_LOCAL0 to LOG_LOCAL7
通常来说,openlog需要在模块最开始指定,即限定了这个模块内都是一个facility的日志。
syslog([sevirity], msg):
这个是具体打印日志的函数,第一个参数指定消息的级别,第二个参数为日志内容。
sevirity对应的参数为:
LOG_EMERG, LOG_ALERT, LOG_CRIT, LOG_ERR, LOG_WARNING, <br data - filtered = "filtered" >LOG_NOTICE, LOG_INFO, LOG_DEBUG.
closelog():
这个是关闭的功能,不过多解释了。
5、说明部分
python的syslog库打印日志是依赖了rsyslog服务,具体的转发规则,记录文件等在rsyslog.conf中配置
二、了解rsyslog服务
1、rsyslog介绍(略)
2、rsyslog配置文件
配置文件/etc/rsyslog.conf大概分为三个部分
#MODULES
这个部分是针对接收配置的,主要是指定接收日志的协议和端口。若要配置日志服务器,则需要将相应的配置项去掉注释。
#GLOBAL DIRECTIVES
这个部分主要用来配置模板,模板的作用是指定你希望在日志文件中保存的日志格式。
默认配置为:
# Use default timestamp format $ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
这里列举一个模板,将所有信息保存:
# 这里第一行(为了方便显示,参数写成了一列)是模板,即日志服务器记录到日志文件的格式 # 第二行是指定需要使用的模板myFormat,这个名字可以自己定义 $template myFormat," % TIMESTAMP % host = % HOSTNAME % , relayHost = % FROMHOST % , tag = % syslogtag % , programName = % programname % , procid = % PROCID % , facility = % syslogfacility - text % , sev = % syslogseverity - text % , appName = % APP - NAME % , msg = % msg % \n" $ActionFileDefaultTemplate myFormat
模板额外说明:
#在rsyslog7 和更高版本使用以下格式: template(name = "scalaLogFormat" type = "list" ) { property (name = "timestamp" dateFormat = "rfc3339" ) constant(value = " host=" ) property (name = "hostname" ) constant(value = ", relayHost=" ) property (name = "fromhost" ) constant(value = ", tag=" ) property (name = "syslogtag" ) constant(value = ", programName=" ) property (name = "programname" ) constant(value = ", procid=" ) property (name = "procid" ) constant(value = ", facility=" ) property (name = "syslogfacility-text" ) constant(value = ", sev=" ) property (name = "syslogseverity-text" ) constant(value = ", appName=" ) property (name = "app-name" ) constant(value = ", msg=" ) property (name = "msg" ) constant(value = "\n" ) }
### begin forwarding rule
这个模块主要讲一下转发
#*.* @@remote-host:514
根据这个实例可以看出,分为4个部分[模块.等级] [转发协议][日志服务器地址]:[日志服务器端口],其中转发协议的参数@@为TCP协议,对应的接收端也需要配置接受TCP协议。@为UDP协议。
注:使用TCP协议,若地址错误或不能连同的情况,转发的协议会写入缓存,但是不用担心会卡死服务器,当到达一定限度后会自动转存到硬盘,这个不是我们应该关心的部分,使用就好了。
说明:
针对rsyslog.conf配置文件的所有操作都需要重启服务生效(service rsyslog restart)
在新版本的rsyslog中,对日志发送有默认限速,如果有集中大量推送日志的情况,需要在配置文件中加上参数$SystemLogRateLimitInterval 0(具体位置没有影响,但通常写在GLOBAL DIRECTIVES模块)
通常来说,日志推送到服务器的协议使用UDP
三、实例演示转发日志模块
1、python库实现
这个具体查看官方文档吧
2、使用TCP/UDP通信,自己构造syslog消息发送
首先了解syslog协议,及接受的方式,自己使用网络编程实现转发日志变成了可能,下面介绍syslog接受原理
接受端服务器收到发送给它的syslog数据包,它将检查它的有效PRI。如果第一次字符不是一个“<”,或者第三、第四或者第五不是一个 “>”,接收端将认为数据包没有包含有效的PRI。接着检查在标题部分的有效TIMESTAMP,从这些规则中,信息的接收一般有三个情况,下面给 出了这三个情况的通常属性,并列举了随后在这篇中什么地方会描写这些情况。
有效的PRI and TIMESTAMP:在数据包中发现一个有效的PRI和TIMESTAMP,那么会接着检查数据包的内部配置,接收端必须根据数据包的优先级来还原,或者 在不对数据包做任何变化的情况下将它转发出去。这里要注意到的是接受端没有必要确认TIMSTIMP里面的时间,同时接收端也没有必要确认 HOSTANME的值和发送信息设备的主机名或者IP地址一致。
有效的 PRI,但没有TIMESTAMP 或者TIMESTAMP无效:要是在数据包中发现一个有效的TIMESTAMP,那么必须马上添加一个TIMESTAMP和一个空格字符在PRI部分的结 尾的方括号内,它还必须添加一个HOSTNAME和空格字符在TIMESTAMP后面,接收到的信息包剩下的部分必须被当曾MSG的CONTENT域并附 加上,由于无法识别产生信息的设备所发出的进程,TAG的值无法被识别出来, 所以不会包含再里面。TIMESTAMP将会是接收端的本地时间,HOSTNAME是设备的名称,它被中继器所识别。如果名字如能被决定, 设备的IP地址将被使用到。要是中继器添加一个TIMESTAMP(或者同时添加TIMESTAMP和HOSTNAME)在PRI后面, 然后检 查是否数据包的总体长度仍然小于或等于1024个字节。如果数据包被扩展超过1024个比特, 中继器必须截去一部分数据包数据使它到达到1024比特。这将会导致原始数据包结尾部分重要信息的丢失. 所以,这就是产生的syslog数据包的PRI和HEADER部分包含在4.3节所记录的值和域之中的缘故。
没有 PRI or 或者 PRI无法识别:如果收不到PRI或者PRI不可识别,除了必须插入一个优先级为13的PRI和我们在上面描述的TIMESTAMP,还必须插入一个 HOSTNAME。被接收到的数据包的全部内容将被认为是被传递的MSG的CONTENT并被添加在后面。一个不可识别的PRI的例子就是“< 00>”,这也许是一个信息的前4个字符。如果接收到这样的syslog信息,那么它的优先级将被中继器或收集者改为13,并且加入 TIMESTAMP。具体如下:
原来接收到的信息
<00>...
被传递或识别的信息
<13>TIMESTAMP HOSTNAME <00>...
如果中继器添加一个TIMESTAMP(或者同时添加一个TIMESTAMP和HOSTNAME)在PRI后面, 那么它将检查这个数据包的总体长度是否等于或者小于1024个比特。
在UNIX文件系统里头,syslog设备依据两个重要的文件:syslogd(守护进程)和syslog.conf配置文件。习惯上,多数syslog 信息被写到/var/adm或/var/log目录下的信息文件中(syslog或messages.*)。一个典型的syslog纪录包括生成程序的名 字和一个文本信息。它还包括一个设备和一个优先级范围(但不在日志中出现)。Syslog.conf的格式比较复杂,大家可以参考一下有关书籍(或者在主 机上man syslog.conf),主要是如下语句形式: facility、level、action。Facility代表各种服务,level代表syslog的认证级别,action代表的是针对前面信息 的处理动作。Action字段如果是@loghos(主机名或具体IP),则把信息发送到loghost,而不是本地的 /var/adm/messages。
所以根据以上规则就可以实现,这里给一个偷懒的可使用python代码
https:///ucookie/anytools/blob/master/usyslog.py
简单介绍下这个模块代码,主要分为三个部分:获取日志,处理日志,发送日志。其中获取日志,是从/var/log/app目录下定期获取日志,由于实际情况中,会出现日志转存到情况,如果只是单纯的从一个文件读取,在这个过程中日志被转存了等情况,程序是不能知道的,会造成混乱。第二部分处理日志可以选用(这里是由于用户需求不明确导致了这个模块产生,实际上是不必要的),第三部分是这一节想讲的,使用的是UDP发送,只要构造了正确规范的字符串发送,syslog日志服务器就能解析。
在使用rsync时候出现rsync: Failed to exec ssh解决方法rsync chroot failed
rsync在windows与windows服务器之间的同步设置windows rsync服务器
Windows 10 rsync客户端 windows rsync服务器
windows rsync工具 windows rsync服务器
Windows平台rsync实现 windows rsync服务器
windows rsync客户端 windows rsync服务器
rsync windows 客户端 windows rsync服务器
windows 系统下 rsync 工具 windows rsync服务器