AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 547938
Accepted
Michael Martinez
Michael Martinez
Asked: 2013-10-23 14:01:07 +0800 CST2013-10-23 14:01:07 +0800 CST 2013-10-23 14:01:07 +0800 CST

Linux:如何将日志文件中的新行发送到远程系统日志?

  • 772

我们有几个应用程序正在生成自己的纯文本日志文件,我想将它们转发到远程系统日志服务器以进行集中日志记录。我无权访问root这些机器,也无法重新配置syslog以将输出重定向到远程机器。

我在网上找到了一些解决方案,但它们大多是人们自制的 bash 脚本,我正在寻找更强大的东西,适合在潜在的大批量生产环境中实施。

最好是着眼于占用空间小的东西,持续运行的后台守护程序,可以跟上很多行等 - 目前有哪些解决方案?

syslog
  • 5 5 个回答
  • 49076 Views

5 个回答

  • Voted
  1. voretaq7
    2013-10-24T12:40:44+08:002013-10-24T12:40:44+08:00

    您已经拒绝了“其他人的 bash 脚本”,但这是一个非常常见的解决方案——该命令的一些创造性使用logger可以跟随文件并将其内容发送到其他地方。
    不过,我个人不会在生产环境中这样做。


    一个更好的选择,它需要更少的脚本黑客,并且提到了像yoonixrsyslogd这样的文本文件输入模块——这是一个相当不错的解决方案,尽管在文件轮换期间有一些丢失行的可能性,并且如果你在一个 Linux 系统上作为您的系统日志守护程序,不需要太多额外的工作。rsyslog

    syslog-ng还支持功能类似于's的文件输入源。rsyslog


    恕我直言,最好的解决方案——尽管需要修改生成这些日志的应用程序——是直接登录到 syslog。你不想经历中间步骤、文件等——syslog是 SYStem LOGger,在 Unix 平台上写入日志的东西应该将它们发送到 syslog。
    不幸的是,这个实现留给读者(和应用程序开发人员)作为练习,如果您的开发人员不存在、懒惰或无能......

    • 14
  2. sciurus
    2013-10-30T11:10:27+08:002013-10-30T11:10:27+08:00

    您可以将logstash与文件输入和系统日志输出一起使用。

    例如,使用要监视的文件(或多个文件)和系统日志服务器信息创建配置。

    文件到 syslog.conf:

    input { file { path => "/var/log/kern.log" } }
    output {
        syslog {
            facility => "kernel"
            host => "syslog.example.com"
            port => 514
            severity => "informational"
        }
    }
    

    启动logstash

    java -jar logstash-1.2.2-flatjar.jar agent -f file-to-syslog.conf
    
    • 7
  3. Best Answer
    Michael Martinez
    2014-03-01T09:32:11+08:002014-03-01T09:32:11+08:00

    我一起破解了一个轻量级、快速且稳定的、占用空间小的编译程序(二进制)tail.c。logger.c只要它具有对日志文件的读取权限,它就可以在不需要 root 权限的情况下工作。

    我还对本机记录器进行了一些改进,并添加了一个新的(可选)功能,即在每个日志行的开头插入一个文本字符串,然后再将其发送到日志服务器。结果是一个可以自行运行的程序,无需使用外壳管道(即不需要tail logfile | logger)。它将永远运行,直到被明确杀死或遇到写入网络套接字的错误。如果日志文件旋转甚至消失,它甚至会继续运行(它只会继续查看文件是否重新出现。)

    它很容易使用:只需给它一个或多个日志文件来监视,每次向文件写入新行时,它都会将该行的副本发送到您指定的本地或远程系统日志服务器。如果您使用该选项,加上额外的文本字符串。

    实际上,我早在 12 月就完成了该程序,但正在等待雅虎获得版权并使其可用,他们现在已经完成了。(我把它写成我在雅虎工作的一部分)。

    filelogger程序信息和下载链接:

    • 关于文件记录器的博客文章
    • 用于文件记录器的 GitHub 存储库
    • 4
  4. Avery Payne
    2014-03-13T10:44:18+08:002014-03-13T10:44:18+08:00

    有很多方法可以解决这个问题。但是您应该做的第一件事是:使用syslog 本身转发日志。

    Syslog(以及 syslog 的许多替代品)具有内置功能,可将日志转发到位于不同地址的另一个 syslog 服务器。您可以通过更改配置文件并附加地址以将设施转发到来轻松做到这一点。例如,将此行添加到:

    *.*    @192.168.1.1
    

    ...会将所有设施转发到位于 192.168.1.1 的机器,该机器(希望)运行服务。我在这里给出的示例是针对 rsyslog,它是 Debian 上的库存 syslog 服务器,尽管它应该适用于许多其他服务器。请查阅有关您实施 syslog 的文档,man syslog并查看它对“转发”的说明。

    远程系统日志服务器可以是您喜欢的任何东西。甚至还有像Splunk这样的产品,它们很乐意将这些日志汇总到一个带有 Web 仪表板、搜索、事件驱动通知等的单一视图中。您可以在此处查看更多信息:http ://www.splunk.com/ 如果不能满足你的需求,你可以用别的东西。甚至还有可以转储到 SQL 数据库的系统日志服务器!

    当然,您可以编写自己的脚本/程序/服务来为您执行此操作,但是当它已经为您完成并且已经给您时,为什么还要重新发明轮子呢?


    编辑:所以我回去重新阅读了这个问题,并注意到了一些评论。这听起来像:

    1. 您想汇总您的应用程序日志
    2. 您无权访问 root
    3. 您的应用程序只是在某处转储文本
    4. 您的应用程序不知道如何写入本地系统日志
    5. 您无法控制您的应用程序源代码

    因此,让我们按顺序解决每个问题:

    1. syslog 旨在将日志聚合在一起。你可以使用任何你喜欢的东西,但它存在很长时间是有原因的。它经过了良好的测试、良好的调试、有据可查的文档、众所周知的,并且对于大多数 *nix 平台来说,几乎都以一种或另一种风格得到普遍支持。
    2. 我们不需要访问root来设置日志记录。我们只需要访问 syslog API。 root不需要写入系统日志;如果是这种情况,那么所有那些放弃特权的服务都将无法将诊断信息写入日志文件。
    3. 回复:文本转储,这是正常的。但是,您应该能够使用 subshel​​l 将 STDERR 和 STDOUT 的输出通过管道传输到调用 syslog API 的程序。这不是火箭科学,它远非易碎,而且有据可查。事实上,这也是输出重定向甚至存在的原因之一。一个可以放入单个 shell 脚本的简单命令是:

      (我的应用程序 2>&1 | 我的系统日志分流)&

    4. 如果您有能力更改应用程序的源代码,则应在其中写入分流器,以将文本输出转储到 syslog 而不是纯文本文件。这不应该太难。您所做的就是获取您将输出的行,并用调用包装它们。然而....

    5. 您可能根本无法访问源代码,因此您不能这样做。这意味着像上面的 #3 这样的东西可以正常工作。

    • 1
  5. Michael Martinez
    2013-10-30T10:10:36+08:002013-10-30T10:10:36+08:00

    我在回答我自己的问题。

    swatch 可能有效,但我无法让 perl 的 Sys::Syslog 模块在主机上工作,并且安装在主机上的 /usr/bin/logger 不支持记录到远程服务器(util-linux-ng- 2.17.2)。

    所以,我做的第一件事是下载 util-linux-2.20.1 的源代码,logger 程序确实支持远程日志记录。经过测试,很明显对日志行允许的字符数有限制。深入研究源代码,我发现硬编码限制为 400 个字符。(如果您不相信我,请在任何 Linux 系统上运行“strings /usr/bin/logger | grep 400”)。

    这个限制对于 apache 类型的日志记录(包括 nodejs)是不可接受的,所以我修改了代码并将限制增加到 4096。当我这样做时,我还添加了一个新的命令行选项,它允许插入一个可选的每个日志行开头的文本字符串。我这样做是因为 nodejs 日志不包含在 apache 中可能会看到的主机名。

    此时,我可以使用“tail -F -n 0 [logfile] | ./modified_logger ....”运行一个 shell 脚本,它可以工作。但是我对从监督(daemontools)甚至在后台运行它有些担心,因为如果管道的一侧或另一侧终止,那么整个管道就有终止的风险。我也有关于性能的担忧(尽管未经测试)。

    所以我决定将尾部功能与记录器功能结合到一个可执行的二进制文件中,从而绕过使用 Unix 管道或外部程序的需要。我通过从 gnu coreutils 破解 tail.c 并将我需要的内容合并到修改后的记录程序中来做到这一点。

    结果是一个新的二进制文件(117k 大小),我称之为“文件记录器”,它持续监控一个或多个文件并将每一新行记录到本地或远程系统日志,无论是通过 UDP 还是 TCP。它就像一个魅力。我能够进行一些基准测试,它在大约 3 秒内记录了大约 17,000 行 (1.8MB) 跨子网的 vlan 和它们之间的几个物理交换机,到运行 syslog-ng 的远程服务器。

    要运行程序,您可以执行以下操作(在前台、后台或使用 daemontools 监督):

    ./filelogger -t 'access' -d -p local1.info -n [远程日志主机] -u /tmp/ignored -a $(hostname) /tmp/myfile1 /tmp/myfile2 ...

    /tmp/myfile1 和 /tmp/myfile2 是被监控的文件。

    “-a”是我添加的新选项。在这种情况下,我在每个日志行的开头插入本地主机名。

    当我提出这个问题时,这个解决方案正是我正在寻找的解决方案类型,而且事实证明,直到我自己制作它才存在。:)

    • 0

相关问题

  • 解释dmesg的输出

  • 您将如何通过公共互联网*安全地*发送系统日志?

  • 如何将 Windows Server 2008 事件日志发送到 syslog 服务器?

  • 有没有办法过滤系统日志条目?

  • 生成模拟日志消息

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve