在CentOS7中,Rsyslong是一个集中式的日志收集系统,可以运行在TCP或者UDP的514端口上。

 

目录

开始之前

配置接收日志的主机

配置发送日志的主机

日志回滚

附件:创建日志接收模板

排错

 

开始之前

本文的配置环境如下

系统:CentOS7

主机数量:2

接收日志的主机ip:192.168.1.112;主机名:server112

发送日志的主机ip:192.168.1.204;主机名:server204

rsyslog版本号:rsyslog-7.4.7-7.el7_0.x86_64

目的:把server204上产生的所有日志信息和所有的操作命令都发送到server112主机上,以便集中监控和分析日志

 

如果你的主机名在安装系统时没有修改,默认为localhost.domain,如果不修改主机名,那么所有的日志集中在一个服务器上时就会互相覆盖。

查看当前的主机名:hostname

修改主机名流程:

在文件/etc/hostname中添加新的主机名

在文件/etc/hosts的第一行的两个地方添加新的主机名

注意:一定要在localhost.domain的前面添加{主机名}.domain,否则不能在/var/log目录下产生以主机名命名的目录

 

github项目:https://github.com/Kylinlin/logsystem

在该项目下的scripts目录下有两个文件,configure_rsyslog_for_client.sh是用来配置发送日志的客户端脚本,configure_rsyslog_for_server.sh是用来配置接收日志的服务器端脚本。往后会在该项目中添加日志分析系统和更为全面的日志管理方法。

 

声明:本文大量引用了Linux.cn开源中文社区的一篇博客内容:https://linux.cn/article-5023-1.html

 

配置接收日志的主机

查看你的系统上是否安装了rsyslog系统

rpm -qa | grep rsyslog

在主机上安装rsyslog

yum install rsyslog* -y

安装完成后,打开文件/etc/rsyslog.conf进行配置,主要是把下面的注释去掉,并添加三行字符

$template RemoteLogs,"/var/log/%HOSTNAME%/%PROGRAMNAME%.log" *
*.* ?RemoteLogs
& ~

如下图所示:

       在此对该模板进行简单解释,$template RemoteLogs(这里“RemoteLogs” 字符串可以为任何其他的描述性的名称)指令使rsyslog后台进程将日志消息写到/var/log下的单独的本地日志文件中,其中日志文件的名称是基于远程日志发送机器的主机名以及生成该日志的应用程序名进行定义的。其中第二行暗示了我们将RemoteLogs模板应用到所有接收到的日志上。

       符号"& ~"表示了一个重定向规则,被用来告知rsyslog守护进程停止对日志消息的进一步处理,并且不要在本地写入。如果没有使用该重定向规则,那么所有的远程消息都会在写入上述描述的日志文件之外同时被写入到本地日志文件,这就意味着日志消息实际上被写了两次。使用该规则的另外一个结果就是syslog服务器本身的日志消息只会被以该机器主机名命名的专有文件中

如果想配置特定的模板,参考本文最后的附件

 

rsyslog进程的控制命令为

查看进程运行情况(Status) :systemctl status rsyslog

停止(Stop)                         :systemctl stop rsyslog

重启(Restart)                     :systemctl restart rsyslog

启动(Start)                         :systemctl start rsyslog

查看514端口是否启动             :netstat -antup | grep 514

 

配置发送日志的主机

如果没有安装rsyslog,则安装

yum install rsyslog -y

安装完成后,同样配置/etc/rsyslog.conf文件,在文件的最后一行添加如下字符

*.* @192.168.1.112:514

如果用的是TCP协议,则要多加一个@:*.* @@192.168.1.112:514

把该主机上的所有操作命令同时发送到日志主机去,打开配置文件/etc/bashrc

在文件的最后一行添加以下内容:

export PROMPT_COMMAND='{ msg=$(history 1 | { read x y; echo $y; });logger "[euid=$(whoami)]":$(who am i):[`pwd`]"$msg"; }'

