Skip to content

Commit d8c18bf

Browse files
committed
add logback support
1 parent b16377d commit d8c18bf

File tree

9 files changed

+156
-15
lines changed

9 files changed

+156
-15
lines changed

build.gradle

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -253,12 +253,13 @@ ext.lib = [
253253
jopt_simple: "net.sf.jopt-simple:jopt-simple:5.0.4",
254254
plexus_utils: "org.codehaus.plexus:plexus-utils:3.2.1",
255255
reflections: "org.reflections:reflections:0.10.2",
256-
slf4j_api: "org.slf4j:slf4j-api:1.7.30",
257-
log4j_api: "org.apache.logging.log4j:log4j-api:2.17.1",
258-
log4j_core:"org.apache.logging.log4j:log4j-core:2.17.1",
259-
log4j_slf4j_impl: "org.apache.logging.log4j:log4j-slf4j-impl:2.17.1",
256+
slf4j_api: "org.slf4j:slf4j-api:1.7.36",
257+
log4j_api: "org.apache.logging.log4j:log4j-api:2.24.3",
258+
log4j_core:"org.apache.logging.log4j:log4j-core:2.24.3",
259+
log4j_slf4j_impl: "org.apache.logging.log4j:log4j-slf4j-impl:2.24.3",
260260
//for async log4j2 logging
261261
disruptor: "com.lmax:disruptor:3.4.4",
262+
logback_classic: "ch.qos.logback:logback-classic:1.3.15",
262263
zip4j: "net.lingala.zip4j:zip4j:2.11.5",
263264
version_compare :"io.github.g00fy2:versioncompare:1.4.1",
264265

butterfly-cli/build.gradle

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,13 @@ dependencies {
1212
lib.commons_io,
1313
lib.log4j_api,
1414
lib.log4j_core,
15+
lib.commons_lang3,
1516
lib.disruptor
1617
compile (lib.log4j_slf4j_impl) {
1718
// favor newer 1.7.30
1819
exclude(module: 'slf4j-api')
1920
}
21+
compileOnly (lib.logback_classic)
2022
compile (lib.spring_boot_starter) {
2123
exclude(module: 'commons-logging')
2224
exclude(module: 'logback-classic')

butterfly-cli/src/main/java/com/paypal/butterfly/cli/ButterflyCliApp.java

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,16 @@
66
import com.google.gson.stream.JsonReader;
77
import com.google.gson.stream.JsonWriter;
88
import com.paypal.butterfly.api.ButterflyFacade;
9-
import com.paypal.butterfly.cli.logging.LogFileDefiner;
9+
import com.paypal.butterfly.cli.logging.LogFileDefinition;
1010
import joptsimple.OptionException;
1111
import org.apache.commons.io.FileUtils;
12+
import org.apache.commons.lang3.function.Failable;
1213
import org.slf4j.Logger;
1314
import org.slf4j.LoggerFactory;
1415
import org.springframework.boot.SpringApplication;
1516
import org.springframework.boot.autoconfigure.SpringBootApplication;
1617
import org.springframework.context.ConfigurableApplicationContext;
18+
import org.springframework.util.ClassUtils;
1719
import org.springframework.util.StringUtils;
1820

1921
import java.io.File;
@@ -26,7 +28,7 @@
2628
*
2729
* @author facarvalho
2830
*/
29-
@SpringBootApplication
31+
@SpringBootApplication(scanBasePackages = "com.paypal.butterfly")
3032
class ButterflyCliApp extends ButterflyCliOption {
3133

3234
private File butterflyHome;
@@ -41,16 +43,21 @@ public static void main(String... arguments) {
4143
System.exit(exitStatus);
4244
}
4345

46+
private Class<?> getButterflyCliAppClass() {
47+
final String className = System.getProperty("butterfly.config", "com.paypal.butterfly.cli.ButterflyCliApp");
48+
return Failable.call(() -> Class.forName(className, true, ClassUtils.getDefaultClassLoader()));
49+
}
50+
4451
ButterflyCliRun run(String... arguments) {
4552
setButterflyHome();
4653

47-
LogFileDefiner.setButterflyHome(butterflyHome);
54+
LogFileDefinition.getInstance().setButterflyHome(butterflyHome);
4855

4956
setEnvironment(arguments);
5057

5158
logger = LoggerFactory.getLogger(ButterflyCliApp.class);
5259

53-
ConfigurableApplicationContext applicationContext = SpringApplication.run(ButterflyCliApp.class, arguments);
60+
ConfigurableApplicationContext applicationContext = SpringApplication.run(getButterflyCliAppClass(), arguments);
5461
ButterflyFacade butterflyFacade = applicationContext.getBean(ButterflyFacade.class);
5562

5663
setBanner(butterflyFacade);
@@ -81,7 +88,8 @@ private void setEnvironment(String[] arguments) {
8188
setOptionSet(arguments);
8289
File applicationFolder = getApplicationFolder();
8390
boolean debug = optionSet.has(CLI_OPTION_DEBUG);
84-
LogFileDefiner.setLogFileName(applicationFolder, debug);
91+
92+
LogFileDefinition.getInstance().setLogFileName(applicationFolder, debug);
8593
} catch (OptionException e) {
8694
Logger logger = LoggerFactory.getLogger(ButterflyCliApp.class);
8795
logger.info("Butterfly application transformation tool");

butterfly-cli/src/main/java/com/paypal/butterfly/cli/ButterflyCliRunner.java

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import com.paypal.butterfly.api.Configuration;
55
import com.paypal.butterfly.api.TransformationResult;
66
import com.paypal.butterfly.cli.logging.LogConfigurator;
7-
import com.paypal.butterfly.cli.logging.LogFileDefiner;
7+
import com.paypal.butterfly.cli.logging.LogFileDefinition;
88
import com.paypal.butterfly.extensions.api.Extension;
99
import com.paypal.butterfly.extensions.api.TransformationTemplate;
1010
import com.paypal.butterfly.extensions.api.exception.ButterflyRuntimeException;
@@ -207,15 +207,15 @@ ButterflyCliRun run(File butterflyHome, String butterflyBanner) {
207207
transformationResult = butterflyFacade.transform(applicationFolder, templateClass, null, configuration).get();
208208
}
209209

210-
run.setLogFile(LogFileDefiner.getLogFile());
210+
run.setLogFile(getLogFile());
211211

212212
if (transformationResult.isSuccessful()) {
213213
logger.info("");
214214
logger.info("----------------------------------------------");
215215
logger.info("Application has been transformed successfully!");
216216
logger.info("----------------------------------------------");
217217
logger.info("Transformed application folder: {}", transformationResult.getTransformedApplicationDir());
218-
logger.info("Check log file for details: {}", LogFileDefiner.getLogFile().getAbsolutePath());
218+
logger.info("Check log file for details: {}", getLogFile().getAbsolutePath());
219219

220220
if (transformationResult.hasManualInstructions()) {
221221
logger.info("");
@@ -244,13 +244,19 @@ ButterflyCliRun run(File butterflyHome, String butterflyBanner) {
244244
return run;
245245
}
246246

247+
private static File getLogFile() {
248+
return LogFileDefinition.getInstance().getLogFile();
249+
}
250+
247251
private void transformationAbort(ButterflyCliRun run, String abortMessage) {
248252
logger.info("");
249253
logger.info("--------------------------------------------------------------------------------------------");
250254
logger.error("*** Transformation has been aborted due to:");
251255
logger.error("*** {}", abortMessage);
252256
logger.info("--------------------------------------------------------------------------------------------");
253-
logger.info("Check log file for details: {}", LogFileDefiner.getLogFile().getAbsolutePath());
257+
if (getLogFile() != null) {
258+
logger.info("Check log file for details: {}", getLogFile().getAbsoluteFile());
259+
}
254260

255261
run.setErrorMessage("Transformation has been aborted due to: " + abortMessage);
256262
run.setExceptionMessage(abortMessage);
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package com.paypal.butterfly.cli.logback;
2+
3+
import ch.qos.logback.classic.Logger;
4+
import com.paypal.butterfly.cli.logging.LogConfigurator;
5+
import org.slf4j.event.Level;
6+
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
7+
import org.springframework.stereotype.Component;
8+
9+
import static org.slf4j.LoggerFactory.getLogger;
10+
11+
@Component
12+
@ConditionalOnProperty(name = "butterfly.logging.system", havingValue = "logback")
13+
public class LogbackLogConfigurator extends LogConfigurator {
14+
15+
@Override
16+
public void setLoggerLevel(final String logger, final Level level) {
17+
final ch.qos.logback.classic.Level logbackLevel = ch.qos.logback.classic.Level.toLevel(level.toString());
18+
getLogbackLogger(logger).setLevel(logbackLevel);
19+
}
20+
21+
@Override
22+
public void setLoggerLevel(final Class logger, final Level level) {
23+
setLoggerLevel(logger.getName(), level);
24+
}
25+
26+
@Override
27+
public void setVerboseMode(final boolean on) {
28+
setLoggerLevel("ROOT", Level.DEBUG);
29+
}
30+
31+
@Override
32+
public void setLogToFile(final boolean on) {
33+
// no op
34+
}
35+
36+
@Override
37+
public boolean isVerboseMode() {
38+
return getLogbackLogger("ROOT").isDebugEnabled();
39+
}
40+
41+
private static Logger getLogbackLogger(final String loggerName) {
42+
return (Logger) getLogger(loggerName);
43+
}
44+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.paypal.butterfly.cli.logback;
2+
3+
import com.paypal.butterfly.cli.logging.LogFileDefinition;
4+
5+
import java.io.File;
6+
7+
public class LogbackLogFileDefiner implements LogFileDefinition {
8+
9+
private static final LogbackLogFileDefiner INSTANCE = new LogbackLogFileDefiner();
10+
11+
public static LogbackLogFileDefiner getInstance() {
12+
return INSTANCE;
13+
}
14+
15+
@Override
16+
public void setButterflyHome(final File butterflyHome) {
17+
// no op. File logging not supported
18+
}
19+
20+
@Override
21+
public void setLogFileName(final File applicationFolder, final boolean debug) {
22+
// no op. File logging not supported
23+
}
24+
25+
@Override
26+
public File getLogFile() {
27+
// File logging not supported
28+
return null;
29+
}
30+
}

butterfly-cli/src/main/java/com/paypal/butterfly/cli/logging/Log4j2LogConfigurator.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,11 @@
55
import org.apache.logging.log4j.core.Layout;
66
import org.apache.logging.log4j.core.Appender;
77
import org.apache.logging.log4j.core.LoggerContext;
8-
import org.apache.logging.log4j.core.config.LoggerConfig;
98
import org.apache.logging.log4j.core.config.Configuration;
109
import org.apache.logging.log4j.core.layout.PatternLayout;
1110
import org.apache.logging.log4j.core.appender.ConsoleAppender;
12-
import org.apache.logging.log4j.core.layout.PatternLayout.Builder;
1311

12+
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
1413
import org.springframework.stereotype.Component;
1514

1615
/**
@@ -20,6 +19,7 @@
2019
*/
2120

2221
@Component
22+
@ConditionalOnProperty(name = "butterfly.logging.system", havingValue = "log4j2", matchIfMissing = true)
2323
public class Log4j2LogConfigurator extends LogConfigurator {
2424

2525
private static final LoggerContext context = (LoggerContext)LogManager.getContext(false);
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package com.paypal.butterfly.cli.logging;
2+
3+
import com.paypal.butterfly.cli.logback.LogbackLogFileDefiner;
4+
5+
import java.io.File;
6+
7+
public interface LogFileDefinition {
8+
9+
static LogFileDefinition getInstance() {
10+
if ("log4j2".equals(System.getProperty("butterfly.logging.system", "log4j2"))) {
11+
return new LogFileDefinition() {
12+
@Override
13+
public void setButterflyHome(final File butterflyHome) {
14+
LogFileDefiner.setButterflyHome(butterflyHome);
15+
}
16+
17+
@Override
18+
public void setLogFileName(final File applicationFolder, final boolean debug) {
19+
LogFileDefiner.setLogFileName(applicationFolder, debug);
20+
}
21+
22+
@Override
23+
public File getLogFile() {
24+
return LogFileDefiner.getLogFile();
25+
}
26+
};
27+
}
28+
29+
return LogbackLogFileDefiner.getInstance();
30+
}
31+
32+
void setButterflyHome(File butterflyHome);
33+
34+
void setLogFileName(File applicationFolder, boolean debug);
35+
36+
File getLogFile();
37+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<configuration>
3+
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
4+
<encoder>
5+
<pattern>[%d{HH:mm:ss.SSS}] [%-4level] %msg%n</pattern>
6+
</encoder>
7+
</appender>
8+
9+
<root level="info">
10+
<appender-ref ref="STDOUT"/>
11+
</root>
12+
13+
</configuration>

0 commit comments

Comments
 (0)