syslog日志收集器
syslog 是 Linux 和其他类 Unix 操作系统中用于存储系统日志的标准协议。它不仅定义了如何记录事件,还规定了这些事件应该如何在网络上传输。在 Linux 系统中,syslog 通常由一个守护进程(daemon)来管理,这个守护进程负责接收来自不同应用程序和服务的日志信息,并将它们写入到适当的文件或通过网络发送给其他服务器。
为什么使用syslog
使用 syslog 收集日志有许多好处,特别是在企业级环境中。以下是使用 syslog 收集日志的一些主要优势:
- 集中管理 统一存储:通过 syslog,可以将来自多个设备和系统的日志集中存储在一个中心位置。这使得日志管理和分析更加方便。 简化监控:集中管理的日志可以更容易地进行实时监控和报警,帮助及时发现和解决问题。
- 标准化 通用协议:syslog 是一个广泛支持的标准协议,几乎所有的网络设备和操作系统都支持 syslog 日志记录。 一致性:使用 syslog 可以确保日志格式的一致性,便于后续的分析和处理。
- 可扩展性 灵活配置:syslog 允许灵活配置日志的来源、级别和目标,可以根据需要进行调整。 分布式架构:可以轻松地扩展到多个日志服务器,支持高可用性和负载均衡。
- 安全性和可靠性 加密传输:现代 syslog 实现支持通过 TLS/SSL 等协议加密日志数据,确保传输过程中的安全性。 持久化存储:可以配置 syslog 服务器将日志数据持久化存储,防止数据丢失。 冗余备份:支持日志数据的冗余备份,提高数据的可靠性和可用性。
- 性能优化 异步处理:syslog 支持异步日志处理,不会影响应用程序的性能。 高效传输:syslog 协议设计为轻量级,适合大规模日志传输。
- 易于集成 第三方工具:许多第三方日志管理和分析工具(如 ELK Stack、Splunk、Graylog 等)都支持 syslog,可以轻松集成。 API 支持:许多现代 syslog 实现提供了丰富的 API,便于与其他系统和服务集成。
- 合规性和审计 法规遵从:集中管理和存储的日志有助于满足各种法规和标准的要求,如 GDPR、HIPAA 等。 审计追踪:详细的日志记录可以提供完整的审计追踪,帮助进行安全审计和故障排查。
- 自动化和脚本支持 脚本编写:可以编写脚本自动化日志的收集、处理和分析过程。 事件响应:可以配置自动化事件响应机制,根据日志内容触发特定的操作。
- 资源利用率 节省存储空间:通过配置日志轮转和压缩,可以有效节省存储空间。 减少带宽占用:通过过滤和压缩日志数据,可以减少网络带宽的占用。
- 社区和支持 广泛的社区: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"));
}
}
}
- 查看日志输出