Java Apache2.2程序的管道日志启动一个以上的进程
背景 作为处理和存储日志的一部分,需要存储日志并将其发送给kafka,以便其他程序使用 如下所示的设置填充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
错误日志
文件,并将日志发送到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。有人能解释下一票的原因吗?