基于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"));
        }
    }
}
  • 查看日志输出
相关推荐
鬼火儿4 小时前
SpringBoot】Spring Boot 项目的打包配置
java·后端
cr7xin5 小时前
缓存三大问题及解决方案
redis·后端·缓存
间彧6 小时前
Kubernetes的Pod与Docker Compose中的服务在概念上有何异同?
后端
间彧6 小时前
从开发到生产,如何将Docker Compose项目平滑迁移到Kubernetes?
后端
间彧6 小时前
如何结合CI/CD流水线自动选择正确的Docker Compose配置?
后端
间彧6 小时前
在多环境(开发、测试、生产)下,如何管理不同的Docker Compose配置?
后端
间彧6 小时前
如何为Docker Compose中的服务配置健康检查,确保服务真正可用?
后端
间彧6 小时前
Docker Compose和Kubernetes在编排服务时有哪些核心区别?
后端
间彧6 小时前
如何在实际项目中集成Arthas Tunnel Server实现Kubernetes集群的远程诊断?
后端
brzhang7 小时前
读懂 MiniMax Agent 的设计逻辑,然后我复刻了一个MiniMax Agent
前端·后端·架构