当前位置:   article > 正文

Linux系统日志管理-- rsyslog_rsyslogd linux命令

rsyslogd linux命令

一. syslogd简介

syslogd不仅仅是记录kernel log的服务,还能记录user space中的日志。

syslogd是Linux下的一个记录日志文件服务。新版本叫做rsyslogd。

syslogd有一系列的子服务,例如mail、auth、cron、kern等等,这些子服务提供日志记录的功能,。当程序要记录log时,可以直接调用这些子服务将日志记录到设定的地方。

syslogd是一个守护进程,配置这整个守护进程以及其子服务的地方就是/etc/syslog.conf这个文件。可以从https://www.rsyslog.com/doc/master/获取官方文档。

Rsyslog的全称是 rocket-fast system for log ,可用于接受来自各种来源的输入,转换 它们,并将结果输出到不同的目的地。

1.1 日志的output格式

1.如果配置好并运行了 syslogd 或 klogd,一般所有 log的信息也会追加到 /var/log/messages。并且kernel log信息被记录在/val/log/kern.log。

在这里插入图片描述

可以看到基本日志格式包含以下四列:

1 事件产生的时间(Jan 1 08:00:09)
2 发生事件的服务器的主机名 (cvitek)
3产生事件的服务名或程序名 (kernel or local5)
4 事件的具体信息(…cif a0c2000.cif:…)

2.当开启rsyslogd后,不能透过/proc/kmsg来查看kernel log.

1.2 配置/etc/syslog.conf服务

  1. /etc/rsyslog.conf 是rsyslog服务的总配置文件
  2. /etc/rsyslog.d 该目录是单独配置的rsyslog配置文件

1.2.1 总配置/etc/syslog.conf

rsyslog记录哪些日志,到底记录了什么样的日志,是通过这个/etc/rsyslog.conf配置文件来决定的,先分析一下rsyslogd的配置文件:

在这里插入图片描述

默认规则会定义在/etc/rsyslog.d/50-default.conf中。

