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配置及日志格式说明
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
基本都是一些公共能力的配置,所各项名字及说名大概也能知道其意思,最主要的还是在最后包含了/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
其实归结起来就如下一条配置格式:
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
Python3+syslog使用及相关说明的更多相关文章
- CentOS7系统64位下搭建Python3.6环境及相关细节工具部署文章收集
(1)http://blog.csdn.net/chen798213337/article/details/70767902 问题描述: 安装Navicat管理数据库时,启动界面出现乱码情况. 解决办 ...
- Python3中的字符串相关操作
Python3的字符串操作相关函数详解 字符串内建函数 1. capitalize() 将字符串中的第一个字符转换成大写,其他字母变成小写.例: >>> "hello Wo ...
- robotframework+python3+selenium之web相关关键字---第二集
1.F5可查看所有关键字,如图: 2.浏览器相关关键字: 2.1 Open Browser https://www.baidu.com chrome # 打开浏览器,rf默认使用火狐浏 ...
- Linux下安装python3及相关包
Python3: sudo apt-get install python3 终端中输入python则进入python2,输入python3则进入python3 安装python2的相关包: sudo ...
- Log4j2常见使用示例及Syslog/Syslog-ng
准备工作 打开http://logging.apache.org/log4j/,点击左侧Download,我下载的是Apache Log4j 2 binary (zip),目前是2.0.2版本.解压后 ...
- Python3+Selenium2完整的自动化测试实现之旅(六):Python单元测试模块Unittest运用
一.Unittest单元测试框架简介 Unitest是Python下的一个单元测试模块,是Python标准库模块之一,安装完Python后就可以直接import该模块,能在单元测试下编写具体的测试用例 ...
- python2 与 python3的区别
python2 与 python3的区别 几乎所有的python2程序都需要一些修改才能正常的运行在python3的环境下.为了简化这个转换过程,Python3自带了一个2to3的实用脚本.这个脚本会 ...
- Window下,利用Anaconda2创建jupyter-notebook的python3环境方法
随着深度学习的火热,越来越多的人去学习和了解这门技术.而做算法的同学为了能够更快,更高效的写出相关的深度学习算法出来,需要比较方便的开发环境.今天主要介绍一下在jupyter notebook中,新增 ...
- 关于Python2和Python3之间的文本模型改变
原文地址:http://python-notes.curiousefficiency.org/en/latest/python3/questions_and_answers.html#what-act ...
随机推荐
- python类的实例化
class Person(object): # 创建类 def __init__(self, name): # 构造函数 self.name = name def getName(self): # 类 ...
- [快捷键的使用] IntelliJ IDEA 将数据库里面的表转化为对象
本文讲述IntelliJ IDEA 多行编辑快捷键的使用,希望能帮到新人提高效率. 注意:在笔记本键盘上操作的方法. 数据库连接工具使用SQLyog 第一步: 从数据里面将文本拷贝到User类里面. ...
- Java中assert(断言)的使用
Java中assert(断言)的使用 1.Eclipse中默认assert(断言)是关闭,开启方式如下: 简单来说:就是设置一下jvm的参数,参数是-enableassertions或者-ea(推荐) ...
- mysql 带外注入
带外通道 有时候注入发现并没有回显,也不能利用时间盲注,那么就可以利用带外通道,也就是利用其他协议或者渠道,如http请求.DNS解析.SMB服务等将数据带出. payload SELECT LOAD ...
- 利用shell脚本将Oracle服务器中数据定时增量刷新到ftp服务器中
现有需求:将oracle数据库中的数据准实时同步至某ftp服务器中,以便前端应用能定时从ftp服务器目录中取增量数据 方法:将加工脚本写为存储过程,然后利用shell脚本执行该存储过程并将增量数据导出 ...
- docker部署zabbix
我相信大家都已经会再物理机上跑zabbix并且监控了,那么有没有想过在docker中跑zabbix?下面咱们来看看如何在docker中搭建zabbix并且监控 部署环境 2台物理机机器: zabbix ...
- Java只有值传递(Java值传递还是引用传递?)
转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/10830521.html 一:区分Java数据类型.变量类型 Java数据类型分两种:基本数据类型.引用类型. ...
- Peekaboo(2019年上海网络赛K题+圆上整点)
目录 题目链接 题意 思路 代码 题目链接 传送门 题意 你的位置在\(O(0,0)\),\(A\)的位置为\((x_1,y_1)\),\(B\)的位置为\((x_2,y_2)\),现在已知\(a=O ...
- centos下的python无法打印中文
Python3中输出中文的方法如下: 方法一:在环境变量中,设置PYTHONIOENCODING=utf-8 以centos为例执行: export PYTHONIOENCODING=utf-8 方法 ...
- robotframework-selenium2library各个版本
https://github.com/robotframework/Selenium2Library/downloads