Loading

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"]
View Code

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
View Code

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
View Code

二:运行

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')
View Code

四:说明

 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级别

 

IDenzh
0 emerg 系统不稳定
1 alert 必须立即采取行动
2 crit 临界条件
3 err 错误条件
4 warning 警告条件
5 notice 正常错误的严重状况
6 info 信息性消息
7 debug 调试级消息
posted @ 2021-04-01 01:12  上官飞鸿  阅读(825)  评论(0编辑  收藏  举报