基于syslog实现项目的日志收集

syslog日志收集器

syslog 是 Linux 和其他类 Unix 操作系统中用于存储系统日志的标准协议。它不仅定义了如何记录事件,还规定了这些事件应该如何在网络上传输。在 Linux 系统中,syslog 通常由一个守护进程(daemon)来管理,这个守护进程负责接收来自不同应用程序和服务的日志信息,并将它们写入到适当的文件或通过网络发送给其他服务器。

为什么使用syslog

使用 syslog 收集日志有许多好处,特别是在企业级环境中。以下是使用 syslog 收集日志的一些主要优势:

  1. 集中管理 统一存储:通过 syslog,可以将来自多个设备和系统的日志集中存储在一个中心位置。这使得日志管理和分析更加方便。 简化监控:集中管理的日志可以更容易地进行实时监控和报警,帮助及时发现和解决问题。
  2. 标准化 通用协议:syslog 是一个广泛支持的标准协议,几乎所有的网络设备和操作系统都支持 syslog 日志记录。 一致性:使用 syslog 可以确保日志格式的一致性,便于后续的分析和处理。
  3. 可扩展性 灵活配置:syslog 允许灵活配置日志的来源、级别和目标,可以根据需要进行调整。 分布式架构:可以轻松地扩展到多个日志服务器,支持高可用性和负载均衡。
  4. 安全性和可靠性 加密传输:现代 syslog 实现支持通过 TLS/SSL 等协议加密日志数据,确保传输过程中的安全性。 持久化存储:可以配置 syslog 服务器将日志数据持久化存储,防止数据丢失。 冗余备份:支持日志数据的冗余备份,提高数据的可靠性和可用性。
  5. 性能优化 异步处理:syslog 支持异步日志处理,不会影响应用程序的性能。 高效传输:syslog 协议设计为轻量级,适合大规模日志传输。
  6. 易于集成 第三方工具:许多第三方日志管理和分析工具(如 ELK Stack、Splunk、Graylog 等)都支持 syslog,可以轻松集成。 API 支持:许多现代 syslog 实现提供了丰富的 API,便于与其他系统和服务集成。
  7. 合规性和审计 法规遵从:集中管理和存储的日志有助于满足各种法规和标准的要求,如 GDPR、HIPAA 等。 审计追踪:详细的日志记录可以提供完整的审计追踪,帮助进行安全审计和故障排查。
  8. 自动化和脚本支持 脚本编写:可以编写脚本自动化日志的收集、处理和分析过程。 事件响应:可以配置自动化事件响应机制,根据日志内容触发特定的操作。
  9. 资源利用率 节省存储空间:通过配置日志轮转和压缩,可以有效节省存储空间。 减少带宽占用:通过过滤和压缩日志数据,可以减少网络带宽的占用。
  10. 社区和支持 广泛的社区:syslog 有一个活跃的社区,提供了大量的文档、教程和最佳实践。 商业支持:许多供应商提供商业支持和高级功能,适用于企业级应用。

日志级别

syslog 定义了多个日志级别,用于标识消息的重要性。这些级别从最不严重到最严重依次为: DEBUG: 用于调试目的的信息。 INFO: 一般性的信息。 NOTICE: 正常但重要的情况。 WARNING: 警告性信息,表示存在潜在的问题。 ERR: 错误信息,表示发生了一些错误。 CRIT: 临界状态,表示有严重的错误发生。 ALERT: 必须立即采取行动的情况。 EMERG: 系统不可用,这是最严重的级别。

配置文件

syslog 的配置文件通常是 /etc/syslog.conf

rsyslog

在centos6以后,linux开始使用用rsyslog,rsyslog其实是syslog的增强版本,在syslog原来的基础上,支持日志过滤,日志转发,数据库记录等功能。配置文件在/etc/rsyslog.conf

ini 复制代码
#### GLOBAL DIRECTIVES ####

# Where to place auxiliary files
global(workDirectory="/var/lib/rsyslog")

# Use default timestamp format
module(load="builtin:omfile" Template="RSYSLOG_TraditionalFileFormat")

#### MODULES ####

module(load="imuxsock" 	  # provides support for local system logging (e.g. via logger command)
       SysSock.Use="off") # Turn off message reception via local log socket; 
			  # local messages are retrieved through imjournal now.
module(load="imjournal" 	    # provides access to the systemd journal
       UsePid="system" # PID nummber is retrieved as the ID of the process the journal entry originates from
       FileCreateMode="0644" # Set the access permissions for the state file
       StateFile="imjournal.state") # File to store the position in the journal
