一、说明

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使用及相关说明的更多相关文章

  1. CentOS7系统64位下搭建Python3.6环境及相关细节工具部署文章收集

    (1)http://blog.csdn.net/chen798213337/article/details/70767902 问题描述: 安装Navicat管理数据库时,启动界面出现乱码情况. 解决办 ...

  2. Python3中的字符串相关操作

    Python3的字符串操作相关函数详解 字符串内建函数 1. capitalize() 将字符串中的第一个字符转换成大写,其他字母变成小写.例: >>> "hello Wo ...

  3. robotframework+python3+selenium之web相关关键字---第二集

    1.F5可查看所有关键字,如图: 2.浏览器相关关键字: 2.1  Open Browser    https://www.baidu.com  chrome    # 打开浏览器,rf默认使用火狐浏 ...

  4. Linux下安装python3及相关包

    Python3: sudo apt-get install python3 终端中输入python则进入python2,输入python3则进入python3 安装python2的相关包: sudo ...

  5. Log4j2常见使用示例及Syslog/Syslog-ng

    准备工作 打开http://logging.apache.org/log4j/,点击左侧Download,我下载的是Apache Log4j 2 binary (zip),目前是2.0.2版本.解压后 ...

  6. Python3+Selenium2完整的自动化测试实现之旅(六):Python单元测试模块Unittest运用

    一.Unittest单元测试框架简介 Unitest是Python下的一个单元测试模块,是Python标准库模块之一,安装完Python后就可以直接import该模块,能在单元测试下编写具体的测试用例 ...

  7. python2 与 python3的区别

    python2 与 python3的区别 几乎所有的python2程序都需要一些修改才能正常的运行在python3的环境下.为了简化这个转换过程,Python3自带了一个2to3的实用脚本.这个脚本会 ...

  8. Window下,利用Anaconda2创建jupyter-notebook的python3环境方法

    随着深度学习的火热,越来越多的人去学习和了解这门技术.而做算法的同学为了能够更快,更高效的写出相关的深度学习算法出来,需要比较方便的开发环境.今天主要介绍一下在jupyter notebook中,新增 ...

  9. 关于Python2和Python3之间的文本模型改变

    原文地址:http://python-notes.curiousefficiency.org/en/latest/python3/questions_and_answers.html#what-act ...

随机推荐

  1. Java集合大全

    上图为整理的集合类图关系,带对号标志的为线程安全类. 区别说明: 1.List Set Map Queue的区别List: 有序,可以多个元素引用相同的对象Set: 无序,不重复,不可以多个元素引用相 ...

  2. Vue-Cli 指南

    构建项目: vue create 文件夹名称 运行项目:(README文件查询) npm run serve

  3. CSS泣鬼神

    博主网站 一.CSS介绍和语法 CSS(Cascading Style Sheet,层叠样式表)定义如何显示HTML元素. 每个CSS样式由两个组成部分:选择器和声明.声明又包括属性和属性值.每个声明 ...

  4. APS助众生药业突破运营管理瓶颈

    众生药业一直致力于为了世界提供世界级的产品及服务,成立以来公司先后实施了ERP系统,CRM系统,WMS系统,OA系统,精益生产,朝着行业信息化水平领先的目标迈进. 但近年随着业务量的不断扩大,仅仅拥有 ...

  5. ORACLE隐藏参数查看及修改

    查看隐藏参数 select x.ksppinm name, y.ksppstvl value, y.ksppstdf isdefault, decode(bitand(y.ksppstvf,7),1, ...

  6. java 使用网建SMS发送短信验证码

    首先, 注册并登录网建用户, 新注册用户将获得5条的测试短信 网建短信通地址: http://sms.webchinese.cn/default.shtml 注册账号在此就不多做赘述了, 直接上代码 ...

  7. Linux文件服务管理之vsftpd

    简介 vsftpd是 "very secure FTP deamon"的缩写,是一个完全免费,开源的ftp服务器软件. 特点 小巧轻快,安全易用,支持虚拟用户.支持带宽限制等功能. ...

  8. How to: Create a C/C++ Union by Using Attributes (C#)

    [How to: Create a C/C++ Union by Using Attributes (C#)] 1.you can create what is known as a union in ...

  9. clickjacking 攻击

    文章:Web安全之点击劫持(ClickJacking) 点击劫持(ClickJacking)是一种视觉上的欺骗手段.大概有两种方式,一是攻击者使用一个透明的iframe,覆盖在一个网页上,然后诱使用户 ...

  10. 【转】Pandas学习笔记(三)修改&添加值

    Pandas学习笔记系列: Pandas学习笔记(一)基本介绍 Pandas学习笔记(二)选择数据 Pandas学习笔记(三)修改&添加值 Pandas学习笔记(四)处理丢失值 Pandas学 ...