3

is it possible to replace log4j from a transitive dependency with logback? Here are my gradle dependencies (https://github.com/geoHeil/lab04/blob/master/build.gradle):

dependencies {
    compile group: 'org.apache.hadoop', name: 'hadoop-common', version: '2.7.1'
    compile group: 'org.apache.hadoop', name: 'hadoop-client', version: '2.7.1'
    compile group: 'org.apache.hadoop', name: 'hadoop-mapreduce-client-core', version: '2.7.1'
    compile group: 'org.slf4j', name: 'slf4j-api', version: '1.7.13'
compile group: 'ch.qos.logback', name: 'logback-classic', version: '1.1.3'
}

configurations.all {
    resolutionStrategy.eachDependency { DependencyResolveDetails details ->
        if (details.requested.name == 'log4j') {
            //prefer 'log4j-over-slf4j' over 'log4j', with fixed version:
            details.useTarget "ch.qos.logback:logback-classic:1.1.3"
        }
    }

My case:

  • I am new to Gradle
  • Working on a Hadoop project
  • Want to use a current logger e.g. logback

For now it does not seem to work even though log4j should have been replaced. And the warning persists:

log4j:WARN No appenders could be found for logger 
(org.apache.hadoop.util.Shell).
log4j:WARN Please initialize the log4j system properly.
Georg Heiler
  • 16,916
  • 36
  • 162
  • 292

1 Answers1

0

I am not sure if this is the best or "correct" answer. But at least the WARN messages have disappeared:

dependencies {
    compile group: 'org.apache.hadoop', name: 'hadoop-common', version: '2.7.1'
    compile group: 'org.apache.hadoop', name: 'hadoop-client', version: '2.7.1'
    compile group: 'org.apache.hadoop', name: 'hadoop-mapreduce-client-core', version: '2.7.1'
    compile group: 'org.slf4j', name: 'slf4j-api', version: '1.7.13'
    compile group: 'org.slf4j', name: 'log4j-over-slf4j', version: '1.7.13'
    compile group: 'commons-io', name: 'commons-io', version: '2.4'
    compile 'ch.qos.logback:logback-classic:1.1.3'
}

configurations.all {
    resolutionStrategy.eachDependency { DependencyResolveDetails details ->
        if (details.requested.name == 'slf4j-log4j12') {
            //prefer 'log4j-over-slf4j' over 'log4j', with fixed version:
            details.useTarget "ch.qos.logback:logback-classic:1.1.3"
        }
    }
}
Georg Heiler
  • 16,916
  • 36
  • 162
  • 292
  • 1
    what about http://buransky.com/programming/exclude-log4j-to-use-slf4j-with-logback-in-a-gradle-project/ ? – Antonin May 29 '18 at 23:11