#module(load="imklog") # reads kernel messages (the same are read from journald)
#module(load="immark") # provides --MARK-- message capability

# Include all config files in /etc/rsyslog.d/
include(file="/etc/rsyslog.d/*.conf" mode="optional")

# Provides UDP syslog reception
# for parameters see http://www.rsyslog.com/doc/imudp.html
#module(load="imudp") # needs to be done just once
#input(type="imudp" port="514")

# Provides TCP syslog reception
# for parameters see http://www.rsyslog.com/doc/imtcp.html
#module(load="imtcp") # needs to be done just once
#input(type="imtcp" port="514")

#### RULES ####

# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.*                                                 /dev/console

# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none                /var/log/messages

# The authpriv file has restricted access.
authpriv.*                                              /var/log/secure

# Log all the mail messages in one place.
mail.*                                                  -/var/log/maillog


# Log cron stuff
cron.*                                                  /var/log/cron

# Everybody gets emergency messages
*.emerg                                                 :omusrmsg:*

# Save news errors of level crit and higher in a special file.
uucp,news.crit                                          /var/log/spooler

# Save boot messages also to boot.log
local7.*                                                /var/log/boot.log


# ### sample forwarding rule ###
#action(type="omfwd"  
# # An on-disk queue is created for this action. If the remote host is
# # down, messages are spooled to disk and sent when it is up again.
#queue.filename="fwdRule1"       # unique name prefix for spool files
#queue.maxdiskspace="1g"         # 1gb space limit (use as much as possible)
#queue.saveonshutdown="on"       # save messages to disk on shutdown
#queue.type="LinkedList"         # run asynchronously
#action.resumeRetryCount="-1"    # infinite retries if host is down
# # Remote Logging (we use TCP for reliable delivery)
# # remote_host is: name/ip, e.g. 192.168.0.1, port optional e.g. 10514
#Target="remote_host" Port="XXX" Protocol="tcp")

简单使用

php 复制代码
<?php

openlog("testSyslog", LOG_ODELAY | LOG_PID, LOG_USER);
while (true){
    syslog(LOG_DEBUG, "testDebugSyslog time:".time());
    sleep(1);
    sleep(1);
    syslog(LOG_INFO, "testInfoSyslog time:".time());
    sleep(1);
    syslog(LOG_WARNING, "testWarningSyslog time:".time());
    sleep(1);
    syslog(LOG_ERR, "testErrorSyslog time:".time());
}
closelog();
  • 我们启动这个脚本,看看日志有没有打印,那么去哪里去找日志文件呢,我们看到配置文件里面有这一行*.info;mail.none;authpriv.none;cron.none /var/log/messages 表示info以上的信息将会打印到这个文件中。我们监听一下文件看看
less 复制代码
[root@centos log]# tail -f /var/log/messages
Nov 25 10:56:26 centos testSyslog[226683]: testWarningSyslog time:1732503386
Nov 25 10:56:27 centos testSyslog[226683]: testErrorSyslog time:1732503387
Nov 25 10:56:29 centos testSyslog[226683]: testInfoSyslog time:1732503389
Nov 25 10:56:30 centos testSyslog[226683]: testWarningSyslog time:1732503390

将error单独打印到某个文件

配置文件中# Include all config files in /etc/rsyslog.d/ include(file="/etc/rsyslog.d/*.conf" mode="optional") 意思是,如果有其他的配置,可以添加到/etc/rsyslog.d/目录下,我们来建一个文件 vi /etc/rsyslog.d/error_log.conf

bash 复制代码
# 定义一个模板用于动态文件名
template(name="DynamicErrorLog" type="string" string="/var/log/error_logs/%$YEAR%-%$MONTH%-%$DAY%-%$HOUR%.log")

# 使用模板将所有错误消息记录到具有动态名称的文件中
*.err ?DynamicErrorLog
  • 重启syslog服务sudo systemctl restart rsyslog,查看error日志文件已经生成,是按年月日分割的。

输出到远程syslog服务器

有时候我们可能想把日志收集到一台服务器上,做数据分析,那么此时我们就可以用到远程syslog服务 我们知道,既然syslog是一个服务,而且是linux默认实现的,所以肯定有一个用于提供服务的端口号。syslog的端口号是514。 UDP 514:用于传统的 syslog 服务,通常是无连接的、不可靠的传输方式。 TCP 514:虽然传统上 syslog 主要使用 UDP,但也可以使用 TCP 来提供更可靠的日志传输。 默认端口 UDP 514:默认的 syslog 端口,广泛用于发送和接收 syslog 消息。 TCP 514:用于需要可靠传输的场景。

