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 ...
随机推荐
- MySQL 分库分表及其平滑扩容方案
转自:https://kefeng.wang/2018/07/22/mysql-sharding/ 众所周知,数据库很容易成为应用系统的瓶颈.单机数据库的资源和处理能力有限,在高并发的分布式系统中,可 ...
- ElasticSearch(九)e代驾使用Elasticsearch流程设计(Yii1版本)
一.控制器层的更新.添加.删除 class AddKnowledgeAction extends CAction { //add and update public function actionPo ...
- JAVA中的四种JSON解析方式详解
JAVA中的四种JSON解析方式详解 我们在日常开发中少不了和JSON数据打交道,那么我们来看看JAVA中常用的JSON解析方式. 1.JSON官方 脱离框架使用 2.GSON 3.FastJSON ...
- c/c++程序中内存区划分
转自:http://wenzongliang.iteye.com/blog/1866629 操作系统启动程序时会加载程序代码到内存(叫程序的代码区),然后创建进程PCB为进程分配内存资源(数据区,32 ...
- Linux命令——lsmod
参考:8 LSMOD, RMMOD, MODPROBE, AND MODINFO COMMAND EXAMPLES IN LINUX Linux lsmod command 简介 lsmod显示(或“ ...
- python常用库(转)
转自http://www.west999.com/info/html/wangluobiancheng/qita/20180729/4410114.html Python常用的库简单介绍一下 fuzz ...
- 部署ceph存储集群及块设备测试
集群环境 配置基础环境 添加ceph.repo wget -O /etc/yum.repos.d/ceph.repo https://raw.githubusercontent.com/aishang ...
- 微信H5页面分享获取JS-SDK
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115 微信开发文档: 生成签名之前必须先了解一下jsapi_ti ...
- javascript中 encodeURIComponent() 与 encodeURI() 的区别
前言:js 中仅有的几个全局函数中,有两个全局函数可以用来编码url 字符串. 一.encodeURIComponent() 将转义用于分隔 URI 各个部分的标点符号 ,也就是可以编码 " ...
- 洛谷 P2996 [USACO10NOV]拜访奶牛Visiting Cows
P2996 传送门 题意: 给你一棵树,每一条边上最多选一个点,问你选的点数. 我的思想: 一开始我是想用黑白点染色的思想来做,就是每一条边都选择一个点. 可以跑两边一遍在意的时候染成黑,第二遍染成白 ...