Linux日志系统分析:rsyslog、syslog和klog

参考博客:

 https://blog.csdn.net/lidonghat/article/details/55004280

 https://blog.csdn.net/u012247418/article/details/83684052

1.syslog是 Unix 系统的一个常见组件,用于执行系统日志记录活动。
2.syslogd 是它的守护进程,syslogd 从一组日志源(如 /dev/log 和 /dev/klog )中读取数据,并按照 /etc/syslog.conf 中的说明处理这些日志消息。通过调用syslog(),可将应用程序日志消息记录到 syslog 中。syslog 消息采用一种包含可选优先级和设备的标准格式。优先级指示消息的紧急程度,设备指示发布消息的子系统。/usr/include/syslog.h中定义了它的优先级和设备资源。
3.klog是一个从Unix内核接受消息的设备,klogd 守护进程获得并记录 Linux 内核信息。通常,syslogd 会记录 klogd 传来的所有内核信息。
syslog日志运行逻辑

kernel---> 物理终端(/dev/console) --> /var/log/message  命令dmesg  就是控制台输出/var/log/message日志信息

/sbin/init

  /var/log/message: 系统标准错误日志信息;非内核产生引导信息,各子系统产生的信息;

  /var/log/maillog: 邮件系统产生的日志信息;

  /var/log/secure:  系统登录日志信息

----------------------

syslogd是Linux下的一个记录日志文件服务。从结构来说,可以理解为这个服务下面有一系列的子服务,例如mail、auth、cron、kern等等,这些子服务对外提供日志记录的功能,而当其它的程序或服务需要记录日志的时候,就可以直接调用这些子服务将日志记录到设定的地方。而配置这整个守护进程以及其子服务的地方就是/etc/syslog.conf这个文件。

而目前不少的Linux发行版已经用rsyslogd将syslogd代替了。rsyslogd是syslogd的升级版,其配置语法与syslogd的配置文件一致。ubuntu-gnome-16.04使用的是rsyslogd。

注:

在用户空间有专门用于记录系统日志的程序,统称为“syslog守护进程”。早期及现在的大部分嵌入式系统使用的是klogd+syslogd组合,现在大多数发行版都使用rsyslogd或者syslogd-ng。

如果需要修改系统日志配置,修改以下两个文件。

1)/etc/rsyslog.conf

2)/etc/rsyslog.d/50-default.conf 日志文件的记录规则和路径

操作:

sudo service rsyslog restart

sudo service rsyslog stop

sudo service rsyslog start

 

2. 查看linux日志的三种途径:

1)dmesg

printk()打印的日志会写到kernel ring buffer(环缓冲区)中,dmesg是从kernel ring buffer中读取内核日志信息;效果等同于cat /var/log/message

2)/var/log/

系统所有日志(包括用户日志和系统内核日志)均记录在/var/log/目录下。

rsyslogd守护进程根据/etc/rsyslog.conf和/etc/rsyslog.d/XXXXX.conf,将不同的服务产生的log记录到不同的文件中。

3)/proc/kmsg

通过读取/proc/kmsg也可以得到ring buffer(环缓冲区)的日志,但是对/proc/kmsg进行读操作后,ring buffer中被读取的数据将被清空。

注:如果启用了rsyslogd服务,则不能读取/proc/kmsg 文件(文件为空),同一时间只能用一种方法来获取日志文件。

3. 日志记录的接口:

1)内核空间:printk()

可以使用dmesg命令来查看,使用printk()打印的日志同时也会记录在/var/log/kern.log和/var/log/syslog。当然也可以关闭rsyslogd服务,通过读取/proc/kmsg来查看。

2)用户空间:syslog()函数和logger(logger可在命令行中直接执行)

void syslog(int priority, char*format,……);

打印的日志记录在 /var/log/syslog文件中。

注:据自己理解,syslog()打印的日志不会写到kernel ring buffer,只有printk才会写入kernel ring buffer。

 

4. 自定义日志记录路径

4.1 修改/etc/rsyslog.d/50-default.conf

在文件最后添加如下一行:

local0.* /var/log/my_logfile0

注:local0—local7均可

-----------------------------

解读文件:/etc/syslog.conf或者rsyslog.conf

配置文件定义格式为:facility.priority   action

