• syslog快速开始


    syslog快速开始

    一、什么是syslog协议

    • RFC3164 (https://www.ietf.org/rfc/rfc3164.txt)
    • RFC5424 (https://www.ietf.org/rfc/rfc5424.txt)

    Syslog 协议最初由 Eric Allman 编写,并在 RFC 3164 中定义。消息通过 IP 网络发送到事件消息收集器或系统日志服务器。Syslog 使用用户数据报协议 (UDP) 端口 514进行通信。虽然,系统日志服务器不会发回收到消息的确认。自 2009 年以来,系统日志已由 IETF 在RFC 5424 中标准化。

    Syslog协议没有对日志的内容做任何限制,可以根据需要自定义日志的格式和内容。 Syslog协议使用一个中心日志服务器来接收和存储所有的日志消息。这个服务器称为Syslog服务器

    syslog发展史

    syslog协议多年来,用于syslog协议的标准RFC是RFC3194,现在,RFC5424是针对syslog协议提出的新标准草案。

    换句话说,RFC5424取代了RFC3194。RFC5424是对较早的syslog协议的急需的改进。协议的最大变化之一是遵循RFC3339的时间戳规范。在较旧的协议在时间戳方面没有指定太多。但是在RFC5424收到的日志消息中至少包含年份,月份,日期,小时和秒。

    syslog使用场景

    系统日志记录:syslog最常见的用途是记录操作系统和应用程序的日志信息。这些日志信息可以用于故障排除、安全审计和性能分析等方面。

    安全审计:syslog可以记录安全事件,例如登录失败、访问拒绝和恶意软件检测等。这些事件可以用于安全审计和监控。

    网络设备管理:syslog可以用于记录网络设备的日志信息,例如路由器、交换机和防火墙等。这些日志信息可以用于网络故障排除和性能分析。

    应用程序日志记录:syslog可以用于记录应用程序的日志信息,例如Web服务器、数据库和邮件服务器等。这些日志信息可以用于应用程序故障排除和性能分析。

    日志聚合:syslog可以将来自多个设备和应用程序的日志信息聚合到一个中心位置。这些日志信息可以用于全面的故障排除和性能分析。

    syslog 是一种标准的日志消息传输协议,主要用于在计算机系统中的不同组件之间进行日志消息的收集、传输和存储。它可以用于发送各种类型的日志,包括系统级别的日志、应用程序日志以及其他业务相关的日志。

    对于业务系统的日志,你可以通过在应用程序中集成 syslog 客户端库来将日志消息发送到 syslog 服务器。这样,你可以在业务系统中使用 syslog 协议来传输和收集日志,以便集中存储、分析和监控。

    例如,使用syslog发送HTTP上次下载请求日志

    Syslog消息格式

    Syslog协议格式通常由三个部分组成:头部、消息体和可选的结尾符。

    下面是一个标准的Syslog消息格式:

    < PRI > TIMESTAMP HOSTNAME TAG: MESSAGE
    
    • 1

    其中,各字段含义如下:

    :消息的优先级,由Facility和Severity两个部分组成。Facility表示日志来源类型,Severity表示日志级别。它们可以通过简单相加得到一个1~191之间的整数值。例如,Local0和Info级别对应的PRI值为16。
    TIMESTAMP:消息产生时间戳,通常采用RFC 3339或ISO 8601格式。
    HOSTNAME:消息发送者主机名或IP地址。
    TAG:日志源程序或进程名称,可以用来识别不同应用程序生成的日志。
    MESSAGE:具体的日志内容。
    
    • 1
    • 2
    • 3
    • 4
    • 5

    Syslog协议还支持多行文本、结构化数据等特性,并允许使用一些转义字符来处理特殊字符和空格等情况。例如,“\n”表示换行符,“\t”表示制表符等。

    以下是一个示例Syslog消息:

    <14>2019-12-31T23:59:59.000Z myserver.example.com nginx: [error] 1234#0: *56789 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 192.0.2.1, server: example.com, request: "GET /foo HTTP/1.1", upstream: "http://192.0.2.2:8080/bar", host: "example.com"
    
    • 1

    这条消息的PRI值为14(表示Notice级别),时间戳为2019年12月31日23时59分59秒,发送主机名为myserver.example.com,日志源程序为nginx,内容是一条错误消息,包括具体的错误码和请求信息等

    Level的定义如下:

    每个消息优先级还具有一个十进制严重性级别指示符。下表描述了它们及其数值价值观。严重性值必须在0到7之间(包括0和7)。

    VERSION字段

    VERSION字段表示syslog协议的版本规范。对于任何新版本,必须增加版本号更改HEADER任意部分的syslog协议规范格式。更改包括添加或删除字段,或者更改现有字段的语法或语义。本文件使用VERSION值为“ 1”。

    TIMESTAMP字段

    TIMESTAMP字段是源自[RFC3339]的形式化时间戳。在[RFC3164]格式必须是“Mmm dd hh:mm:ss”,不包括年份。“月份取值包括:Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec

    二、python中使用syslog发日志

    使用logging模块

    import logging
    import logging.handlers
    # 日志对象的名称
    my_logger = logging.getLogger('chenjunfei_log')
    my_logger.setLevel(logging.INFO)
    # 日志格式
    formatter = logging.Formatter("%(processName)s %(name)s %(message)s")
    handler = logging.handlers.SysLogHandler(address=("192.168.10.101", 514))
    handler.setFormatter(formatter)
    my_logger.addHandler(handler)
    my_logger.info("test")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    pysyslogclient

    官方文档:https://pypi.org/project/pysyslogclient/

    import pysyslogclient
    # 通过UDP协议发送syslog日志
    client = pysyslogclient.SyslogClientRFC5424('192.168.10.101', 514, proto="UDP")
    # 通过TCP协议发送syslog日志
    # client = pysyslogclient.SyslogClientRFC5424('192.168.10.101', 514, proto="TCP")
    client.log("test message")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    三、go中使用syslog发日志

    标准库log/syslog

    官方: https://pkg.go.dev/log/syslog

    Syslog软件包被冷冻,不接受新功能。一些外部软件包提供了更多功能。看:
    https://godoc.org/?q=syslog

    ☞ This package is not implemented on Windows. As the syslog package is frozen, Windows users are encouraged to use a package outside of the standard library. For background, see https://golang.org/issue/1108. ☞ This package is not implemented on Plan 9. ☞ This package is not implemented on NaCl (Native Client).
    ☞该软件包未在Windows上实现。由于Syslog软件包被冷冻,

    鼓励Windows用户使用标准以外的软件包

    golang提供了syslog 包,只需要调用Dial(),就可以连接syslog服务器,然后发送消息。
    在写失败的情况下,syslog client会尝试重连syslog服务器,并重写。
    连接方式由参数network定义(可以为tcp, udp,或空)。

    如果network是空,Dial会连接到本地的syslog服务器。

    package main
    
    import (
            "log"
            "log/syslog"
    )
    
    func main() {
            sysLog, err := syslog.Dial("", "",syslog.LOG_ERR, "Saturday")
            if err != nil {
                    log.Fatal(err)
            }
           
            sysLog.Emerg("Hello world!")
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    总结:如果你要用window下也可以用,不要用标准库syslog。另外官方思路,syslog建议采用三方库,标准库不推荐实现。

    go-syslog

    官方: https://pkg.go.dev/github.com/hashicorp/go-syslog#section-readme

    这个代码库提供了一个非常简单的gsyslog包。这个包的目的是在不引入跨编译问题的情况下安全地导入syslog。标准库log/syslog在Windows系统上无法导入,而没有条件编译会增加复杂性。

    gsyslog包是一个对log/syslog进行简单封装的包装器,但如果尝试在非Linux或OSX系统上进行初始化,就会返回一个运行时错误。简而言之,gsyslog只允许在Linux或OSX系统上使用,如果在其他系统上尝试使用它,就会引发错误。这样可以确保代码在不受支持的系统上无法使用,并提醒开发人员限制gsyslog在特定操作系统上的使用。

    总结:gsyslog就是对标准库 syslog的简单封装,也不支持windows

    同时支持linux和windows go syslog 库

    暂时没有找到比较好的,有人有好的发现,可以留言,我跟踪研究一下,补充到这里,感谢~

  • 相关阅读:
    2022年中职组网络安全B模块新题目web应用程序漏洞
    【SpringMVC】JSR 303与拦截器注释使用
    hash 表 --- 链地址法解决冲突
    7.21 - 每日一题 - 408
    OpenGait:首个步态识别框架开源了!
    MySQL多表查询
    【银角大王——Django课程Day1】
    Spring整合RabbitMQ-配制文件方式-2-推模式消费者
    字段类型—待补全
    牛客网:NC74 数字在升序数组中出现的次数
  • 原文地址:https://blog.csdn.net/inthat/article/details/134413870