linux分配的端口号

  • 0到1023端口是系统保留的端口,由一些通用协议、应用程序及其服务使用。 这些端口被标识为众所周知的端口,并且不能被用户程序使用。
  • 1024到49151端口是为用户程序保留的,通常也称为注册端口。 这些端口须先在IANA (互联网号码分配局)注册,以避免端口冲突。 在进行应用程序开发时,应尽可能分配一个注册端口。
  • 49152到65535端口是为临时使用而保留的。 这个端口范围通常用于不需要长期占据端口的应用程序,例如下载和文件共享应用程序。

远端syslog服务器的配置

  • 启用tcp模块和udp模块接收日志信息,另外需要注意防火墙的问题
ini 复制代码
[root@centos2 rsyslog.d]# cat remote_log.conf 
# 启用模块以接收 UDP 日志消息
module(load="imudp")
input(type="imudp" port="514")

# 启用模块以接收 TCP 日志消息
module(load="imtcp")
input(type="imtcp" port="514")
# 创建一个模板,用于处理远程日志
template(name="RemoteLog" type="string" string="/var/log/remote/%HOSTNAME%/%$YEAR%-%$MONTH%-%$DAY%-%$HOUR%.log")

# 将所有从远程主机接收的日志消息保存到特定文件
*.* ?RemoteLog
[root@centos2 rsyslog.d]# 
  • 防火墙配置
css 复制代码
# 允许 UDP 514 端口
iptables -A INPUT -p udp --dport 514 -j ACCEPT

# 允许 TCP 514 端口
iptables -A INPUT -p tcp --dport 514 -j ACCEPT

# 保存规则
service iptables save

本地syslog配置修改

ini 复制代码
[root@centos rsyslog.d]# cat remote_error_log.conf 
# 定义一个模板,用于格式化日志消息,包含时间戳
template(name="RemoteErrorLog" type="string" string="<%PRI%>%TIMESTAMP:::date-rfc3339% %HOSTNAME% %APP-NAME% %PROCID% %MSGID% %msg%\n")

# 将所有错误级别的日志消息发送到远程服务器
*.err @198.19.249.196:514;RemoteErrorLog
  • <%PRI%> 是日志优先级。
  • %TIMESTAMP:::date-rfc3339% 会以 RFC 3339 格式插入时间戳,例如 2024-11-25T14:45:30+08:00。
  • %HOSTNAME% 是主机名。
  • %APP-NAME% 是应用程序名。
  • %PROCID% 是进程ID。
  • %MSGID% 是消息ID。
  • %msg% 是实际的日志消息内容。
  • 注意,这里使用了 @ 符号来指定使用 UDP 协议发送日志,如果您希望使用 TCP 协议,可以使用 @@ 替代 @

重启本地和远端syslog服务

systemctl restart rsyslog

验证效果

项目中的实现

此处,我以我们正在用的lumen框架为例,简单演示一下

  • env文件,
php 复制代码
# 使用syslog作为指定驱动
LOG_CHANNEL=syslog
  • 使用command脚本生成日志
php 复制代码
<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Illuminate\Support\Facades\Log;

class SyslogDemoCommand extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'SyslogDemoCommand';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'syslog记录日志';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {

        while (true){
            sleep(1);
            Log::error("this is lumen log,time".date("Y-m-d H:i:s"));
        }
    }
}
  • 查看日志输出
相关推荐
knoci1 分钟前
【Go】-go中的锁机制
后端·学习·golang
Mike_188702783515 分钟前
深入探索Golang的GMP调度机制:源码解析与实现原理
开发语言·后端·golang
不7夜宵38 分钟前
Golang 反射
开发语言·后端·golang
AskHarries39 分钟前
Spring Cloud Consul实现选举机制
java·后端·spring cloud·consul
山山而川粤1 小时前
大连环保公益管理系统|Java|SSM|Vue| 前后端分离
java·开发语言·后端·学习·mysql
尘浮生1 小时前
Java项目实战II基于SpringBoot前后端分离的网吧管理系统(开发文档+数据库+源码)
java·开发语言·数据库·spring boot·后端·微信小程序·小程序
哎呦没1 小时前
企业OA管理系统:Spring Boot技术实现与案例研究
android·spring boot·后端
人才程序员2 小时前
详解Qt QStorageInfo 存储信息类
c语言·开发语言·c++·后端·qt·界面
小奏技术3 小时前
聊聊HTTP2中的GOAWAY帧以及RocketMQ对GOAWAY的实现
后端·网络协议
Code_Artist3 小时前
细说Linux操作系统的网络I/O模型
linux·后端·网络协议