facility ,可以理解为日志的来源或设备目前常用的

  auth    # 认证相关的

  authpriv   #权限,授权相关的

  cron    #任务计划相关的

  daemon  #守护进程相关的

  kern    #内核相关的

  lpr     #打印相关的

  mail    #邮件相关的

  mark    #标记相关的

  news    #新闻相关的

  security    #安全相关的,与auth类似

  user    #用户相关的

  uucp      #unix to unix cp 相关的

  local0-local7  #用户自定义

  *        # *表示所有类型

priority (log level) 日志级别从低到高

  debug       #程序或者系统调试信息

  info      #一般信息

  notice     #不影响正常功能,需要注意的信息

  warning/warn   #可能影响系统功能,需要提醒用户的重要事件

  err/error    #错误信息

  crit       # 比较严重的

  alert      #必须马上处理的,警告

  emerg/oanic     # 会导致系统不可用的

  *          # 所有日志级别

  none      # 跟 * 相反表示什么都没有

 action (动作) 日志记录位置

  系统上的绝对路径    #普通文件 如:/var/log/xxxx

  |             # 管道,发送给其他命令处理,数据进一步加工

  终端          # 终端   如  /dev/console

  @HOST         # 远程主机 如:@192.168.101.122 也可以后面更上该机器的对应路径 ,  @192.168.101.122:/var/log/xxxxx

  用户          # 系统用户,发送给此用户处理,按照此用户的日志来记录

  *            #登录到系统上的所有用户,一般emerg级别日志就是这样处理的

三种方式:unix域套接字、udp端口514以及特殊的设备/dev/klog  

大多数出现调用syslog向/dev/log这个套接字发送日记消息。

Device:发送syslog的设备

Relay:转发syslog的设备(Relay可能只是转发部分接收到的syslog消息,它同时表现为Relay和Collector)

Collector:接收syslog的设备

syslog消息的udp报文不能超过1024字节。

完整的syslog日志中包含日记的程序模块(Facility)、严重性(Severity | Level)、时间、主机名或ip、进程名、进程id和正文

完整的syslog消息由3部分组成,分别是PRI、HEADER和MSG(<30>Oct 9 22:33:20 hlfedora auditd[1787]: The audit daemon is exiting.),PRI:<30>。HEADER:Oct9...hlfedora。

PRI部分是由程序模块(Facility)<<3 | 严重性(Severity)组成:换句话说 Facility可以有32种,Severity可以有8种。

 Numerical        Facility  #日志类型
         Code
          0             kernel messages                  #内核信息
          1             user-level messages               #用户级别信息
          2             mail system                   #邮件系统
          3             system daemons                #系统信息
          4             security/authorization messages (note 1)       #安全认证信息(标注1)
          5             messages generated internally by syslogd     #由syslogd内部生成的消息
          6             line printer subsystem              #行式打印机子系统
          7             network news subsystem              #网络信息子系统
          8             UUCP subsystem                #UUCP子系统
          9             clock daemon (note 2)              #时钟守护进程(标注2)
         10             security/authorization messages (note 1)       #安全认证信息(标注2)
         11             FTP daemon                  #FTP守护进程
         12             NTP subsystem                  #NTP时钟同步子系统
         13             log audit (note 1)                #日志认证(标注1)
         14             log alert (note 1)                 #日志告警(标注1)
         15             clock daemon (note 2)              #时钟守护进程(标注2)
         16             local use 0  (local0)               #用户自定义日志来源标签
         17             local use 1  (local1)
         18             local use 2  (local2)
         19             local use 3  (local3)
         20             local use 4  (local4)
         21             local use 5  (local5)
         22             local use 6  (local6)
         23             local use 7  (local7)

Numerical         Severity  #日志级别
        Code
         0         Emergency: system is unusable
         1         Alert: action must be taken immediately
         2         Critical: critical conditions
         3         Error: error conditions
         4         Warning: warning conditions
         5         Notice: normal but significant condition
         6         Informational: informational messages
         7         Debug: debug-level messages

HEADER部分包括两个字段:时间和主机名

MSG部分分为两个部分:TAG和Content;TAG包含程序名称和进程PID,TAG后面用一个冒号隔开Content部分

RFC3195:用tcp代替udp,进行可靠的syslog消息

//将info或更高级别的消息送到/var/log/messages,除了mail以外。

//其中*是通配符,代表任何设备;none表示不对任何级别的信息进行记录。

*.info;mail.none;authpriv.none /var/log/messages

