需求:
回到顶部
工作中有一个在Linux(debian8)环境下运行的服务器程序,用python语言实现,代码中有不同优先级的日志需要记录,开发的时候都是使用python的logging模块输出到文件,示例代码如下:
1 import logging, os 2 3 logger = None 4 def get_logger(): 5 global logger 6 if not logger: 7 logger = logging.getLogger('ServerLog') 8 logger.setLevel(logging.INFO) 9 filehandler = logging.FileHandler(os.environ['HOME'] + '/Server.log', encoding='utf8')10 filehandler.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s - %(message)s"))11 logger.addHandler(filehandler)12 return logger13 14 def some_func():15 get_logger().info("call some_func")16 17 if __name__ == '__main__':18 some_func()
运行上面这段代码,就会在home目录下面产生一个server.log文件。
后来数据分析的部门说他们希望能够实时拿到一部分日志,他们有一台专门处理日志的服务器,那么怎么把日志发给他们呢?笔者之前并没有相关经验,数据分析部门的同事说,这种需求他们都是找运维人员帮忙。运维同事给出的方案很简单:产品把日志写到syslog,然后他们负责把带有某些关键字的日志转发给数据分析部门,在运维同事的指导下,把代码改成了这样:
1 import logging 2 import logging.handlers 3 4 logger = None 5 def get_logger(): 6 global logger 7 if not logger: 8 logger = logging.getLogger('ServerLog') 9 logger.setLevel(logging.INFO)10 11 sys_handler = logging.handlers.SysLogHandler('/dev/log', facility=logging.handlers.SysLogHandler.LOG_LOCAL0)12 syslog_tag = 'ServerLog'13 sys_handler.setFormatter(logging.Formatter(syslog_tag + ":%(asctime)s - %(name)s - %(levelname)s - %(message)s"))14 15 logger.addHandler(sys_handler)16 return logger17 18 def some_func():19 get_logger().info("call some_func")20 21 if __name__ == '__main__':22 some_func()
上面的代码修改了日志的输出形式,直观的感受就是从文件server.log 到了 /dev/log,但/dev/log对应的是SysLogHandler,并不是FileHandler,所以肯定不是一个普通的文件。此时,我有两个疑问:第一,这里我并没有将日志输出到home目录下的Server.log文件,但是程序运行的时候生成了这么一个文件;第二,怎么讲日志发送到数据分析部门的服务器。
不懂就问:
Q:新的代码下怎么生成Server.log文件,日志内容又是怎么转发到数据分析部门的服务器?
A: 这个是/etc/init.d/rsyslog这个后台程序根据/etc/rsyslog.conf 这个配置文件 将日志输出到不同的文件,包括网络文件,即其他服务器。看/etc/rsyslog.conf这个配置就明白了。
Q:OK,那python代码将文件输出到/dev/log跟