Для примера буду использовать и настраивать rsyslog в качестве клиентского приложения и elasticsearch, logstah в качестве сервера syslog. В качестве ОС выступает CentOS7.

Настройка logstah

Добавим новый input

sudo vim /etc/logstash/conf.d/02-beats-input.conf
	input {
	  #если нужно через UDP, то меняем tcp на udp
	  tcp {
		#пор на который отправлять данные
	    port => 5066
	    type => syslog
	  }
	}

Добавим новый output

sudo vim /etc/logstash/conf.d/30-elasticsearch-output.conf
	output {
	  if [type] == "syslog" {
	    elasticsearch {
	      hosts => [ "elasticsearch_host:port" ]
	      manage_template => false
	      index => "syslog-%{+YYYY.MM}"
	    }
	  }
	}



Добавим новый filter

sudo vim /etc/logstash/conf.d/10-syslog-filter.conf
	filter {
	  if [fileset][module] == "system" {
	    if [fileset][name] == "auth" {
	      grok {
	        match => { "message" => ["%{SYSLOGTIMESTAMP:[system][auth][timestamp]} %{SYSLOGHOST:[system][auth][hostname]} sshd(?:\[%{POSINT:[system][auth][pid]}\])?: %{DATA:[system][auth][ssh][event]} %{DATA:[system][auth][ssh][method]} for (invalid user )?%{DATA:[system][auth][user]} from %{IPORHOST:[system][auth][ssh][ip]} port %{NUMBER:[system][auth][ssh][port]} ssh2(: %{GREEDYDATA:[system][auth][ssh][signature]})?",
	                  "%{SYSLOGTIMESTAMP:[system][auth][timestamp]} %{SYSLOGHOST:[system][auth][hostname]} sshd(?:\[%{POSINT:[system][auth][pid]}\])?: %{DATA:[system][auth][ssh][event]} user %{DATA:[system][auth][user]} from %{IPORHOST:[system][auth][ssh][ip]}",
	                  "%{SYSLOGTIMESTAMP:[system][auth][timestamp]} %{SYSLOGHOST:[system][auth][hostname]} sshd(?:\[%{POSINT:[system][auth][pid]}\])?: Did not receive identification string from %{IPORHOST:[system][auth][ssh][dropped_ip]}",
	                  "%{SYSLOGTIMESTAMP:[system][auth][timestamp]} %{SYSLOGHOST:[system][auth][hostname]} sudo(?:\[%{POSINT:[system][auth][pid]}\])?: \s*%{DATA:[system][auth][user]} :( %{DATA:[system][auth][sudo][error]} ;)? TTY=%{DATA:[system][auth][sudo][tty]} ; PWD=%{DATA:[system][auth][sudo][pwd]} ; USER=%{DATA:[system][auth][sudo][user]} ; COMMAND=%{GREEDYDATA:[system][auth][sudo][command]}",
	                  "%{SYSLOGTIMESTAMP:[system][auth][timestamp]} %{SYSLOGHOST:[system][auth][hostname]} groupadd(?:\[%{POSINT:[system][auth][pid]}\])?: new group: name=%{DATA:system.auth.groupadd.name}, GID=%{NUMBER:system.auth.groupadd.gid}",
	                  "%{SYSLOGTIMESTAMP:[system][auth][timestamp]} %{SYSLOGHOST:[system][auth][hostname]} useradd(?:\[%{POSINT:[system][auth][pid]}\])?: new user: name=%{DATA:[system][auth][user][add][name]}, UID=%{NUMBER:[system][auth][user][add][uid]}, GID=%{NUMBER:[system][auth][user][add][gid]}, home=%{DATA:[system][auth][user][add][home]}, shell=%{DATA:[system][auth][user][add][shell]}$",
	                  "%{SYSLOGTIMESTAMP:[system][auth][timestamp]} %{SYSLOGHOST:[system][auth][hostname]} %{DATA:[system][auth][program]}(?:\[%{POSINT:[system][auth][pid]}\])?: %{GREEDYMULTILINE:[system][auth][message]}"] }
	        pattern_definitions => {
	          "GREEDYMULTILINE"=> "(.|\n)*"
	        }
	        remove_field => "message"
	      }
	      date {
	        match => [ "[system][auth][timestamp]", "MMM  d HH:mm:ss", "MMM dd HH:mm:ss" ]
	      }
	      geoip {
	        source => "[system][auth][ssh][ip]"
	        target => "[system][auth][ssh][geoip]"
	      }
	    }
	    else if [fileset][name] == "syslog" {
	      grok {
	        match => { "message" => ["%{SYSLOGTIMESTAMP:[system][syslog][timestamp]} %{SYSLOGHOST:[system][syslog][hostname]} %{DATA:[system][syslog][program]}(?:\[%{POSINT:[system][syslog][pid]}\])?: %{GREEDYMULTILINE:[system][syslog][message]}"] }
	        pattern_definitions => { "GREEDYMULTILINE" => "(.|\n)*" }
	        remove_field => "message"
	      }
	      date {
	        match => [ "[system][syslog][timestamp]", "MMM  d HH:mm:ss", "MMM dd HH:mm:ss" ]
	      }
	    }
	  }
	} 

Перезапускаем logstash и настраиваем файрволл

sudo systemctl restart logstash
sudo firewall-cmd --add-port=5066/tcp --permanent
sudo firewall-cmd --reload

Настройка rsyslog

Добавляем syslog сервер elasticsearch, logstash

sudo vim /etc/rsyslog.conf
	*.*  action(type="omfwd" target="ip" port="5066" protocol="tcp"
            action.resumeRetryCount="100"
            queue.type="linkedList" queue.size="10000")

sudo systemctl restart rsyslog
sudo systemctl status rsyslog

Ошибка rsyslogd: action ‘action 3’ suspended, next retry is

Бывает что status отвечает с ошибкой rsyslogd: action ‘action ‘ suspended, next retry is и логи не шлются на syslog сервер.

Самое первое что можно попробовать это отключить selinux и перезапустить сервис rsyslog.

sudo setenforce 0
sudo systemctl restart rsyslog

Если после проделанного логи появились на syslog сервере предлагаю не тупо отключать selinux а настроить его. Происходит это из-за того что в selinux для syslog прописан только стандартный порт syslog. Да rsyslog только шлёт, а не принимает. Но всё же.

sudo setenforce 1
sudo yum install -y policycoreutils-python
sudo semanage port -a -t syslogd_port_t -p tcp 5045
sudo systemctl restart rsyslog

Rsyslog отключаем логирование journald

По умолчанию все сервисы journald пишут лони также и в syslog. Чтобы исключить сервис создаём дополнительный конфиг файл для rsyslog.

sudo vim /etc/rsyslog.d/journald-disable.conf
	if $programname == 'journalbeat' then stop
	if $programname == 'service-1.service' then stop
sudo systemctl restart rsyslog