#################
#### MODULES ####
#################
module(load="imuxsock") # provides support for local system logging   ;加载提供对本地系统日志的支持
module(load="imklog")   # provides kernel logging support;加载读取内核消息模块
#module(load="immark")  # provides --MARK-- message capability
# provides UDP syslog reception  (接收使用UDP 协议转发过来的日志,这里#注释掉了表示不启用)
#module(load="imudp")
#input(type="imudp" port="514")  (允许514端口接收)
# provides TCP syslog reception (接收使用UDP 协议转发过来的日志)
#module(load="imtcp")
#input(type="imtcp" port="514")(允许514端口接收)
# Enable non-kernel facility klog messages
$KLogPermitNonKernelFacility on
###########################
#### GLOBAL DIRECTIVES ####
###########################
#
# Use traditional timestamp format.
# To enable high precision timestamps, comment out the following line.
#
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
# Filter duplicated messages
$RepeatedMsgReduction on
#
# Set the default permissions for all log files.
#
$FileOwner syslog
$FileGroup adm
$FileCreateMode 0640
$DirCreateMode 0755
$Umask 0022
$PrivDropToUser syslog
$PrivDropToGroup syslog
#
# Where to place spool and state files
#
$WorkDirectory /var/spool/rsyslog
(记录所有日志类型的info级别以及大于info级别的信息到/var/log/messages,但是mail邮件信息,authpriv验证方面的信息和cron时间任务相关的信息除外)
#*.info;mail.none;authpriv.none;cron.none    /var/log/messages
# Include all config files in /etc/rsyslog.d/ 
#
$IncludeConfig /etc/rsyslog.d/*.conf  (表示加载该目录中的所有配置)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43

1.2.2 rsyslog规则(/etc/rsyslog.d/*.conf)

rsyslog规则配置文件一般由以下3部分组成,每一行表示一个项目,格式为:facility.level action,分别表示日志类型,日志等级,日志输出路径。一般系统默认的规则定义在/etc/rsyslog.d/50-default.conf,

在这里插入图片描述

一般所有日志类型都会被追加在/val/log/messages。如:

*.info;mail.none;authpriv.none;cron.none    /var/log/messages  
  • 1

facility 日志类型

在这里插入图片描述

level(按严重程度由低到高排序):

在这里插入图片描述

action(表示log保存的位置)

  • 日志文件的绝对路径。这是最常见的日志保存方法,如“/var/log/secure”就是用 来保存系统验证和授权信息日志的。
  • 系统设备文件。如“/dev/lp0”代表第一台打印机,如果日志保存位置是打印机设 备,当有日志时就会在打印机上打印。
  • 转发给远程主机。因为可以选择使用 TCP 和 UDP 协议传输日志信息,所以有两 种发送格式:如果使用“@192.168.0.210:514”,就会把日志内容使用 UDP 协 议发送到192.168.0.210 的 UDP 514 端口上;如果使用“@@192.168.0.210: 514”,就会把日志内容使用 TCP 协议发送到 192.168.0.210 的 TCP 514 端口 上,其中 514 是日志服务默认端口。当然,只要 192.168.0.210 同意接收此日 志,就可以把日志内容保存在日志服务器上。
  • 用户名。如果是“root”,就会把日志发送给 root 用户,当然 root 要在线,否则 就收不到日志信息了。发送日志给用户时,可以使用“*”代表发送给所有在线用 户,如“mail.**”就会把 mail 服务产生的所有级别的日志发送给所有在线用户。 如果需要把日志发送给多个在线用户,则用户名之间用“,”分隔。
  • 忽略或丢弃日志。如果接收日志的对象是“~”,则代表这个日志不会被记录,而 被直接丢弃。如“local3.* ~”代表忽略 local3 服务类型所有的日志都不记录。

/etc/rsyslog.conf配置文件的内容
我们知道了/etc/rsyslog.conf 配置文件中日志的格式,接下来就看看这个配置文件的 具体内容。

由三部分组成:严格按照配置段位置添加配置 ;
MODULES:定义了模块的选修,这个部分主要用来配置模板,模板的作用是指定 你希望在日志文件中保存的日志格式。
GLOBAL DIRECTIVES:定义了全局的环境
RULES:定义了记录日志的设施以及等级等信息
在这里插入图片描述

那下面我也抄过来一份比较全面的规则定义示例供大家参考:

#查看配置文件的内容
#rsyslog v5 configuration file
# For more information see /usr/share/doc/rsyslog-
*/rsyslog_conf.html
# If you experience problems, see
http://www.rsyslog.com/doc/troubleshoot.html
*### MODULES ###
 
 
#加载模块
$ModLoad imuxsock # provides support for local system logging
(e.g. via logger command)
#加载imixsock模块,为本地系统登录提供支持
$ModLoad imklog # provides kernel logging support (previously
done by rklogd)
#加载imklog模块,为内核登录提供支持
#$ModLoad immark # provides --MARK-- message capability
#加载immark模块,提供标记信息的能力
# Provides UDP syslog reception
#$ModLoad imudp
#SUDPServerRun 514
#加载UPD模块,允许使用UDP的514端口接收采用UDP协议转发的日志
# Provides TCP syslog reception
#$ModLoad imtcp
#$InputTCPServerRun 514
#加栽TCP摸块,允许使用TCP的514编口接收采用TCP协议转发的日志
 
 
#### GLOBAL DIRECTIVES ####
#定义全局设置
#Use default timestamp format
#ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat #定义曰志
的时间使用默认的时间戳格式
#File syncing capability is disabled by default. This feature is
usually not required,
#not useful and an extreme performance hit
#$ActionFileEnableSync on
#文件同步功能。默认没有开启,是注释的
#Include all config files in /etc/rsyslog.d/
$IncludeConfig /etc/rsyslog.d/*.conf
#包含/etx/tsyslog.d/目录中所有的".conf"子配置文件。也就是说,这个目录中的所
有子配置文件也同时生效
#### RULES ####
#日志文件保存规则
#Log all kernel messages to the console.
#Logging much else clutters up the screen.
#kern.* /dev/console
#kern服务.所有曰志级别 保存在/dev/console
#这个日志默认没有开启,如果需要,则取消注释
#Log anything (except mail) of level info or higher.
#Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none /var/log/messages
#所有服务.info以上级到的日志保存在/var/log/messages日志文件中
#mail, authpriv^ cron的B志不记录在/var/log/messages曰志文件中,因为它们
部有自己的曰志文件
#所以/var/log/messages日志是最重要的系统日志文件,需要经常查看
#The authpriv file has restricted access.
authpriv.* /var/log/secure
#用户认证服务所有级别的日志保存在/vai/1og/secure日志文件中
#Log all the mail messages in one place.
mail.* -/var/log/maillog
#mail服务的所有级别的日志保存在/var/log/maillog 日志文件中
#"-"的含义是日志先在内存中保存.当曰志足够多之后.再向文件中保存
# Log cron stuff
cron.* /var/log/cron
#计対任务的所有日志保存在/var/log/cron日志文件中
# Everybody gets emergency messages
#所有日志服务的疼痛等级日志对所有在线用户广播
#Save news errors of level crit and higher in a special file.
uucp,news.crit /var/log/spooler
#uucp和news曰志服务的crit以上级别的日志保存在/var/log/sppoler曰志文件中
#Save boot messages also to boot.log
local7.* /var/log/boot.log
#loacl7 日志服务的所有日志写入/var/log/boot.log 日志文件中 #会把开机时的检
测信息在显示到屏幕的同时写入/var/log/boot.log 日志文件中
# ### begin forwarding rule ###
#定义转发规到
#The statement between the begin ... end define a SINGLE
forwarding
#rule. They belong together, do NOT split them. If you create
multiple
# forwarding rules, duplicate the whole block!
# Remote Logging (we use TCP for reliable delivery)
#
# An on-disk queue is created for this action. If the remote host
is
# down, messages are spooled to disk and sent when it is up
again. #SWorkDirectory /var/lib/rsyslog # where to place spool
files #$ActionQueueFileName fwdRulel # unique name prefix for
spool files
#$ActionQueueMaxDiskSpace 1g # 1gb space limit (use as much as
possible)
#$ActionQueueSaveOnShutdown on # save messages to disk on
shutdown
#$ActionQueueType LinkedList t run asynchronously
#$ActionResumeRetryCount -1 # infinite retries if host is down
# remote host is: name/ip:port, e.g. 192.168.0.1:514, port
optional #*•* @6remote-host:514
# ### end of the forwarding rule ##

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100

其实系统已经非常完善地定义了这个配置文件的内容,系统中重要的日志也已经记录 得非常完备。如果是外来的服务,如 apache、Samba 等服务,那么这些服务的配 置文件中也详细定义了日志的记录格式和记录方法。所以,日志的配置文件基本上不 需要我们修改,我们要做的仅仅是查看和分析系统记录好的日志而已。

1.3 程序如何配置syslog子服务(如何自定义rsyslog规则)

问题:进程如何发送消息给rsyslog守护进程,rsyslog守护进程是如何对各种日志区分开来的?

syslog() + LOG_X宏

像/usr/sbin/sshd、/usr/bin/login、/usr/bin/su这些进程,它们是调用一个叫syslog的系统调用,syslog系统调用是一个用于向rsyslog守护进程发送消息的的系统函数。

/usr/sbin/sshd,/usr/bin/login、/usr/bin/su这些进程专门执行登录验证时,它们在调用syslog系统函数会一般会调用LOG_AUTH这个常量,而/usr/bin/crond和/usr/bin/at这些在调用syslog系统调用会传入LOG_CRON这个常量(具体请看**syslog()**函数),日志归类规则如下:

在这里插入图片描述

所以如果用LOG_AUTH的syslog()函数调用,那么会归类到了/val/log/secure,

如果用LOG_CRON的syslog()调用则归类到了/val/log/cron。而kernel等其他log被记录在了/val/log/messages中。

二、常见日志格式及文件

在这里插入图片描述

除系统默认的日志之外,采用 RPM 包方式安装的系统服务也会默认把日志记录在 /var/log/ 目录中(源码包安装的服务日志存放在源码包指定的目录中)。不过这些 日志不是由 rsyslogd 服务来记录和管理的,而是各个服务使用自己的日志管理文档 来记录自身的日志。以下介绍的日志目录在你的 Linux 上不一定存在,只有安装了相应的服务,日志才会出现。服务日志如表 2 所示:

在这里插入图片描述

三. syslog()函数

在这里插入图片描述

用户空间也可以用syslog()函数来记录自己的进程的日志,所以用户进程可以自定义日志规则。

调用openlog是可选择的。如果不调用openlog,则在第一次调用syslog时,会自动调用openlog。

syslog的相关函数和宏定义一般在toolchain中都会有定义:

在这里插入图片描述

2.1 openlog函数

第1个参数为ident,该参数常用来表示信息的来源。ident信息会被固定地添加在每行日志的前面。

第2个参数 option控制标志

LOG_CONS如果将信息发送给syslogd守护进程时发生错误,直接将相关信息输出到终端
LOG_PID每条日志信息中都包括进程号

第3个参数为facility:

facility参数syslog.conf中对应的facility取值
LOG_KERNkern
LOG_USERuser
LOG_MAILmail
LOG_DAEMONdaemon
LOG_AUTHauth
LOG_SYSLOGsyslog
LOG_LPRlpr
LOG_NEWSnews
LOG_UUCPuucp
LOG_CRONcron
LOG_AUTHPRIVauthpriv
LOG_FTPftp
LOG_LOCAL0~LOG_LOCAL7local0~local7

在这里插入图片描述

2.2 syslog函数

第一个参数priority表示日志级别

priority参数syslog.conf中对应的level取值
LOG_EMERGemerg
LOG_ALERTalert
LOG_CRITcrit
LOG_ERRerr
LOG_WARNINGwarning
LOG_NOTICEnotice
LOG_INFOinfo
LOG_DEBUGdebug

在这里插入图片描述

下面是具体的例子:

在这里插入图片描述

这里Printf(“%m”)等价于printf(“%s”,strerror(errno));它表示把errno用string形式打印出来。

由于我这里facility为user时,是记录在/val/log/syslog中的,

在这里插入图片描述

因此打印log如下:

在这里插入图片描述

2.3 重定向log

那我们也可以把log定向到自己想要的地方,

方法1:修改rsyslog.conf:

在这里插入图片描述

将facility=user时的所有level级别的log重定向到/val/log/user.log, 重启rsyslog服务,

在这里插入图片描述
此时log将被写入到新配置的位置/val/log/user.log, 当然/val/log/syslog也会保留一份.(因为也符合/val/log/syslog这条规则)

在这里插入图片描述

方法2:修改code中的facility:

在这里插入图片描述

那这里的facility被设置成了local0, 那也会记录在/val/log/syslog.

在这里插入图片描述

2.4 设置log等级

1.这里新增一个app.conf,然后自定义log路径:

在这里插入图片描述

当然还可以类似于这样子写, syslogfacility-text和syslogseverity-text是rsyslog自带的系统变量。

在这里插入图片描述

2.重启rsyslog服务

在这里插入图片描述

在这里插入图片描述

这里切成4个文件,每个文件记录1024k。

3.运行程序,查看log如下:

在这里插入图片描述

在这里插入图片描述

4.那现在修改log等级为warn, 表示只有大于等于该等级的log才会记录。

在这里插入图片描述

5.再次重启rsyslog服务,运行程序,可以看到"log debug"不再打印.

在这里插入图片描述

2.5 重定向log到console

在这里插入图片描述

再次重启rsyslog服务,运行程序,那么可以看到err级别的log打印在了console上,但是低于err级别还是会记录在/val/log/app。

在这里插入图片描述

3.dup函数介绍

在这里插入图片描述

用来将标准输出重定向到文件。

static int dup_fd;
static int dup_fd_bak = 1000;

static int dup_fd(void)  {
    dup_fd = open( "./printf_dup_log.txt ", O_CREAT | O_RDWR | O_TRUNC);
    dup2(STDOUT_FILENO, dup_fd_bak);/*backup stdout*/
    dup2(dup_fd, STDOUT_FILENO);
    return 0;
}
static int rst_fd(void)  {
    dup2(dup_fd_bak, fileno(stdout));/*recover stdout*/
    close(dup_fd);
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

四.rsyslog简介

rsyslog是一个开源工具,被广泛用于Linux系统以通过TCP/UDP协议转发或接收日 志消息。rsyslog守护进程可以被配置成两种环境,一种是配置成日志收集服务器, rsyslog进程可以从网络中收集其它主机上的日志数据,这些主机会将日志配置为发 送到另外的远程服务器。rsyslog的另外一个用法,就是可以配置为客户端,用来过 滤和发送内部日志消息到本地文件夹(如/var/log)或一台可以路由到的远程rsyslog 服务器上。

官网地址:https://www.rsyslog.com/

在 CentOS 6.x 中,日志服务已经由 rsyslogd 取代了原先的 syslogd。Red Hat 公司 认为 syslogd 已经不能满足工作中的需求,rsyslogd 相比 syslogd 具有一些新的特点:

基于TCP网络协议传输日志信息。
更安全的网络传输方式。
有日志信息的即时分析框架。
后台数据库。
在配置文件中可以写简单的逻辑判断。
与syslog配置文件相兼容。

我们如何知道 Linux 中的 rsyslogd 服务是否启动了呢?如何查询 rsyslogd 服务的自 启动状态呢?命令如下:

ps aux | grep “rsyslog” | grep -v “grep”

#centos6.x查看服务有无开机自启
[root@localhost ~]# chkconfig --list | grep rsyslog
rsyslog 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
#rsyslog服务在2、3、4、5运行级别上是开机自启动的


#centos7.x查看服务有无开机自启
[root@NAT1 ~]# systemctl  list-unit-files rsyslog.service
UNIT FILE       STATE
rsyslog.service enabled
1 unit files listed.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

系统中的绝大多数日志文件是由 rsyslogd 服务来统一管理的,只要各个进程将信息 给予这个服务,它就会自动地把日志按照特定的格式记录到不同的日志文件中。也就 是说,采用 rsyslogd 服务管理的日志文件,它们的格式应该是统一的。

在 Linux 系统中有一部分日志不是由 rsyslogd 服务来管理的,比如 apache 服务, 它的日志是由 Apache 软件自己产生并记录的,并没有调用 rsyslogd 服务。但是为 了便于读取,apache 日志文件的格式和系统默认日志的格式是一致的。

五、Linux日志服务器设置

我们知道,使用“@IP:端口”或“@@IP:端口”的格式可以把日志发送到远程主机上, 那么这么做有什么意义吗?

假设我需要管理几十台服务器,那么我每天的重要工作就是查看这些服务器的日志, 可是每台服务器单独登录,并且查看日志非常烦琐,我可以把几十台服务器的日志集 中到一台日志服务器上吗?这样我每天只要登录这台日志服务器,就可以查看所有服 务器的日志,要方便得多。

在这里插入图片描述

项目主机规划

rsyslog SERVER :(接受端) IP:192.168.198.140

rsyslog Client:(发送端) IP:192.168.198.138

rsyslog 接收日志(服务端)
在 GLOBAL DIRECTIVES 之前追加如下配置:

说明:

$template IpTemplate(“IpTemplate” 可自定义)指令使 rsyslog 后台进程将日 志消息写到 /var/log 下的单独的本地日志文件中,其中日志文件的名称是基于远 程日志发送机器的主机名以及生成该日志的应用程序名进行定义的。

. ?IpTemplate 将 IpTemplate 模板应用到所有接收到的日志上 。

rsyslog 接收远程日志且去掉日志头配置如图所示:

具体文件配置内容如下:

在这里插入图片描述

在这里插入图片描述

修改配置后需要重启服务:systemctl restart rsyslog

syslog 发送日志(客户端)
发送日志的配置很简单,只需要配置要发送的地址就 ok,如果出于某种原因,你需要更为可靠的协议,如TCP,而rsyslog服务器也被配置为监听TCP连接,你必须在远程主机的IP地址前添加一个额外的@字符

*.* @@192.168.42.209:514 # tcp 协议
local7.info @192.168.42.209:514 # udp 协议,只发送用户的 info
级别日志
  • 1
  • 2
  • 3

修改配置后需要重启服务:systemctl restart rsyslog

测试
logger的使用
logger 是一个shell 命令接口,可以通过该接口使用Syslog的系统日志模块,还可以 从命令行直接向系统日志文件写入一行信息。

-i 在每行都记录进程ID

-t 日志中的每一行都加一个error标签

-p 指定自定义的日志设备,和配置文件的

local5.*对应,配置文件里没有.info。

在这里插入图片描述

使用示例:

logger -it error -p local5.info “hello world”

客户端触发

在这里插入图片描述

服务端响应

在这里插入图片描述

在这里插入图片描述

服务端可以查看到含有IP的日志名,并可以查看到我们之前触发的日志,这里测试完 毕。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/401373
推荐阅读
相关标签
  

闽ICP备14008679号