Syslog发送日志+Logstash处理日志

Syslog发送日志

Syslog(System Logging Protocol)是一种用于计算机系统日志记录的标准协议。它允许设备(如服务器、路由器、防火墙等)将事件消息发送到指定的日志收集服务器,以便集中管理和分析。通过使用Syslog,您可以跟踪您的网络中的活动并在出现问题时快速识别和解决问题。

要将告警日志发送到某台机器的某个端口,您需要在发送端(产生日志的设备)和接收端(日志收集服务器)上配置Syslog。以下是详细方案:

  1. 安装和配置Syslog服务器(接收端):

这里我们以rsyslog为例,rsyslog是Linux系统上常用的Syslog服务器。如果您使用的是Windows系统,可以考虑使用Kiwi Syslog Server或其他适用于Windows的Syslog服务器。

(1)安装rsyslog:

对于大多数Linux发行版,rsyslog已经是默认安装的。如果没有,可以使用以下命令安装:

  • 对于基于Debian的系统(如Ubuntu):
sudo apt-get update
sudo apt-get install rsyslog
  • 对于基于RHEL的系统(如CentOS):
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
  1. 配置发送端设备发送告警日志到Syslog服务器:

这里以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配置方法。通常,您可以在设备的管理界面或配置文件中找到相应的设置。

在发送端发送指定的日志:

  1. 首先,您需要确定要发送的日志文件的路径。例如,假设您要发送的日志文件位于/var/log/myapp.log

  2. 编辑rsyslog配置文件:

sudo nano /etc/rsyslog.conf
  1. 在配置文件中添加以下内容,以将指定日志文件发送到远程服务器:
$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服务器。

  1. 重启rsyslog服务:
sudo systemctl restart rsyslog

现在,发送端将指定的日志文件/var/log/myapp.log发送到远程服务器。

在接收端查看日志:

  1. 默认情况下,rsyslog会将接收到的日志存储在/var/log目录下。您可以在/etc/rsyslog.conf配置文件中找到具体的日志存储路径。例如,以下配置表示将接收到的日志存储在/var/log/remote目录下:
$template RemoteLogs,"/var/log/remote/%HOSTNAME%/%PROGRAMNAME%.log"
*.* ?RemoteLogs
  1. 您可以使用cattailless等命令查看日志文件。例如,查看名为myapp.log的日志文件:
cat /var/log/remote/sender_hostname/myapp.log

请将sender_hostname替换为发送端设备的主机名。

  1. 您还可以使用日志分析工具(如Logstash、Graylog等)对接收到的日志进行处理、分析和可视化。这些工具可以帮助您更有效地管理和监控日志。

Logstash处理日志

Logstash是一个开源的数据收集、处理和转发工具,它可以轻松地从各种来源接收日志数据,对其进行处理和转换,并将其发送到不同的目标,如Elasticsearch、Kafka等。以下是使用Logstash处理接收到的日志的详细步骤和方法:

  1. 安装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
  1. 配置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实例,并使用按日期分割的索引。

  1. 启动Logstash:

启动Logstash并将其设置为在系统启动时自动运行:

sudo systemctl start logstash
sudo systemctl enable logstash
  1. 修改Syslog服务器配置:

为了将日志从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字段说明

Logstash支持多种输入、过滤器和输出插件,每个插件都有自己的参数。以下是一些常见插件的参数及其用法示例:

  1. 输入(input)插件:
  • 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
      }
    }
    
  1. 过滤器(filter)插件:
  • 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_timestampOct 11 22:14:15
  • syslog_hostnamemyhost
  • syslog_programmyprogram
  • syslog_pid123
  • syslog_messageThis is a message
  1. 输出(output)插件:
  • 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是一种标准的日志传输协议,它定义了日志消息的格式和传输方式。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消息主要包含以下几部分:

  1. PRI(Priority):一个由设施代码(Facility Code)和严重性级别(Severity Level)组合而成的数字,表示消息的优先级。

  2. VERSION:Syslog协议的版本号。

  3. TIMESTAMP:消息的时间戳。

  4. HOSTNAME:发送消息的设备的主机名。

  5. APP-NAME:生成消息的应用程序的名称。

  6. PROCID:生成消息的进程的ID。

  7. MSGID:消息的ID。

  8. STRUCTURED-DATA:结构化的数据,可选。

  9. 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用户,但是失败了。

你可能感兴趣的:(linux)