重新加载bash配置文件:

source /etc/bashrc

打开防火墙的514端口

firewall-cmd --add-port=514/udp --permanent

firewall-cmd --add-port=514/tcp --permanent

firewall-cmd --reload

重启rsyslog

systemctl restart rsyslog

至此,基本配置完成

 

日志回滚

在接收日志的主机上,进入目录/var/log,可以看到生成了两个文件夹server112和server204(根据两台主机名生成的),在server204文件夹中的一个名为root.log文件就是该主机上执行过的所有命令,其他文件都是根据进程名生成的。

设置日志回滚,编辑文件/etc/logrotate.d/syslog

把记录日志的两个路径添加进去,记得把server112和server204替换为你的主机名

这样就能自动回滚这两个目录下的所有日志

 

附件:创建日志接收模板

可以使用下面的模式对特定的设备或严重性级别使用新的模板直接来记录日志消息。

[facility-level].[severity-level] ?RemoteLogs

serverity-level table(服务级别列表)

serverity-level table(服务级别列表)

数字代码

服务级别

描述

0

emerg

系统不可用

1

alert

必须马上采取救援行动

2

crit

严重错误信息

3

error

错误信息

4

warning

警告信息

5

notice

普通但是值得注意的信息

6

info

一般信息

7

debug

调试信息

 

facility-level table(设备级别列表),如下图

例如:

将全部优先级别的所有内部用户验证消息指定为RemoteLogs模板:

authpriv.* ?RemoteLogs

将所有系统进程中除开mail、用户验证和cron消息之外的进程产生的消息级别的日志指定为RemoteLogs模板:

*.info,mail.none,authpriv.none,cron.none ?RemoteLogs

如果我们想要将所有从远程客户端接受到的消息写入到一个以它们的IP地址命名的单个文件中,可以使用以下的模板。在此我们为该模板赋予了“IpTemplate”名称。

$template IpTemplate,"/var/log/%FROMHOST-IP%.log"

 *.* ?IpTemplate

 & ~

 

排错

上面的配置很简单,但是有时候服务端就是很诡异地接收不到客户端发送的日志(在服务端的/var/log目录下没有以客户端主机名命名的文件夹),此时就要逐一检查以下问题:

1.检查配置文件是否有错

2.两台机器之间是否能ping通

3.查看服务端是否已经在监控514端口:netstat -lnutp

4.注意服务端监控的514端口究竟是udp还是tcp协议,而客户端也必须使用一致的协议

Centos7搭建集中式日志系统的更多相关文章

  1. elk + filebeat,6.3.2版本简单搭建,实现我们自己的集中式日志系统

    前言 刚从事开发那段时间不习惯输出日志,认为那是无用功,徒增代码量,总认为自己的代码无懈可击:老大的叮嘱.强调也都视为耳旁风,最终导致的结果是我加班排查问题,花的时间还挺长的,要复现问题.排查问题等, ...

  2. 安装logstash+kibana+elasticsearch+redis搭建集中式日志分析平台

    安装logstash+kibana+elasticsearch+redis搭建集中式日志分析平台 2014-01-16 19:40:57|  分类: logstash |  标签:logstash   ...

  3. 集中式日志系统 ELK 协议栈详解

    简介 在我们日常生活中,我们经常需要回顾以前发生的一些事情:或者,当出现了一些问题的时候,可以从某些地方去查找原因,寻找发生问题的痕迹.无可避免需要用到文字的.图像的等等不同形式的记录.用计算机的术语 ...

  4. ELK——集中式日志系统

    https://www.ibm.com/developerworks/cn/opensource/os-cn-elk/index.html 基本流程是 Shipper 负责从各种数据源里采集数据,然后 ...

  5. ELK+Filebeat 集中式日志解决方案详解

    链接:https://www.ibm.com/developerworks/cn/opensource/os-cn-elk-filebeat/index.html?ca=drs- ELK Stack ...

  6. 中小型研发团队架构实践七:集中式日志ELK

    一.集中式日志 日志可分为系统日志.应用日志以及业务日志,系统日志给运维人员使用,应用日志给研发人员使用,业务日志给业务操作人员使用.我们这里主要讲解应用日志,通过应用日志来了解应用的信息和状态,以及 ...

  7. 理解OpenShift(6):集中式日志处理

    理解OpenShift(1):网络之 Router 和 Route 理解OpenShift(2):网络之 DNS(域名服务) 理解OpenShift(3):网络之 SDN 理解OpenShift(4) ...

  8. 集中式日志分析平台 - ELK Stack - 安全解决方案 X-Pack

    大数据之心 关注  0.6 2017.02.22 15:36* 字数 2158 阅读 16457评论 7喜欢 9 简介 X-Pack 已经作为 Elastic 公司单独的产品线,前身是 Shield, ...

  9. centos7搭建集群必知:centos7已经无iptables,只有firewall

    1.防火墙概述 centos7搭建集群,发现没有iptables,需要安装.防火墙为firewalle CentOS7默认的防火墙不是iptables,而是firewalle. CentOS 7.0默 ...

