Python3+syslog使用及相关说明

一、说明

1.1 背景说明

syslog这个东西,最早接触是在Z公司做基线安全加固的时候有启用远程日志服务器一项,然后当时还写整理了一篇“rsyslog+loganalyzer远程日志系统搭建教程(CentOS6.8)”;这造成的结果就是一直先入为主地认为syslog就是做远程日志用的,近段时间碰到比较多syslog的问题,多加了解后发现这是一个比较大的误解。

去O公司面试的时候,被问syslog的进程叫什么配置文件在哪里,然后答守护进程是syslogd配置文件应该在/etc目录下具体名字不记得了。

过后问之前Z公司做系统集成的同事,他的回答也和我一样,然后说我应当当场反怼面试官syslog还可以做远程日志他知道吗。我当时的反应是,怼不动啊兄弟,syslog难道不是本来就是接收远程日志用的吗,似乎我的理解有点错误啊。

回头再问领导,他的回答也和我一样,然后他问你知道哪些日志过syslog哪些日志不过syslog吗。我不知道,但到此我基本知道syslog确实是先处理本地日志用的。

前段时间去T公司面试,又被问系统日志一般在/var/log目录下如果想要改变日志格式该如何操作,综合之前的认识答我没这么配置过但我推测应该是通过syslog配置文件/etc/syslog.conf。

 

1.2 syslog用途说明

在Z公司的时候知道了syslog,另外还知道dmsg,当时只是按部就搬看磁盘网卡等硬件问题时就用dmsg看;直到领导说内核态的日志运dmsg用户态日志过syslog(原话应该不是这样),才意识到有这么个区分关系。

现在感觉应该这么理解,syslog是一个用户态的进程,如果硬件和内核都没就绪那肯定就没到用户态进程启动这一步,那日志想过syslog也是不可能的,这时日志就发往dmsg;syslog就绪后内核的日志也可以过syslog。

syslog是一个可以记录日志的服务进程,在确认这一事实后还有两个疑问,“过syslog”到底是什么意思为什么日志一定要过syslog?如果我想自己的打印的日志“过syslog”应当怎么操作?

我们平时打印日志一般都是使用print或者logging打印,而对于一个系统会有成百上千个应用,如果每个应用都自己print或logging一是说工作重复二是说格式很难统一三是说日志配置散落在各地很难管理,此时我们何不专门启动一个服务专门管理日志,其他进程只管把日志发给他他来专门记录呢?这正是syslog的设计来由。回到为什么日志一定要过syslog这个问题上来,日志在技术上确实不一定要过syslog,这只是linux系统开发者的约定俗成。(nginx等应用开发者也跟着使用syslog)

 至于怎么使用syslog,简单而言就是先使用openlog()打开通道,然后使用syslog()发出日志,最后使用closelog()关闭通道。我们后边再以python具体演示。

 

1.3 syslog配置及日志格式说明

20210831更新:rsyslog配置建议直接看“man rsyslog.conf”,还是比较清楚的

syslog基本已被rsyslog代替,相应的配置文件也就改成了/etc/rsyslog.conf。Ubuntu 16.04版本内容如下:

#  /etc/rsyslog.conf    Configuration file for rsyslog.
#
#                       For more information see
#                       /usr/share/doc/rsyslog-doc/html/rsyslog_conf.html
#
#  Default logging rules can be found in /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
#module(load="imudp")
#input(type="imudp" port="514")

# provides TCP syslog reception
#module(load="imtcp")
#input(type="imtcp" port="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

