使用rsyslog转发自定义日志到指定服务器

news2024/9/23 11:24:36

rsyslog简介

    rsyslog 是一个高度可配置的、功能强大的系统日志守护进程,广泛用于 UNIX 和 Linux 系统中。它是 syslog 的一个扩展版本,提供了许多额外的功能和改进。能够收集、过滤、存储和转发日志数据。它的灵活性和扩展性使其成为现代 Linux 系统中日志管理的重要组成部分。

主要功能

  1. 日志收集

    1. rsyslog 能够收集来自系统、应用程序和网络设备的日志信息。
    2. 支持多种输入来源,包括本地文件、网络套接字和远程日志传输。
  2. 日志过滤

    • 通过配置文件中的规则,可以对日志进行过滤、分类和处理。
    • 支持按设施、严重性、内容等条件进行日志选择和处理。
  3. 日志转发

    • 支持将日志转发到其他 rsyslog 实例或日志管理系统。
    • 可以通过 UDP、TCP 或 RELP 协议进行远程日志传输。
  4. 日志存储

    • 可以将日志消息存储到文件、数据库或其他存储后端。
    • 支持日志轮转和归档功能,以管理日志文件的大小和存储期限。
  5. 日志格式化

    • 支持自定义日志格式,通过模板将日志消息格式化为所需的结构。
  6. 模块化设计

    • rsyslog 采用模块化架构,支持加载和卸载各种插件和模块。
    • 常用模块包括输入模块(imfile、imudp、imtcp)、输出模块(omfile、omrelp、ommysql)等。

主要组件

  1. 输入模块(Input Modules)

    用于接收日志数据。包括从文件、网络、系统日志等来源接收日志。
  2. 过滤器(Filters)

    用于根据规则筛选和处理日志消息。例如,过滤掉不需要的日志、将日志重定向到特定文件等。
  3. 输出模块(Output Modules)

    用于将日志数据输出到目标位置,如文件、数据库或远程服务器。
  4. 模板(Templates)

    用于自定义日志消息的格式。可以定义消息的结构、内容和格式,以满足特定的需求。

使用场景

  • 系统监控:监控系统运行状况、错误和警告信息。
  • 安全审计:记录和分析安全事件,如登录尝试和系统访问。
  • 集中日志管理:将日志从多个系统集中到一个位置,以便于管理和分析。
  • 故障排除:分析和排查系统和应用程序故障的根本原因。

配置方法

        比如有个场景,需要把服务器A上的某个app的日志转发到服务器B上,这里的A和B上默认都安装了rsyslog。那么,我们可以称A为客户端,B为服务端。

配置服务端

        rsyslog的配置文件默认在/etc/下,名为rsyslog.conf。除了rsyslog.conf,还有一个rsyslog.d目录,这个目录下保存的是自定义文件。

1. 编辑配置文件 /etc/rsyslog.conf 
  • 启用 UDP 或 TCP 监听:
# 监听 UDP 514 端口:
$ModLoad imudp
$UDPServerRun 514

# 或者监听 TCP 514 端口:
$ModLoad imtcp
$InputTCPServerRun 514
  • 设置日志接收规则

指定如何处理接收到的日志,例如,将接收到的日志写入指定的文件夹:

if $fromhost-ip == 'client-ip' then /var/log/remote_logs.log
& stop

client-ip 替换为客户端机器的 IP 地址,注意 & stop 单独放在一行。

2. 校验rsyslog 配置

为了确保配置文件语法正确,可以使用以下命令检查 rsyslog 配置文件:

rsyslogd -N1

参数说明:

  • -N: 表示进行配置文件的语法检查。
  • -1: 表示验证级别为 1,进行基本的语法检查,不包括更详细的错误检查。
3. 重启 rsyslog 服务
systemctl restart rsyslog
4. 检查防火墙设置

检查防火墙或者iptables的配置,确保开放了 514 端口,并且注意是使用的 UDP 还是 TCP 协议。

配置客户端

        因为我们想要实现的是转发指定app的日志,假设我们的app日志文件存储在 /var/log/myapp.log 中。

1. 编辑 rsyslog 配置文件

既然是自定义app日志,所以建议在/etc/rsyslog.d下创建一个名为myapp.conf的文件配置文件。当然,你也可以直接使用/etc/rsyslog.conf 。好了,现在打开 /etc/rsyslog.conf/etc/rsyslog.d/myapp.conf。