随机推荐

  1. iOS系统右滑返回全局控制方案

    前言 今天有个小需求,在点击导航条上的返回按钮之前要调用某个API,并弹出UIAlertView来显示,根据用户的选项判断是否是返回还是继续留在当前控制器.举个简单的例子,当点击导航条上的左上角返回按 ...

  2. JavaWeb中的简单分页

    这次主要是讲解一下通过登录后对得到的数据进行分页,首先我们新建一个登录页面login.jsp,因为我们主要学习一下分页,所以登录验证的部分不再阐述,主要代码如下: <form action=&q ...

  3. 连续调用inet_ntoa打印出错的问题

    近日写程序,在打印信息的时候调用了inet_ntoa函数,出现了打印一直出错的情况.google了一下,是因为inet_ntoa这类函数没有保证线程安全,其实现原理是在静态内容中申请一块内存,每次调用 ...

  4. 为Google Reader守夜。。。

    Google的阅读器快要关闭了... 立刻截图留恋呢,以后就没机会了. 唉,真是令人惋惜. 虽然我接触Google Reader还不到一年,但是我已经习惯当连上WiFi时马上更新一下手机上的gRead ...

  5. Oracle 中记录用户登录信息

    我们可以使用 Oracle Audit 函数来记录用户登录信息,但是如果开放了 Audit 函数将会使 Oracle 性能下降,甚至导致 Oracle 崩溃.那我们如何才能记录用户登录信息呢?其实我们 ...

  6. LeetCode 231

    Power of Two Given an integer, write a function to determine if it is a power of two. /************* ...

  7. poj 2411 状态压缩dp

    思路:将每一行看做一个二进制位,那么所有的合法状态为相邻为1的个数一定要为偶数个.这样就可以先把所有的合法状态找到.由于没一层的合法状态都是一样的,那么可以用一个数组保存.由第i-1行到第i行的状态转 ...

  8. python中提示invalid syntax 总结

    记录语法错误的坑 1.陷进1,使用notepad++,格式显示与实际不相匹配,报invalid syntax 错误 使用文本格式执行一个文件,一直提示 找原因,因为写文件时一直是用的文本文件写的代码, ...

  9. framework7学习笔记

    最近因项目需要学习framework7,简称F7.对于自己遇到的问题和学习到的东西做个简单记录. 问题:刚开始获取json,页面上一直不显示,不得其法,原来是json文件需要在弹出层打开之后在来加载, ...

  10. C标准库函数实现之strstr(转)

    看下Linux下的实现: char *strstr(const char *s1, const char *s2) { size_t l1, l2; l2 = strlen(s2); if (!l2) ...