//将authpirv设备的任何级别的信息记录到/var/log/secure文件中,这主要是一些和认、权限使用相关的信息。

authpriv.* /var/log/secure

//将mail设备中的任何级别的信息记录到/var/log/maillog文件中,这主要是和电子邮件相关的信息。

mail.* /var/log/maillog

//将cron设备中的任何级别的信息记录到/var/log/cron文件中,这主要是和系统中定期执行的任务相关的信息。

cron.* /var/log/cron

//将任何设备的emerg级别的信息发送给所有正在系统上的用户。

*.emerg *

//将uucp和news设备的crit级别的信息记录到/var/log/spooler文件中。

uucp,news.crit /var/log/spooler

//将和系统启动相关的信息记录到/var/log/boot.log文件中。

local7.* /var/log/boot.log

---------------------------------------

基本语法格式

类型.级别[;类型.级别]  动作

news.=crit  /var/log/news.crit

‘=’特殊符号,如果存在说明只有本Severity的消息才进行处理,如果不存在则处理本Severity及其以下级别的消息

‘;'表示&&、'!'表示取反、’*'表示所有

 1 # Log all kernel messages to the console.
 2 # Logging much else clutters up the screen.
 3 #kern.*                            /dev/console
 4 
 5 # Log anything (except mail) of level info or higher.
 6 # Don't log private authentication messages!
 7 *.info;mail.none;authpriv.none;cron.none        /var/log/messages
 8 
 9 # The authpriv file has restricted access.
10 authpriv.*                        /var/log/secure
11 
12 # Log all the mail messages in one place.
13 mail.*                            -/var/log/maillog    ##  '-'分号代表是异步写入,非实时写入
14 
15 
16 # Log cron stuff
17 cron.*                            /var/log/cron
18 
19 # Everybody gets emergency messages
20 *.emerg                            *
21 
22 # Save news errors of level crit and higher in a special file.
23 uucp,news.crit                        /var/log/spooler
24 
25 # Save boot messages also to boot.log
26 local7.*                        /var/log/boot.log

 

 

动作:表示信息发送的目的地

  可以是日记文件(绝对路径),如果文件名前面加上减号表示不将日志信息同步刷新到磁盘上(使用写入缓存),这样可以提高日志写入性能,但是增加了系统崩溃后丢失日志的风险

  可以是远程主机(@host,host可以是ip或域名,默认在/etc/hosts文件下loghost这个别名已经指定给本机)

  可以是指定用户(user1,user2),如果指定用户已登入,那么他们将收到消息

客户端有两种方式开发:

   完全基于协议从底层开发,也就是直接写unix域套接字或者向UDP514发送定制消息

   基于库函数供上层应用使用

==================================================================================================

注意:

  一般随着时间的推移系统日志会越来越大,占用磁盘空间,增加内存和磁盘消耗,所以引出了进程logroate来进行日志按照自动一大小分割和保留规定时间日志,滚动覆盖历史日志

logrotate:日志文件会随着日志的增加而不断增大,从而带来效率的问题和空间使用问题,在常年运行的服务器上面,通常会有logrotate程序定期进行日志文件的轮替和删除工作。

配置文件/etc/logroate.conf 来定义不同的功能日志配置信息,里面可以定义日志的存储时间周期,日志分割文件大小,个数等;统一都放在/etc/logroate.d/目录下

# see "man logrotate" for details
# rotate log files weekly
weekly                        #周期

# keep 4 weeks worth of backlogs
rotate 4                       #文件个数 

# create new (empty) log files after rotating old ones
create                        #新文件创造动作

# uncomment this if you want your log files compressed
#compress

# RPM packages drop log rotation information into this directory
include /etc/logrotate.d              #存放目录

# no packages own wtmp -- we'll rotate them here
/var/log/wtmp {                     #这里定义每个不同功能日志时,除了上面的默认属性,
                              #如果自身未定义优先去查找自身定义的,如果没有才会用默认定义的,优先使用自身定义的 monthly minsize 1M                      #最小大小 create
0664 root utmp                #以默写用户创建,给予文件权限  rotate 1 } /var/log/btmp { missingok monthly minsize 1M create 0600 root utmp rotate 1 } # system-specific logs may be also be configured here.

 

posted @ 2019-07-16 20:02  一生只画眉  阅读(3529)  评论(0编辑  收藏  举报