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

  3. 在配置文件中添加以下内容,以将指定日志文件发送到远程服务器:

    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

  2. 您可以使用cat、tail、less等命令查看日志文件。例如,查看名为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_timestamp:Oct 11 22:14:15
  • syslog_hostname:myhost
  • syslog_program:myprogram
  • syslog_pid:123
  • syslog_message:This 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用户,但是失败了。

相关推荐
雯宝3 小时前
mnt_init 函数
linux
律宏阔9 小时前
WSL Docker 端口明明空闲,但就是绑不上端口
linux·windows
律宏阔9 小时前
WSL 突然断网,无法 ping 内网或外网
linux·windows
穷人小水滴9 小时前
用容器编译 VirtualBox 虚拟机软件 (ArchLinux, podman)
linux·容器·virtualbox
乱码三千9 小时前
如何优雅地直连无公网 IP 的远程 GPU 服务器
linux·人工智能·程序员
yunwei379 小时前
使用 eBPF 跟踪 Nginx 请求
linux·后端·性能优化
yunwei379 小时前
使用 eBPF 跟踪 MySQL 查询
linux·后端·性能优化
yunwei379 小时前
eBPF 示例教程:使用 XDP 捕获 TCP 信息
linux·后端·性能优化
GeW9 小时前
制造业高端化,为什么必须重估Linux和数据库?
linux
GeW9 小时前
工业场景中的Linux与数据库选型:高端化转型的技术底座
linux