a.添加imfile模块的配置:
# 读取自定义日志文件
$InputFileName /var/log/myapp.log
$InputFileTag myapp-log:
$InputFileStateFile stat-myapp
$InputFileSeverity info
$InputFileFacility local0
$InputRunFileMonitor

这些参数是 rsyslog 的文件输入模块 imfile 的配置,用于监控自定义日志文件,并将日志内容转发或处理。以下是每个参数的详细解释:

$InputFileName

  • 作用:指定需要监控的自定义日志文件的路径。
  • 示例$InputFileName /var/log/myapp.log
    • 这意味着 rsyslog 将监控 /var/log/myapp.log 文件,捕获该文件中的日志条目。

$InputFileTag

  • 作用:为监控的日志文件生成一个标识标签,标识日志的来源。
  • 示例$InputFileTag myapp-log:
    • 这为从 /var/log/myapp.log 文件中读取的每条日志记录添加了 myapp-log: 这个标签。这个标签可以在 rsyslog 规则中用来匹配、过滤或转发特定日志。

$InputFileStateFile

  • 作用:指定一个状态文件,用来保存文件的读取状态(例如文件上次读取到的位置)。它用于在 rsyslog 重启后,继续从上次中断的地方读取日志。
  • 示例$InputFileStateFile stat-myapp
    • 这个状态文件 stat-myapp 会保存在 /var/spool/rsyslog/ 目录下,记录了 /var/log/myapp.log 文件的读取进度。

    • 如果不指定状态文件,rsyslog 默认会自动生成一个基于文件名的状态文件。

$InputFileSeverity

  • 作用:指定从该日志文件读取的日志的严重性级别(Severity)。严重性级别用于对日志进行分类,比如 infoerrorwarning 等。
  • 示例$InputFileSeverity info
    • 这表示将日志的严重性设置为 info 级别,意味着这些日志信息通常是常规操作信息。
    常见的严重性级别
    • emerg: 系统不可用
    • alert: 必须立即采取行动
    • crit: 严重情况
    • err: 错误
    • warning: 警告
    • notice: 正常但重要的信息
    • info: 信息性消息
    • debug: 调试消息

$InputFileFacility

  • 作用:指定日志的设施(Facility)。设施定义了日志消息的来源类别,用于将不同来源的日志分开。

  • 示例$InputFileFacility local0

    • 这意味着日志来源类别为 local0,这是可供用户自定义的日志设施之一。local0local7 是为用户定义的日志设施,常用于自定义应用程序日志。

    常见设施

    • auth: 认证系统使用
    • cron: 定时任务使用
    • daemon: 后台服务使用
    • kern: 内核日志
    • local0local7: 用户自定义使用
    • syslog: syslog 自身日志

$InputRunFileMonitor

  • 作用:启动对指定文件的监控。
  • 示例$InputRunFileMonitor
    • 这行指令告诉 rsyslog 开始监控你通过 $InputFileName 指定的文件。一旦文件有新日志生成,rsyslog 就会立即读取并处理这些日志。
b. 配置转发规则

在同一个配置文件中,添加规则将这些自定义日志转发到服务端。可以根据需要选择 UDP 或 TCP 进行转发:

  • 使用 UDP 转发:

if $syslogtag == 'myapp-log:' then @remote-host:514
  • 使用 TCP 转发:

if $syslogtag == 'myapp-log:' then @@remote-host:514

将remote-host 替换为服务端的 IP 地址或主机名,514 是syslog 的默认端口。

2. 校验rsyslog 配置

同前面一样,为了确保配置文件语法正确,执行以下命令:

rsyslogd -N1

这不,刚好发现了错误:

