syslog生命周期

  1. 一:生命周期
  2. (1)系统中存在syslog服务(或者是rsyslog),该服务有一个配置文件,配置文件命名为syslog.conf(rsyslog.conf)。
  3. syslog.conf形式:
  4. 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
    前面第一个字段是facility,消息类型;“.”之后的字段是priority,优先级。形式为facility. priority。后面是写入到哪个文件。
  5. (2)linux有openlog等系统调用,这类系统背后打开了与syslog服务交流的通道。
  6. #include <syslog.h>//头文件
  7. void openlog (char*ident,int optionint facility);
  8. void syslog(int prioritychar*format,……);
  9. void closelog();

  1. #include <syslog.h>
  2. int main(int argc, char**argv) {
  3.     openlog("zooyo", LOG_CONS| LOG_PID,LOG_FTP);//LOG_FTP指明为FTP文件传输协议,即facility
  4.     syslog(LOG_INFO,                                                              //LOG_INFO指明为优先级,即priority
  5.            "This is a syslog test message generated by program %sn", //消息
  6.            argv[0]);
  7.     closelog();
  8.     return 0;
  9. }
  10. 调用之后,syslog服务读取配置文件,根据不同的类型和优先级,写入各个不同的Log文件。

log文件内容形式为

Oct 10 23:54:32 kali zooyo[31067]: This is a syslog test message
Oct 10 23:57:08 kali zooyo[31138]: This is a syslog test message
Oct 11 00:00:10 kali zooyo[31201]: This is a syslog test message!


openlog函数:

第一个参数ident将是一个标记,ident所表示的字符串将固定地加在每行日志的前面以标识这个日志,通常就写成当前程序的名称以作标记。

第二个参数option是下列值取与运算的结果:
LOG_CONS        直接写入系统控制台,如果有一个错误,同时发送到系统日志记录。
LOG_NDELAY    立即打开连接(通常,打开连接时记录的第一条消息)。
LOG_NOWAIT   不要等待子进程,因为其有可能在记录消息的时候就被创建了(GNU C库不创建子进程,所以该选项在Linux上没有影响。)
LOG_ODELAY    延迟连接的打开直到syslog函数调用。(这是默认情况下,需要没被指定的情况下。)
LOG_PERROR   (不在SUSv3情况下)同时输出到stderr(标准错误文件)。
LOG_PID          包括每个消息的PID。

第三个参数facility是用来指定记录消息程序的类型。它让指定的配置文件,将以不同的方式来处理来自不同方式的消息。

它的值可能为 LOG_KERN、LOG_USER、LOG_MAIL、LOG_DAEMON、LOG_AUTH、LOG_SYSLOG、LOG_LPR、LOG_NEWS、LOG_UUCP、LOG_CRON 或 LOG_AUTHPRIV。

LOG_AUTH ——认证系统:login、su、getty等 
LOG_AUTHPRIV ——同LOG_AUTH,但只登录到所选择的单个用户可读的文件中 
LOG_CRON           ——cron守护进程 
LOG_DAEMON       ——其他系统守护进程,如routed 
LOG_FTP ——文件传输协议:ftpd、tftpd 
LOG_KERN ——内核产生的消息 
LOG_LPR ——系统打印机缓冲池:lpr、lpd 
LOG_MAIL ——电子邮件系统 
LOG_NEWS ——网络新闻系统 
LOG_SYSLOG ——由syslogd(8)产生的内部消息 
LOG_USER ——随机用户进程产生的消息 
LOG_UUCP ——UUCP子系统 
LOG_LOCAL0~LOG_LOCAL7 ——为本地使用保留 

Syslog为每个事件赋予几个不同的优先级: 
LOG_EMERG ——紧急情况 
LOG_ALERT ——应该被立即改正的问题,如系统数据库破坏 
LOG_CRIT ——重要情况,如硬盘错误 
LOG_ERR ——错误 
LOG_WARNING ——警告信息 
LOG_NOTICE ——不是错误情况,但是可能需要处理 
LOG_INFO ——情报信息 
LOG_DEBUG ——包含情报的信息,通常旨在调试一个程序时使用





