2016-11-04 50 views
1

我想捕获詹金斯启动脚本的输出,但我得到的只是一个空输出。如何捕获詹金斯启动日志

詹金斯的输出出现在终端

#!/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文件,任何人有任何建议?

+0

我不能完全肯定关于这个问题,但是如果你必须捕获输出,也许你应该让Jenkins在一个进程中产卵并从另一个进程中捕获日志。也就是说,也许你应该'输出'[像这样](http://stackoverflow.com/questions/692000/how-do-i-write-stderr-to-a-file-while-using-tee-用管道)将文件转换成文件并从那里进行处理,将管道移到awk文件中。 'awk'可以用于'tee'写的文件。 – alok

+0

另外,我假设你不想让日志落在'/ var/log/jenkins/jenkins.log'里吗? – alok

+0

@alok感谢您的回复。问题是输出不会被捕获,即使在shell上显示“awk”管道(一个没有重定向的标志,但仍然会到达相同的地方)。 我已经检查过'/ var/log/jenkins /'并且文件夹是空的 –

回答

0

创建以下groovy文件中:$ JENKINS_HOME/init.groovy.d /额外logging.groovy

重启詹金斯和检查目录$ JENKINS_HOME /日志/

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);