python logging rsyslog混合使用
简介:
企业规模大了,场景业务多了,日志不能再分散处理了。那么第一选择就是日志服务器,一台服务器就可以查看所有业务的日志,当然,也要有专门的数据库存储日志,专门的WEB浏览日志。
作为linux的默认日志服务,rsyslog就是我们的第一选择了,它即是linux系统的日志服务,也可以配置开放端口作为中央日志服务器。
rsyslog能够接受从各种各样的来源,将其输入,输出的结果到不同的目的地。rsyslog可以提供超过每秒一百万条消息给目标文件。
简单说,我们写python程序的时候,日志使用logging模块,是可以直接输出到远程的rsyslog中央日志服务器的。
一:安装rsyslog
我还是喜欢docker部署这个东西
三个文件:
rsyslog(dockerfile)
from alpine:3.14 MAINTAINER jackadam<jackadam@sina.com> #变更源 # 安装包源切到中科大, 国内访问加速 RUN { \ echo 'http://mirrors.ustc.edu.cn/alpine/v3.14/main'; \ echo 'http://mirrors.ustc.edu.cn/alpine/v3.14/community'; \ echo 'http://mirrors.ustc.edu.cn/alpine/edge/main'; \ echo 'http://mirrors.ustc.edu.cn/alpine/edge/community'; \ echo 'http://mirrors.ustc.edu.cn/alpine/edge/testing'; \ } > /etc/apk/repositories # 设置默认时区为亚洲/上海 (没有北京可选) RUN apk upgrade && \ apk add --no-cache tzdata apk-tools rsyslog rsyslog-mysql && \ cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \ apk del tzdata COPY rsyslog.conf /etc/ #开放端口 EXPOSE 514/udp ENTRYPOINT ["rsyslogd", "-n"]
rsyslog.conf
# rsyslogd.conf # # if you experience problems, check: # http://www.rsyslog.com/troubleshoot #### MODULES #### module(load="imuxsock") # local system logging support (e.g. via logger command) #module(load="imklog") # kernel logging support (previously done by rklogd) module(load="immark") # --MARK-- message support module(load="imudp") # UDP listener support module(load="imtcp") # TCP listener support input(type="imudp" port="514") input(type="imtcp" port="514") # Log all kernel messages to the console. # Logging much else clutters up the screen. #kern.* action(type="omfile" file="/dev/console") # Log anything (except mail) of level info or higher. # Don't log private authentication messages! *.info;mail.none;authpriv.none;cron.none action(type="omfile" file="/var/log/messages") # The authpriv file has restricted access. authpriv.* action(type="omfile" file="/var/log/secure") # Log all the mail messages in one place. mail.* action(type="omfile" file="/var/log/maillog") # Log cron stuff cron.* action(type="omfile" file="/var/log/cron") # Everybody gets emergency messages *.emerg action(type="omusrmsg" users="*") # Save news errors of level crit and higher in a special file. uucp,news.crit action(type="omfile" file="/var/log/spooler") # Save boot messages also to boot.log local7.* action(type="omfile" file="/var/log/boot.log") # Include all .conf files in /etc/rsyslog.d $IncludeConfig /etc/rsyslog.d/*.conf
rsyslog.yaml
version: '3.3' services: rsyslog: build: context: . dockerfile: rsyslog privileged: true ports: - "514:514/tcp" - "514:514/udp" volumes: - ./data:/var/log restart: always
二:运行
docker-compose -f rsyslog.yaml build
docker-compose -r rsyslog.yaml up -d
docker ps -a
三:python测试
import logging import logging.config import os import socket from logging.handlers import SysLogHandler BASE_DIR = os.path.dirname(os.path.abspath(__file__)) DEBUG = True # 标记是否在开发环境 LOGGING = { # 基本设置 'version': 1, # 日志级别 'disable_existing_loggers': False, # 是否禁用现有的记录器 # 日志格式集合 'formatters': { # 标准输出格式 'rsyslog': { # [具体时间][线程名:线程ID][日志名字:日志级别名称(日志级别ID)] [输出的模块:输出的函数]:日志内容 'format': '[%(name)s][%(asctime)s][%(threadName)s:%(thread)d][%(name)s:%(levelname)s(%(lineno)d)][%(' 'module)s:%(funcName)s]:%(message)s ' } }, # 处理器集合 'handlers': { # 输出到控制台 'console': { 'level': 'DEBUG', # 输出信息的最低级别 'class': 'logging.StreamHandler', 'formatter': 'rsyslog', # 使用standard格式 }, # 输出到rsyslog 'rsyslog': { 'class': 'logging.handlers.SysLogHandler', 'address': ("10.0.0.107", 514,), 'facility': logging.handlers.SysLogHandler.LOG_UUCP, 'formatter': 'rsyslog', 'socktype': socket.SOCK_DGRAM, # 'socktype': socket.SOCK_STREAM, }, }, # 日志管理器集合 'loggers': { # 管理器 'default': { 'handlers': ['console', 'rsyslog'], 'level': 'DEBUG', 'propagate': True, # 是否传递给父记录器 }, } } def log_main(): # 加载前面的标准配置 logging.config.dictConfig(LOGGING) # 获取loggers其中的一个日志管理器 new_logger = logging.getLogger("default") return new_logger logger = log_main() logger.debug('文件debug? ') logger.info('汉字information') logger.warning('this is warning message') logger.error('this is error message') logger.fatal('this is fatal message, it is same as logger.critical') logger.critical('this is critical message')
四:说明
dockerfile yaml就不解释了
rsyslog.conf配置文件:
#### MODULES #### module(load="imuxsock") # local system logging support (e.g. via logger command) #module(load="imklog") # kernel logging support (previously done by rklogd) module(load="immark") # --MARK-- message support module(load="imudp") # UDP listener support module(load="imtcp") # TCP listener support input(type="imudp" port="514") input(type="imtcp" port="514")
根据自己的需要打开。我配置了udp,tcp,监听514端口。
# Save news errors of level crit and higher in a special file. uucp,news.crit action(type="omfile" file="/var/log/spooler")
这里是设施和优先级
facility:设施,从功能或程序上对日志收集进行分类
我的python示例当中选了uucp
ID en zh
0 kern 内核消息
1 user 用户级消息
2 mail 邮件系统
3 daemon 其他系统守护程序
4 auth/authpriv 安全/授权消息
5 syslog rsyslogd内部生成的消息
6 lpr 行式打印机子系统
7 news 网络新闻子系统
8 uucp UUCP子系统
9 cron crond消息
10 security security/authorization messages
11 ftp ftp进程
12 ntp ntp 子系统
13 logaudit log audit
14 logalert log alert
15 clock clock daemon (note 2)
16~23 local0~local7 本地使用,用户自定义使用的日志类型
priority:优先级,日志级别(由低到高)
这个配置示例中有news.crit级别
ID | en | zh |
---|---|---|
0 | emerg | 系统不稳定 |
1 | alert | 必须立即采取行动 |
2 | crit | 临界条件 |
3 | err | 错误条件 |
4 | warning | 警告条件 |
5 | notice | 正常错误的严重状况 |
6 | info | 信息性消息 |
7 | debug | 调试级消息 |