[root@localhost /etc]$ rsyslogd -N1
rsyslogd: version 7.4.7, config validation run (level 1), master config /etc/rsyslog.conf
rsyslogd: invalid or yet-unknown config file command 'inputFileName' - have you forgotten to load a module? [try http://www.rsyslog.com/e/3003 ]
rsyslogd: invalid or yet-unknown config file command 'InputFileTag' - have you forgotten to load a module? [try http://www.rsyslog.com/e/3003 ]
rsyslogd: invalid or yet-unknown config file command 'InputFileStateFile' - have you forgotten to load a module? [try http://www.rsyslog.com/e/3003 ]
rsyslogd: invalid or yet-unknown config file command 'InputFileSeverity' - have you forgotten to load a module? [try http://www.rsyslog.com/e/3003 ]
rsyslogd: invalid or yet-unknown config file command 'InputFileFacility' - have you forgotten to load a module? [try http://www.rsyslog.com/e/3003 ]
rsyslogd: invalid or yet-unknown config file command 'InputRunFileMonitor' - have you forgotten to load a module? [try http://www.rsyslog.com/e/3003 ]
rsyslogd: End of config validation run. Bye.
 

上面日志表示rsyslog的版本是7.4.7, 无法识别配置中的那些命令。看到这个,那说明是版本的问题了。

从错误信息来看,当前的 rsyslog 版本7.4.7,InputFileNameInputFileTag 等指令在该版本中无效或未知。

这种情况,要么升级rsyslog,要么修改配置的命令为当前版本。为了省事,我选择后者,修改配置:

# /etc/rsyslog.conf 或 /etc/rsyslog.d/ 文件

# 加载 imfile 模块
module(load="imfile")

# 配置文件监控
input(type="imfile"
      File="/var/log/myapp.log"
      Tag="myapp-log:"
      StateFile="stat-myapp"
      Severity="info"
      Facility="local0")

# 转发日志到服务端
if $programname == 'myapp-log' then @logserver.example.com:514

在修改配置后,重新使用rsyslogd -N1命令检查配置是否正确。

3. 重启 rsyslog 服务

配置完成后,重启 rsyslog 服务以使新配置生效:

systemctl restart rsyslog
4. 检查防火墙设置

检查防火墙或者iptables的配置,确保能ping通服务端及其 514 端口。

5. 验证日志传输

客户端和服务端配置都修改完成了,现在验证日志是否能正确转发和接收。

  • 在客户端查看 /var/log/myapp.log 中的日志是否有新生成的日志。
  • 在服务端查看 /var/log/remote_myapp.log 文件,是否正确记录了从客户端转发过来的自定义日志。

如果没有日志,可以使用工具如 nc(netcat)进行测试:

echo "test log" | nc -u logserver.example.com 514

正常情况下, 服务端查看 /var/log/remote_myapp.log 文件中会出现"test log"的日志。如果没有,则需要检查下检查网络连接和防火墙设置,确保没有阻止日志转发。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2110919.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

剪辑视频,这四大工具助你一臂之力!

在这个数字化的时代,视频已成为一种重要的表达手段。无论您是专业视频制作者还是只是偶尔想要编辑一些个人视频,一款优秀的视频剪辑软件都将是您不可或缺的好帮手。以下是几款值得推荐的视频剪辑软件。 福昕视频剪辑 直达链接:www.pdf365.c…

巧用智能表单高效收集客户信息

企客宝企微版的智能表单功能,方便企微好友提交信息,直接入库管理,确保了一些类似身份证号等敏感信息,在传递过程中的数据安全 前言 很多企业在与企微好友沟通时,有时会有收集客户信息的需求,比如客户报名的…

PID控制算法(一)

PID算法控制: PID算法应用十分广泛,包括温度、气压控制,流速、液位控制,无人机悬停,小球摆动受力以及姿态调整等等。 此时,假定有固定时间间隔t,对应有不同t时刻的输出值x;另外&…

【机器学习】生成对抗网络(Generative Adversarial Networks, GANs)详解

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 生成对抗网络(Generative Adversarial Networks, GANs)详解GANs的基本原理GANs的…

基于人工智能的情感分析系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 情感分析系统是自然语言处理中的重要应用之一,用于从文本中自动识别和分析用户情感,如“积极”、“消极”或“…

UDP通信实现

目录 前言 一、基础知识 1、跨主机传输 1、字节序 2、主机字节序和网络字节序 3、IP转换 2、套接字 3、什么是UDP通信 二、如何实现UDP通信 1、socket():创建套接字 2、bind():绑定套接字 3、sendto():发送指定套接字文件数据 4、recvfrom():接收指定地址信息的数据 三…

C语言操作符汇总(上)

目录 前言 一、操作符的分类 二、⼆进制和进制转换 1. 二进制转10进制 2. 10进制转2进制数字 3. 2进制转8进制和16进制 3.1 2进制转8进制 3.2 二进制转16进制 三、原码、反码、补码 四、移位操作符 1. 左移操作符 2. 右移操作符 五、位操作符:&…

10-1RT-Thread动态内存管理

10-1RT-Thread动态内存管理 在嵌入式系统中,变量和中间数据一般存放在系统存储空间中。只有在实际使用时,才将它们从存储空间读取到CPU进行运算。存储空间可分为两种,内部存储空间rem和外部存储空间rome或flash。其中ram或称之为内存&…

【Linux详解】命令行参数|环境变量

目录 一、命令行参数 二、环境变量 1.环境变量的基本概念 2.查看环境变量的方法 3.环境变量相关命令 4.环境变量的组织方式以及获取环境变量的三种方法 环境变量具有全局属性 一、命令行参数 【示例1】main函数也是函数,main函数可以带参吗? 没…

Python教程(二十) : 十分钟入门【PyQt6】

文章目录 专栏列表环境准备1 安装 Python2 安装 PyQt6 PyQt6 中的模块使用模块创建一个窗体: PyQt6 常用的控件1. QPushButton(按钮)2. QLabel(标签)3. QLineEdit(文本输入框)4. QTextEdit&…

(4)SVG-path中的椭圆弧A(绝对)或a(相对)

1、概念 表示经过起始点(即上一条命令的结束点),到结束点之间画一段椭圆弧 2、7个参数 rx,ry,x-axis-rotation,large-arc-flag,sweep-flag,x,y (1)和(2&a…

FFMpeg环境搭建(WIN10)

0、前期准备 软件环境:Win10 qtcreator 软件准备:MSYS2 安装包、 FFmpeg源码 1、软件安装 通过MSYS2安装编译工具 1、打开MSYS2安装包,一路next即可 (注:如果需要更改路径可以自行更改) 2、安装完成…

虚拟现实辅助工程技术助力多学科协同评估

在当今高速发展的经济环境中,制造业面临着多重挑战,包括提高产品性能、压缩设计周期、实现轻量化设计和降低成本。为了有效应对这些挑战,多学科协同评估成为缩短研发周期和提升研制质量的关键手段。 传统的多学科评估面临着数据孤立与融合困难…

Android 系统源码项目加载预编好的so库

Android 系统源码项目加载预编好的so库 文章目录 Android 系统源码项目加载预编好的so库一、前言二、源码中加载so1、Android.mk加载so加载so的主要相关代码: 2、Android.bp加载so(1)Android.mk使用源码命令编译成Android.bp(2&am…

Java灰度发布

有没有在北京面试java的小伙伴,每家公司面试问的问题都不一样,昨天面试官问到了灰度发布,一脸懵,好像在哪儿听说过,毕竟我都没发布过,之前都是项目组长在干这些事儿,所以聊聊,了解一…

驾驭Autofac,ASP.NET WebApi实现依赖注入详细步骤总结

前言 嘿,小伙伴们,今天我们来一场 Autofac 的学习之旅吧! Autofac 是一个轻量级的依赖注入框架,专门为 .NET 应用程序量身定做,它就像是你代码中的 “魔法师”,用它来管理对象的生命周期,让你…

828华为云征文|华为云Flexus X实例docker部署最新gitlab社区版,搭建自己的私人代码仓库

828华为云征文|华为云Flexus X实例docker部署最新gitlab社区版,搭建自己的私人代码仓库 华为云最近正在举办828 B2B企业节,Flexus X实例的促销力度非常大,特别适合那些对算力性能有高要求的小伙伴。如果你有自建MySQL、Redis、Ng…

大数据采集迁移工具

Flume Sqoop kafka框架 MQ:消息队列 broker相当于服务器 消息队列

栈和队列(1)

空栈先移动栈顶再加数据,满栈先插入数据再移 栈的基本概念栈是一种后进先出(LIFO,Last In First Out)的数据结构。栈支持两种主要的操作:•压栈(Push):向栈中添加一个元素。•弹栈&…

Kubernetes v1.28.0安装详解

Kubernetes v1.28.0安装详解 一.环境初始化 要在所有节点执行命令进行配置 1、检查操作系统的版本 此部署环境为CentOS 7.9 [rootCentOS7 ~]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) [rootCentOS7 ~]#2、主机名解析 为了方便集群节点间的互相调…