【问题标题】:Apache 2.2 piping logs to program starts more than 1 processApache 2.2 管道日志到程序启动多个进程
【发布时间】:2017-06-06 01:38:59
【问题描述】:

背景

作为日志处理和存储的一部分,需要将它们存储起来,并发送到kafka,以方便其他程序使用。

如下所示的设置,填充error_log文件以及发送到日志到stdout

现在进行测试,它使用 2 个不同的程序进行了测试,这些程序使用来自 stdoutlogger 和一个 java 生产者的日志。但几乎没有观察到差异。

设置为 httpd.conf 的一部分,用于 ErrorLog

  • Java

    ErrorLog  "| /usr/bin/tee -a /var/log/httpd/error_log |  java -cp producer.jar stdin.producer.StdInProducer /CustomProducer/config.json >> /producer_init.log 2>&1"`
    
  • 记录器

    ErrorLog  "| /usr/bin/tee -a /var/log/httpd/error_log | /usr/bin/logger -u /tmp/apache_log.socket"
    

httpd 启动时,会产生以下进程,每个进程对应于上面给出的相应设置。 (pid、用户、时间等详细信息被删除以避免混乱)

流程

  • Java

    ps auxxww | grep producer
    

导致以下输出

    /bin/sh -c /usr/bin/tee -a /var/log/httpd/error_log | java -cp producer.jar stdin.producer.StdInProducer /CustomProducer/config.json >> /producer_init.log 2>&1                                                                                      
    java -cp producer.jar stdin.producer.StdInProducer /CustomProducer/config.json


    /bin/sh -c /usr/bin/tee -a /var/log/httpd/error_log | java -cp producer.jar stdin.producer.StdInProducer /CustomProducer/config.json >> /producer_init.log 2>&1                                                                                      
    java -cp producer.jar stdin.producer.StdInProducer /CustomProducer/config.json
  • 记录器

    ps auxxww | grep logger
    

当使用记录器相关设置时,上面的命令给出以下输出

    /bin/sh -c /usr/bin/tee -a /var/log/httpd/error_log | /usr/bin/logger -u /tmp/apache_log.socket
    /usr/bin/logger -u /tmp/apache_log.socket

问题

对于记录器,我可以看到一个正在运行的进程 BTW 是正确的,但是当我在 conf 文件中使用 Java 设置时,它会为生产者创建 2 个这样的进程。这是怎么回事?

运行 48 小时后的进程计数

63

它每小时都会启动新进程。每小时发生的唯一其他过程是文件error_log 的轮换。这是使用logrotate 完成的,它使用copytruncate 选项。这通过将数据从文件复制到另一个文件然后截断原始文件来保持文件描述符相同。

【问题讨论】:

  • 有人可以解释下投票的原因吗?

标签: java apache logging pipe


【解决方案1】:

基本信息

下面是它的工作原理

我参考了以下链接

Error log consumption for Apache

Error Log Information

正如上面问题中提到的,要求是将日志发送到error_log 文件以及另一个可以以不同方式处理它们的程序(java 中的 Apache Kafka Producer)

警告

该设置适用于logger,它是一个 linux 实用程序,但无法与自定义 java 程序一起使用,原因是当在数据流中遇到EOF 时,消费程序应该退出。在这种情况下,Java 生产者程序有一个无限循环从stdin 连续消费。 所以修改为在遇到EOF时处理终止。

就 JAVA 1.7 而言,它已完成

this.stdinReader.readLine() != null

null 表示 EOF。

【讨论】:

    猜你喜欢
    • 2012-12-06
    • 1970-01-01
    • 2016-10-06
    • 2015-04-27
    • 2015-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多