#
# Include all config files in /etc/rsyslog.d/
#
$IncludeConfig /etc/rsyslog.d/*.conf
View Code

基本都是一些公共能力的配置,所各项名字及说名大概也能知道其意思,最主要的还是在最后包含了/etc/rsyslog.d/目录下的.conf文件

/etc/rsyslog.d/目录下有20-ufw.conf和50-default.conf两个文件;首先20和50这个应该是和/etc/security/limits.conf.d一样开头数值小的先被加载大的后被加载,后被加载的可覆盖之前加载的;然后20-ufw.conf是针对内核生成的防火墙日志的配置文件,我不懂为什么单独出来,这里主要讲50-default.conf的格式,50-default.conf在Ubuntu 16.04版本默认内容如下:

#  Default rules for rsyslog.
#
#                       For more information see rsyslog.conf(5) and /etc/rsyslog.conf

#
# First some standard log files.  Log by facility.
#
auth,authpriv.*                 /var/log/auth.log
*.*;auth,authpriv.none          -/var/log/syslog
#cron.*                         /var/log/cron.log
#daemon.*                       -/var/log/daemon.log
kern.*                          -/var/log/kern.log
#lpr.*                          -/var/log/lpr.log
mail.*                          -/var/log/mail.log
#user.*                         -/var/log/user.log

#
# Logging for the mail system.  Split it up so that
# it is easy to write scripts to parse these files.
#
#mail.info                      -/var/log/mail.info
#mail.warn                      -/var/log/mail.warn
mail.err                        /var/log/mail.err

#
# Logging for INN news system.
#
news.crit                       /var/log/news/news.crit
news.err                        /var/log/news/news.err
news.notice                     -/var/log/news/news.notice

#
# Some "catch-all" log files.
#
#*.=debug;\
#       auth,authpriv.none;\
#       news.none;mail.none     -/var/log/debug
#*.=info;*.=notice;*.=warn;\
#       auth,authpriv.none;\
#       cron,daemon.none;\
#       mail,news.none          -/var/log/messages

#
# Emergencies are sent to everybody logged in.
#
*.emerg                                :omusrmsg:*

#
# I like to have messages displayed on the console, but only on a virtual
# console I usually leave idle.
#
#daemon,mail.*;\
#       news.=crit;news.=err;news.=notice;\
#       *.=debug;*.=info;\
#       *.=notice;*.=warn       /dev/tty8

# The named pipe /dev/xconsole is for the `xconsole' utility.  To use it,
# you must invoke `xconsole' with the `-file' option:
# 
#    $ xconsole -file /dev/xconsole [...]
#
# NOTE: adjust the list below, or you'll go crazy if you have a reasonably
#      busy site..
#
daemon.*;mail.*;\
        news.err;\
        *.=debug;*.=info;\
        *.=notice;*.=warn       |/dev/xconsole
View Code

其实归结起来就如下一条配置格式:

facility[,facility].priority_level[;facility[,facility].priority_level] [-]log_file_path

[]----表示可选

facility----生成日志的设备(服务)。包括LOG_AUTH、LOG_AUTHPRIV、LOG_CRON、LOG_DAEMON、LOG_FTP、LOG_KERN、LOG_LOCAL0-7、LOG_LPR、LOG_MAIL、LOG_NEWS、LOG_SYSLOG、LOG_USER、LOG_UUCP。我们自己写程序去调用syslog时,默认以USER身份生成。

priority_level----日志优先级别。由轻到重依次包括LOG_DEBUG、LOG_INFO、LOG_NOTICE、LOG_WARNING、LOG_ERR、LOG_CRIT、LOG_ALERT、LOG_EMERG。我们写程序未指定时默认是INFO

log_file_path----前边指定的日志及日志级别要输出到的日志文件的路径。

更多说明参见man syslog。

 

二、python3使用syslog代码实现

 我们前面说使用syslog,总的流程就是先使用openlog()打开通道,然后使用syslog()发出日志,最后使用closelog()关闭通道。

这三个函数在python中的定义如下:

# ident----不太懂
# logoption----日期和日志内容之间要要多打印的信息
# logoption----可为LOG_PID, LOG_CONS, LOG_NDELAY,LOG_ODELAY, LOG_NOWAIT, LOG_PERROR
# facility----声称自己是何种设备
openlog([ident[, logoption[, facility]]])

# priority----日志优先级;默认是LOG_INFO
# message----要输出的日志信息
syslog([priority,] message)

# 关闭
closelog()

在python中你并不需要调用openlog()和closelog()去打开和关闭syslog通道,直接使用syslog()发送日志即可;但使用openlog则可指定多打印的信息及另声称自己是何种设备:

import syslog

# 以默认的LOG_INFO级别,直接发送日志信息
# 最终输出到哪个文件,要看配置了user.info配置输出到哪个文件
syslog.syslog('info, send syslog directly')

# 以LOG_WARNING级别,直接发送日志信息
# 最终输出到哪个文件,要看配置了user.warning配置输出到哪个文件
# 注意syslog.LOG_WARNNING中的syslog,是python的syslog模块,而不是Linux中的syslog设备
syslog.syslog(syslog.LOG_WARNING, 'warnning,send syslog directly')

# 使用openlog,则可指定多打印的信息及另声称自己是何种设备
syslog.openlog(logoption=syslog.LOG_PID, facility=syslog.LOG_MAIL)
# 最终输出到哪个文件,要看emil.info配置输出到了哪个文件
syslog.syslog('send syslog support by openlog')

从1.3小节的50-default.conf默认配置可以看到,*.*都会被发送到/var/log/syslog,user设备是没有指定专门的日志文件,mail.*则被发送到/var/log/mail.log。

所以运行以上代码的期望结果是:三次日志打印都被发送到/var/log/syslog,另外对于最后的一次打印还会发送到/var/log/mail.log。结果也正是如此,如下:

 

参考:

https://docs.python.org/3/library/syslog.html

posted on 2019-08-27 14:05  诸子流  阅读(6766)  评论(0编辑  收藏  举报