Syslog(System Logging Protocol)是一种用于计算机系统日志记录的标准协议。它允许设备(如服务器、路由器、防火墙等)将事件消息发送到指定的日志收集服务器,以便集中管理和分析。通过使用Syslog,您可以跟踪您的网络中的活动并在出现问题时快速识别和解决问题。
要将告警日志发送到某台机器的某个端口,您需要在发送端(产生日志的设备)和接收端(日志收集服务器)上配置Syslog。以下是详细方案:
这里我们以rsyslog为例,rsyslog是Linux系统上常用的Syslog服务器。如果您使用的是Windows系统,可以考虑使用Kiwi Syslog Server或其他适用于Windows的Syslog服务器。
(1)安装rsyslog:
对于大多数Linux发行版,rsyslog已经是默认安装的。如果没有,可以使用以下命令安装:
sudo apt-get update
sudo apt-get install rsyslog
sudo yum install rsyslog
(2)配置rsyslog以接收远程日志:
编辑rsyslog配置文件(通常位于/etc/rsyslog.conf
):
sudo nano /etc/rsyslog.conf
取消以下行的注释以启用UDP和/或TCP日志接收:
module(load="imudp")
input(type="imudp" port="514")
module(load="imtcp")
input(type="imtcp" port="514")
保存并退出。
(3)重启rsyslog服务:
sudo systemctl restart rsyslog
这里以Linux系统为例,配置rsyslog将告警日志发送到远程服务器。
(1)编辑rsyslog配置文件:
sudo nano /etc/rsyslog.conf
(2)添加以下行以将告警日志发送到远程服务器:
*.alert @remote_server_IP:514
请将remote_server_IP
替换为实际的Syslog服务器IP地址。*.alert
表示发送所有告警级别的日志。@
表示使用UDP协议,如果要使用TCP协议,请使用@@
。
(3)重启rsyslog服务:
sudo systemctl restart rsyslog
现在,您的发送端设备将告警日志发送到指定的Syslog服务器和端口。您可以在Syslog服务器上查看和分析这些日志。
如果您的设备不是Linux系统,您需要查找针对该设备的Syslog配置方法。通常,您可以在设备的管理界面或配置文件中找到相应的设置。
在发送端发送指定的日志:
首先,您需要确定要发送的日志文件的路径。例如,假设您要发送的日志文件位于/var/log/myapp.log
。
编辑rsyslog配置文件:
sudo nano /etc/rsyslog.conf
$ModLoad imfile
$InputFileName /var/log/myapp.log
$InputFileTag myapp:
$InputFileStateFile myapp_state
$InputFileSeverity info
$InputRunFileMonitor
if $programname == 'myapp' then @remote_server_IP:514
请将remote_server_IP
替换为实际的Syslog服务器IP地址。@
表示使用UDP协议,如果要使用TCP协议,请使用@@
。
这段配置是将发送端的指定日志文件(/var/log/myapp.log
)通过rsyslog发送到远程Syslog服务器。下面是每行配置的解释:
$ModLoad imfile
:加载imfile
模块,该模块用于从文件中读取日志。$InputFileName /var/log/myapp.log
:指定要读取的日志文件路径(/var/log/myapp.log
)。$InputFileTag myapp:
:为从该日志文件读取的消息添加一个标签(myapp
)。$InputFileStateFile myapp_state
:指定状态文件(myapp_state
),用于记录文件读取的位置,以防rsyslog重启时能从上次读取的位置继续读取。$InputFileSeverity info
:指定读取的日志消息的默认严重级别(info
)。$InputRunFileMonitor
:启动文件监视器,以便实时读取日志文件的新消息。if $programname == 'myapp' then @remote_server_IP:514
:如果消息的标签(programname
)等于myapp
,则将消息发送到远程Syslog服务器的指定IP地址和端口。请将remote_server_IP
替换为实际的Syslog服务器IP地址。@
表示使用UDP协议,如果要使用TCP协议,请使用@@
。将此配置添加到发送端设备的/etc/rsyslog.conf
文件中,然后重启rsyslog服务,即可将指定日志文件发送到远程Syslog服务器。
sudo systemctl restart rsyslog
现在,发送端将指定的日志文件/var/log/myapp.log
发送到远程服务器。
在接收端查看日志:
/var/log
目录下。您可以在/etc/rsyslog.conf
配置文件中找到具体的日志存储路径。例如,以下配置表示将接收到的日志存储在/var/log/remote
目录下:$template RemoteLogs,"/var/log/remote/%HOSTNAME%/%PROGRAMNAME%.log"
*.* ?RemoteLogs
cat
、tail
、less
等命令查看日志文件。例如,查看名为myapp.log
的日志文件:cat /var/log/remote/sender_hostname/myapp.log
请将sender_hostname
替换为发送端设备的主机名。
Logstash是一个开源的数据收集、处理和转发工具,它可以轻松地从各种来源接收日志数据,对其进行处理和转换,并将其发送到不同的目标,如Elasticsearch、Kafka等。以下是使用Logstash处理接收到的日志的详细步骤和方法:
这里以安装在基于Debian的系统(如Ubuntu)为例:
(1)导入Elasticsearch的GPG密钥:
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
(2)安装HTTPS传输:
sudo apt-get install apt-transport-https
(3)将Elasticsearch存储库添加到系统:
echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-7.x.list
(4)更新软件包列表并安装Logstash:
sudo apt-get update
sudo apt-get install logstash
Logstash的配置文件通常位于/etc/logstash/conf.d/
目录。我们需要创建一个配置文件,包含三个部分:输入(input)、过滤器(filter)和输出(output)。
(1)创建配置文件:
sudo nano /etc/logstash/conf.d/logstash.conf
(2)配置输入:
在配置文件中添加以下内容,以从Syslog服务器接收日志:
input {
syslog {
port => 5140
type => "syslog"
}
}
这里我们使用端口5140
作为Logstash的Syslog输入端口。您可以根据需要选择其他端口。
(3)配置过滤器(可选):
过滤器用于对日志进行处理和转换。例如,您可以使用grok
过滤器解析日志消息,提取有用的字段:
filter {
if [type] == "syslog" {
grok {
match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" }
add_field => [ "received_at", "%{@timestamp}" ]
add_field => [ "received_from", "%{host}" ]
}
date {
match => [ "syslog_timestamp", "MMM d HH:mm:ss", "MMM dd HH:mm:ss" ]
}
}
}
这个例子中,我们使用grok
过滤器解析Syslog消息,并提取诸如时间戳、主机名、程序名等字段。
(4)配置输出:
配置输出部分,以将处理后的日志发送到目标。例如,将日志发送到Elasticsearch:
output {
elasticsearch {
hosts => ["localhost:9200"]
index => "logstash-%{+YYYY.MM.dd}"
}
}
这里,我们将日志发送到本地运行的Elasticsearch实例,并使用按日期分割的索引。
启动Logstash并将其设置为在系统启动时自动运行:
sudo systemctl start logstash
sudo systemctl enable logstash
为了将日志从Syslog服务器转发到Logstash,您需要修改Syslog服务器的配置。以rsyslog为例:
编辑rsyslog配置文件:
sudo nano /etc/rsyslog.conf
将以下内容添加到配置文件中,以将日志转发到Logstash:
*.* @@localhost:5140
这里,我们使用@@
将日志通过TCP协议发送到本地运行的Logstash实例的端口5140
。
重启rsyslog服务:
sudo systemctl restart rsyslog
现在,Syslog服务器将接收到的日志转发到Logstash进行处理,然后将处理后的日志发送到Elasticsearch。您可以使用Kibana等工具对这些日
Logstash支持多种输入、过滤器和输出插件,每个插件都有自己的参数。以下是一些常见插件的参数及其用法示例:
file
:从文件中读取日志。
参数:
path
:要读取的文件路径,可以使用通配符。start_position
:从文件的哪个位置开始读取,可以是beginning
(从头开始)或end
(从末尾开始)。示例:
input {
file {
path => "/var/log/*.log"
start_position => "beginning"
}
}
syslog
:从Syslog协议中读取日志。
参数:
port
:要监听的端口。type
:为事件分配的类型。示例:
input {
syslog {
port => 5140
type => "syslog"
}
}
beats
:从Filebeat或其他Beats中读取日志。
参数:
port
:要监听的端口。示例:
input {
beats {
port => 5044
}
}
grok
:使用正则表达式解析日志。
参数:
match
:一个哈希,包含要匹配的字段和正则表达式模式。示例:
filter {
grok {
match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" }
}
}
date
:解析日期并将其设置为事件的时间戳。
参数:
match
:一个数组,包含要解析的字段和日期格式。示例:
filter {
date {
match => [ "syslog_timestamp", "MMM d HH:mm:ss", "MMM dd HH:mm:ss" ]
}
}
mutate
:对事件执行通用转换。
参数:
add_field
:添加新字段。remove_field
:删除字段。rename
:重命名字段。示例:
filter {
mutate {
add_field => { "new_field" => "new_value" }
remove_field => [ "old_field" ]
rename => { "old_name" => "new_name" }
}
}
在Logstash的配置文件中,=>
是键值对的分隔符,用于指定参数的名称和值。例如,在hosts => ["localhost:9200"]
中,hosts
是参数名称,["localhost:9200"]
是参数值。
match
参数后面的字段是一个哈希,用于指定要匹配的字段和正则表达式模式。哈希中的键是字段名称,值是正则表达式模式。
例如,在以下配置中:
grok {
match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" }
}
message
是要匹配的字段,"%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}"
是正则表达式模式。
这个正则表达式模式使用了多个grok
模式:
%{SYSLOGTIMESTAMP:syslog_timestamp}
:匹配Syslog时间戳,并将匹配的值保存到syslog_timestamp
字段。%{SYSLOGHOST:syslog_hostname}
:匹配Syslog主机名,并将匹配的值保存到syslog_hostname
字段。%{DATA:syslog_program}
:匹配任意非空白字符,并将匹配的值保存到syslog_program
字段。(?:\[%{POSINT:syslog_pid}\])?
:匹配可选的进程ID(在方括号中),并将匹配的值保存到syslog_pid
字段。%{GREEDYDATA:syslog_message}
:匹配任意字符,并将匹配的值保存到syslog_message
字段。这个正则表达式模式会对message
字段的值进行解析,并提取出各个部分的值保存到新的字段中。例如,对于以下的Syslog消息:
Oct 11 22:14:15 myhost myprogram[123]: This is a message
解析后的结果将是:
syslog_timestamp
:Oct 11 22:14:15
syslog_hostname
:myhost
syslog_program
:myprogram
syslog_pid
:123
syslog_message
:This is a message
elasticsearch
:将事件发送到Elasticsearch。
参数:
hosts
:一个数组,包含Elasticsearch实例的地址和端口。index
:要写入的索引名称。示例:
output {
elasticsearch {
hosts => ["localhost:9200"]
index => "logstash-%{+YYYY.MM.dd}"
}
}
file
:将事件写入文件。
参数:
path
:要写入的文件路径。示例:
output {
file {
path => "/var/log/output.log"
}
}
stdout
:将事件输出到标准输出。
参数:
codec
:输出格式,例如rubydebug
(易于阅读的文本格式)。示例:
output {
stdout {
codec => rubydebug
}
}
这些示例仅涵盖了部分插件和参数。Logstash支持许多其他插件和选项,您可以根据需要进行组合和配置。请参阅官方文档以获取更多信息和示例。
Syslog是一种标准的日志传输协议,它定义了日志消息的格式和传输方式。Syslog可以使用UDP(用户数据报协议)或TCP(传输控制协议)作为其下层的传输协议。
Syslog over UDP和Syslog over TCP的主要区别在于它们的传输可靠性和资源消耗:
Syslog over UDP:UDP是一种无连接的协议,它不保证消息的到达和顺序。因此,如果网络状况不佳,Syslog消息可能会丢失或到达的顺序可能会打乱。然而,UDP的优点是它的开销较小,对于大量的日志消息,使用UDP可能会更有效率。
Syslog over TCP:TCP是一种可靠的连接协议,它保证了消息的到达和顺序。如果网络状况允许,使用TCP可以确保所有的Syslog消息都能正确地到达接收端。然而,TCP的缺点是它的开销较大,对于大量的日志消息,使用TCP可能会消耗更多的网络资源和处理器时间。
Syslog消息的格式由RFC 5424定义,主要包含以下字段:
PRI(Priority):一个数字,表示消息的优先级。它是由设施代码(Facility Code)和严重性级别(Severity Level)组合而成的。
HEADER:包含两个字段,TIMESTAMP(时间戳)和 HOSTNAME(主机名)。
MSG:消息部分,包含TAG(标签)和 CONTENT(内容)。
Syslog over UDP和Syslog over TCP的消息格式是相同的,它们都遵循RFC 5424的规定。然而,由于TCP是一种流协议,所以Syslog over TCP还需要一种方法来确定消息的边界。这通常通过在每个消息后面添加一个特殊的分隔符(如换行符)来实现。
Syslog消息主要包含以下几部分:
PRI(Priority):一个由设施代码(Facility Code)和严重性级别(Severity Level)组合而成的数字,表示消息的优先级。
VERSION:Syslog协议的版本号。
TIMESTAMP:消息的时间戳。
HOSTNAME:发送消息的设备的主机名。
APP-NAME:生成消息的应用程序的名称。
PROCID:生成消息的进程的ID。
MSGID:消息的ID。
STRUCTURED-DATA:结构化的数据,可选。
MSG:消息的内容。
以下是一个Syslog消息的例子:
<34>1 2003-10-11T22:14:15.003Z mymachine.example.com su - ID47 - 'su root' failed for lonvick on /dev/pts/8
<34>
是PRI,表示优先级。这个数字是由设施代码和严重性级别计算得出的。例如,设施代码为4(auth)和严重性级别为2(critical)计算得出的优先级为34。
1
是VERSION,表示Syslog协议的版本。
2003-10-11T22:14:15.003Z
是TIMESTAMP,表示消息的时间戳。
mymachine.example.com
是HOSTNAME,表示发送消息的设备的主机名。
su
是APP-NAME,表示生成消息的应用程序的名称。
-
是PROCID,表示生成消息的进程的ID。在这个例子中,进程ID未知,所以用-
表示。
ID47
是MSGID,表示消息的ID。
-
是STRUCTURED-DATA,表示结构化的数据。在这个例子中,没有结构化的数据,所以用-
表示。
'su root' failed for lonvick on /dev/pts/8
是MSG,表示消息的内容。
这个消息的含义是,在mymachine.example.com
上,用户lonvick
尝试使用su
命令切换到root
用户,但是失败了。