Bash 如何捕获Jenkins启动日志

Bash 如何捕获Jenkins启动日志,bash,shell,jenkins,Bash,Shell,Jenkins,我试图捕获Jenkins启动脚本的输出,但得到的只是一个空输出 Jenkins的输出显示在终端中 #!/bin/bash function sendNotificationOnSlack() { curl -X POST ... } export -f sendNotificationOnSlack java -Dhudson.DNSMultiCast.disabled=true -jar /usr/local/opt/jenkins/libexec/jenkins.war --http

我试图捕获Jenkins启动脚本的输出,但得到的只是一个空输出

Jenkins的输出显示在终端中

#!/bin/bash
function sendNotificationOnSlack() {
    curl -X POST ...
}
export -f sendNotificationOnSlack
java -Dhudson.DNSMultiCast.disabled=true -jar /usr/local/opt/jenkins/libexec/jenkins.war --httpPort=3999 | awk '/Jenkins is fully up and running/ {system("bash -c sendNotificationOnSlack")}'
我甚至尝试捕获TTY的输出,但显示为空

#!/bin/bash
currentTTY=$(tty)
echo $currentTTY
function sendNotificationOnSlack() {
    curl -X POST ...
}
export -f sendNotificationOnSlack
java -Dhudson.DNSMultiCast.disabled=true -jar /usr/local/opt/jenkins/libexec/jenkins.war --httpPort=3999
tail -f $currentTTY | awk '/Jenkins is fully up and running/ {system("bash -c sendNotificationOnSlack")}'

我尝试到处搜索,但找不到jenkins.log文件,有人有什么建议吗?

创建以下groovy文件:$jenkins_HOME/init.groovy.d/extra-logging.groovy

重新启动Jenkins并检查目录$Jenkins_HOME/logs/

import java.util.logging.ConsoleHandler
import java.util.logging.FileHandler
import java.util.logging.SimpleFormatter
import java.util.logging.LogManager
import jenkins.model.Jenkins

def logsDir = new File(Jenkins.instance.rootDir, "logs")

if(!logsDir.exists()){
    println "--> creating log dir";
    logsDir.mkdirs();
}

def loggerWinstone = LogManager.getLogManager().getLogger("");
FileHandler handlerWinstone = new FileHandler(logsDir.absolutePath + "/jenkins-winstone.log", 1024 * 1024, 10, true);

handlerWinstone.setFormatter(new SimpleFormatter());
loggerWinstone.addHandler (new ConsoleHandler());
loggerWinstone.addHandler(handlerWinstone);

我不完全确定这个问题,但是如果您必须捕获输出,也许您应该让Jenkins在一个进程中生成,并从另一个进程中捕获日志。也就是说,也许您应该
tee
将输出转换成文件并从中处理,将管道移除到
awk
awk
可以用于
tee
编写的文件。另外,我假设您不希望日志落入
/var/log/jenkins/jenkins.log中,对吗?@alok谢谢您的回复。问题在于,即使shell上显示piped
awk
,输出也不会被捕获(一个没有被重定向但仍将到达相同位置的标志)。我已经检查了
/var/log/jenkins/
,文件夹是空的。当输出通过管道传输到awk时,它只是标准输出。如果您确定Jenkins/Java进程已经生成,您可以使用
2>&1
重试运行,以将stderr重定向到stdout中,并将其重定向到awk中。我之所以这样说,是因为大多数Java服务器在stderr上或用Java术语吐日志:
System.err