### 使用Flask实现Syslog功能 要通过 Flask 实现 Syslog 功能,可以利用 Python 的 `logging` 和 `logging.handlers.SysLogHandler` 模块。以下是具体方法: #### 1. 配置 Flask 应用中的 Syslog 日志记录器 为了将日志发送到远程或本地的 Syslog 服务器,需要设置一个 `SysLogHandler` 并将其添加到 Flask 的日志记录器中。 ```python import logging from logging.handlers import SysLogHandler from flask import Flask app = Flask(__name__) # 设置 Syslog 处理器 syslog_handler = SysLogHandler(address=&#39;/dev/log&#39;) # 对于 Linux 系统 # 或者对于 Windows 系统,使用 (&#39;localhost&#39;, 514) syslog_handler.setLevel(logging.INFO) # 定义日志格式 formatter = logging.Formatter(&#39;%(asctime)s - %(levelname)s - %(message)s&#39;) syslog_handler.setFormatter(formatter) # 将处理器添加到应用的日志记录器 app.logger.addHandler(syslog_handler) app.logger.setLevel(logging.INFO) @app.route(&#39;/&#39;) def index(): app.logger.info(&#39;访问主页&#39;) return "欢迎来到 Flask Syslog 测试页面" if __name__ == &#39;__main__&#39;: app.run() ``` 此代码片段展示了如何配置 Flask 应用以向本地 Syslog 发送日志消息[^2]。 --- #### 2. 自定义 Syslog 接收器(可选) 如果希望 Flask 不仅作为日志发送方,还能够接收来自其他设备的 Syslog 消息,则需要创建一个 UDP/TCP Socket 来监听传入的消息。以下是一个简单的 UDP Syslog 接收器示例: ```python import socketserver import re from datetime import datetime class SyslogUDPHandler(socketserver.BaseRequestHandler): def handle(self): data = bytes.decode(self.request[0].strip()) # 获取接收到的数据 pattern = r&#39;^<(\d+)>(\S+)\s+(\S+)\s+(\S+)\s+(.*)$&#39; match = re.match(pattern, data) if match: priority = int(match.group(1)) timestamp_str = f"{match.group(2)} {match.group(3)}" hostname = match.group(4) message = match.group(5) try: timestamp = datetime.strptime(timestamp_str, "%b %d %H:%M:%S").replace(year=datetime.now().year) except ValueError: timestamp = None print(f"[{timestamp}] Host: {hostname}, Message: {message}") else: print("无法解析的消息:", data) if __name__ == "__main__": HOST, PORT = "0.0.0.0", 514 with socketserver.UDPServer((HOST, PORT), SyslogUDPHandler) as server: print(f"启动 Syslog 服务器,监听地址: udp://{HOST}:{PORT}") server.serve_forever() ``` 这段代码实现了基本的 Syslog UDP 接收器逻辑[^6]。它会捕获所有发送至指定端口 (默认为 514) 的数据包,并尝试提取时间戳、主机名以及实际消息内容。 > **注意**: 若要处理 TCP 协议下的 Syslog 请求,请改用 `socketserver.StreamRequestHandler` 类替代上述例子中的 `BaseRequestHandler`。 --- #### 3. 注册 Flask 应用为系统服务以便长期运行 为了让 Flask 应用能够在后台持续工作,在生产环境中通常建议借助工具如 Gunicorn 结合 Nginx 反代部署[^3];或者直接通过操作系统自带的服务管理机制控制其生命周期。例如在 Ubuntu 上可通过编写 Systemd Service 文件完成这一目标: ```ini [Unit] Description=Gunicorn instance to serve my_flask_app After=network.target [Service] User=user_name Group=www-data WorkingDirectory=/path/to/your/app Environment="PATH=/home/user_name/.local/bin" ExecStart=/home/user_name/.local/bin/gunicorn --workers 3 --bind unix:my_flask_app.sock -m 007 wsgi:app [Install] WantedBy=multi-user.target ``` 保存该文件路径 `/etc/systemd/system/my_flask_app.service` 后执行命令加载新服务即可生效。 --- ### 总结 综上所述,可以通过调整 Flask 默认的日志配置使其支持 Syslog 输出形式,同时也可以构建独立模块充当专门化的 syslog-server 角色服务于整个网络环境内的各类设施需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值