Как войти в вывод консоли конвейера jenkins, используя log4j - PullRequest
1 голос
/ 03 марта 2020

Нам нужно, чтобы наши журналы заданий jenkins выполнялись в Splunk. Для этого я пытаюсь добавить стандартную запись в проект (groovy), используя log4j. Я столкнулся с множеством проблем при попытке сделать это.

Мой простой конвейерный код jenkinsfile:

stage('Initialization') {
        steps {
            script {
                try {
                    def file = findFiles(glob: '**/foo.groovy')
                    helpers = load(file[0].getPath())
                    helpers.foo()
                } catch (Exception e) {
                    println("Error during initialization: " + e.getMessage())
                    println(e.getStackTrace().toString())
                }
            }
        }
    }

foo. groovy

@Grab('log4j:log4j:1.2.17')

import org.apache.log4j.*
import groovy.util.logging.*
import org.slf4j.LoggerFactory


def foo() {
  def log = LoggerFactory.getLogger("")
  def config = new ConfigSlurper().parse(new File("${env.WORKSPACE}/log4jconfig.groovy").toURL())
  PropertyConfigurator.configure(config.toProperties())

  log.trace "foo"
  log.debug "foo"
  log.warn  "foo"
  log.info  "foo"
  log.error "foo"
}

return this

Я не смог использовать log4j, добавив аннотацию к классу, поскольку jenkins сказал бы: «Захват аннотации jenkins нельзя использовать в песочнице».

Изначально я попытался без какой-либо конфигурации, но это не сработало, поэтому я попробовал это как показано здесь

log4jconfig. groovy

log4j {
appender.stdout = "org.apache.log4j.ConsoleAppender"
appender."stdout.layout"="org.apache.log4j.PatternLayout"
appender.scrlog = "org.apache.log4j.FileAppender"
appender."scrlog.layout"="org.apache.log4j.TTCCLayout"
appender."scrlog.file"="script.log"

rootLogger="debug,scrlog,stdout"

}

Но это тоже не сработало. Я не получаю никаких журналов в выводе консоли, и файл script.log не создается. Есть ли способ настроить log4j в groovy, чтобы я получал журналы на выходе консоли jenkins.

Я уже рассмотрел использование echo для форматирования журналов в формате log4j как:

def log(level, msg){
 echo "${java.time.LocalDateTime.now()} level=${level} build=${BUILD_NUMBER} job=${JOB_NAME} 
  stage=${STAGE_NAME} message=${msg}"
}
def info(msg){
 log("INFO",msg)
}

и это работает, но я хочу использовать log4j, если это возможно.

...