Python3+syslog使用及相关说明

1、说明

1.1 背景说明

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

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

事后问以前Z公司作系统集成的同事,他的回答也和我同样,而后说我应当当场反怼面试官syslog还能够作远程日志他知道吗。我当时的反应是,怼不动啊兄弟,syslog难道不是原本就是接收远程日志用的吗,彷佛个人理解有点错误啊。linux

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

前段时间去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”应当怎么操做?tcp

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

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

 

1.3 syslog配置及日志格式说明

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-七、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。

 

2、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

相关文章
相关标签/搜索