Java Apache2.2程序的管道日志启动一个以上的进程

Java Apache2.2程序的管道日志启动一个以上的进程,java,apache,logging,pipe,Java,Apache,Logging,Pipe,背景 作为处理和存储日志的一部分,需要存储日志并将其发送给kafka,以便其他程序使用 如下所示的设置填充错误日志文件,并将日志发送到stdout 现在进行测试时,它使用了两个不同的程序进行测试,这两个程序使用来自stdout、logger和一个java生产者的日志。但几乎没有观察到差异 设置作为错误日志的httpd.conf的一部分 爪哇 ErrorLog "| /usr/bin/tee -a /var/log/httpd/error_log | java -cp producer.ja

背景

作为处理和存储日志的一部分,需要存储日志并将其发送给kafka,以便其他程序使用

如下所示的设置填充
错误日志
文件,并将日志发送到
stdout

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

设置作为错误日志的httpd.conf的一部分

  • 爪哇

    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"`
    
    ps auxxww | grep producer
    
  • 记录器

    ErrorLog  "| /usr/bin/tee -a /var/log/httpd/error_log | /usr/bin/logger -u /tmp/apache_log.socket"
    
    ps auxxww | grep logger
    
httpd
启动时,它会导致以下过程,每个过程对应于上面给出的相应设置。(删除pid、用户、时间等详细信息以避免混乱)

过程

  • 爪哇

    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"`
    
    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
    /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
  • 记录器

    ErrorLog  "| /usr/bin/tee -a /var/log/httpd/error_log | /usr/bin/logger -u /tmp/apache_log.socket"
    
    ps auxxww | grep logger
    
当使用记录器相关设置时,上述命令给出以下输出

    /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
    /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
问题

对于logger,我可以看到一个进程正在运行,顺便说一句,这是正确的,但是当我在conf文件中使用Java设置时,它为producer创建了两个这样的进程。这是怎么回事

运行48小时后的进程计数

63


它每小时都在生产新工艺。每小时发生的另一个过程是文件的旋转
错误\u日志
。这是使用
logrotate
完成的,它使用
copyruncate
选项。通过将数据从一个文件复制到另一个文件,然后截断原始文件,基本信息保持文件描述符不变。

以下是它的工作原理

我提到了以下链接

如上问题所述,要求将日志发送到
error\u log
文件以及可以以不同方式处理日志的另一个程序(java中的Apache Kafka生产者)

开槽

该设置适用于
logger
,它是一个linux实用程序,但无法与自定义java程序一起使用,原因是,当数据流中遇到
EOF
时,消费程序应该退出。此场景中的java producer程序有一个无限循环,可以从
stdin
连续使用。 因此,它被修改为在遇到
EOF
时处理终止

就Java1.7而言,它是按照

this.stdinReader.readLine()!=空


null
表示EOF。

有人能解释下一票的原因吗?