Skip to content

Commit 3049100

Browse files
committed
Apply log configuration from preferences
1 parent 220c58d commit 3049100

File tree

2 files changed

+145
-104
lines changed

2 files changed

+145
-104
lines changed
Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
/**
2+
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
3+
*/
4+
5+
package net.sourceforge.pmd.eclipse.logging.internal;
6+
7+
import org.eclipse.core.runtime.ILog;
8+
import org.eclipse.core.runtime.IStatus;
9+
import org.eclipse.core.runtime.Status;
10+
import org.slf4j.ILoggerFactory;
11+
import org.slf4j.LoggerFactory;
12+
13+
import net.sourceforge.pmd.eclipse.plugin.PMDPlugin;
14+
15+
import ch.qos.logback.classic.LoggerContext;
16+
import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
17+
import ch.qos.logback.classic.filter.ThresholdFilter;
18+
import ch.qos.logback.classic.spi.ILoggingEvent;
19+
import ch.qos.logback.core.Appender;
20+
import ch.qos.logback.core.rolling.FixedWindowRollingPolicy;
21+
import ch.qos.logback.core.rolling.RollingFileAppender;
22+
import ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy;
23+
24+
public class LogbackConfiguration {
25+
public static final String ROOT_LOG_ID = "net.sourceforge.pmd";
26+
private static final String PMD_ECLIPSE_APPENDER_NAME = "PMDEclipseAppender";
27+
28+
private ILog getLog() {
29+
return PMDPlugin.getDefault().getLog();
30+
}
31+
32+
public void configureLogback() {
33+
unconfigureLogback();
34+
LoggerContext logbackContext = getLogbackContext();
35+
if (logbackContext == null) {
36+
getLog().log(new Status(IStatus.WARNING, PMDPlugin.PLUGIN_ID,
37+
"Couldn't find logback. PMD logging is not available!"));
38+
return;
39+
}
40+
41+
EclipseLogAppender logbackEclipseAppender = new EclipseLogAppender(PMDPlugin.PLUGIN_ID, getLog());
42+
logbackEclipseAppender.setContext(logbackContext);
43+
logbackEclipseAppender.setName(PMDPlugin.PLUGIN_ID);
44+
logbackEclipseAppender.start();
45+
46+
ch.qos.logback.classic.Logger l = logbackContext.getLogger(ROOT_LOG_ID);
47+
l.addAppender(logbackEclipseAppender);
48+
}
49+
50+
public void unconfigureLogback() {
51+
LoggerContext logbackContext = getLogbackContext();
52+
if (logbackContext == null) {
53+
return;
54+
}
55+
56+
ch.qos.logback.classic.Logger l = logbackContext.getLogger(ROOT_LOG_ID);
57+
l.detachAndStopAllAppenders();
58+
}
59+
60+
private void configureLogs(String logFileName, String logLevel) {
61+
LoggerContext logbackContext = getLogbackContext();
62+
if (logbackContext == null) {
63+
return;
64+
}
65+
66+
RollingFileAppender<ILoggingEvent> appender = new RollingFileAppender<>();
67+
appender.setContext(logbackContext);
68+
appender.setFile(logFileName);
69+
appender.setName(PMD_ECLIPSE_APPENDER_NAME);
70+
SizeBasedTriggeringPolicy<ILoggingEvent> triggeringPolicy = new SizeBasedTriggeringPolicy<>();
71+
triggeringPolicy.setContext(logbackContext);
72+
triggeringPolicy.setMaxFileSize("10MB");
73+
triggeringPolicy.start();
74+
appender.setTriggeringPolicy(triggeringPolicy);
75+
76+
FixedWindowRollingPolicy rollingPolicy = new FixedWindowRollingPolicy();
77+
rollingPolicy.setContext(logbackContext);
78+
rollingPolicy.setFileNamePattern(logFileName + ".%i");
79+
rollingPolicy.setMinIndex(1);
80+
rollingPolicy.setMaxIndex(1);
81+
rollingPolicy.setParent(appender);
82+
rollingPolicy.start();
83+
appender.setRollingPolicy(rollingPolicy);
84+
85+
PatternLayoutEncoder encoder = new PatternLayoutEncoder();
86+
encoder.setContext(logbackContext);
87+
encoder.setPattern("%d{yyyy/MM/dd HH:mm:ss,SSS} %-5p %-32c{1} %m%n");
88+
encoder.start();
89+
appender.setEncoder(encoder);
90+
91+
ThresholdFilter filter = new ThresholdFilter();
92+
filter.setContext(logbackContext);
93+
filter.setLevel(logLevel);
94+
filter.start();
95+
appender.addFilter(filter);
96+
97+
appender.start();
98+
99+
ch.qos.logback.classic.Logger rootLogger = logbackContext.getLogger(ROOT_LOG_ID);
100+
rootLogger.addAppender(appender);
101+
}
102+
103+
public void applyLogPreferences(String logFileName, String logLevel) {
104+
LoggerContext logbackContext = getLogbackContext();
105+
if (logbackContext == null) {
106+
return;
107+
}
108+
109+
ch.qos.logback.classic.Logger rootLogger = logbackContext.getLogger(ROOT_LOG_ID);
110+
Appender<ILoggingEvent> appender = rootLogger.getAppender(PMD_ECLIPSE_APPENDER_NAME);
111+
if (appender != null) {
112+
rootLogger.detachAppender(appender);
113+
appender.stop();
114+
}
115+
configureLogs(logFileName, logLevel);
116+
}
117+
118+
private LoggerContext getLogbackContext() {
119+
ILoggerFactory loggerFactory = LoggerFactory.getILoggerFactory();
120+
int maxTries = 10;
121+
while (!(loggerFactory instanceof LoggerContext) && maxTries > 0) {
122+
try {
123+
Thread.sleep(100);
124+
} catch (InterruptedException e) {
125+
Thread.currentThread().interrupt();
126+
return null;
127+
}
128+
maxTries--;
129+
loggerFactory = LoggerFactory.getILoggerFactory();
130+
}
131+
if (loggerFactory instanceof LoggerContext) {
132+
return (LoggerContext) loggerFactory;
133+
}
134+
return null;
135+
}
136+
137+
}

net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/plugin/PMDPlugin.java

Lines changed: 8 additions & 104 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,7 @@
1515
import java.util.Map;
1616
import java.util.Set;
1717

18-
import org.apache.log4j.ConsoleAppender;
19-
import org.apache.log4j.Layout;
20-
import org.apache.log4j.Level;
2118
import org.apache.log4j.Logger;
22-
import org.apache.log4j.PatternLayout;
23-
import org.apache.log4j.RollingFileAppender;
2419
import org.eclipse.core.resources.IFile;
2520
import org.eclipse.core.resources.IFolder;
2621
import org.eclipse.core.resources.IProject;
@@ -56,7 +51,6 @@
5651
import org.eclipse.ui.plugin.AbstractUIPlugin;
5752
import org.osgi.framework.Bundle;
5853
import org.osgi.framework.BundleContext;
59-
import org.slf4j.ILoggerFactory;
6054
import org.slf4j.LoggerFactory;
6155

6256
import net.sourceforge.pmd.PMDConfiguration;
@@ -66,7 +60,7 @@
6660
import net.sourceforge.pmd.eclipse.core.IRuleSetManager;
6761
import net.sourceforge.pmd.eclipse.core.ext.RuleSetsExtensionProcessor;
6862
import net.sourceforge.pmd.eclipse.core.impl.RuleSetManagerImpl;
69-
import net.sourceforge.pmd.eclipse.logging.internal.EclipseLogAppender;
63+
import net.sourceforge.pmd.eclipse.logging.internal.LogbackConfiguration;
7064
import net.sourceforge.pmd.eclipse.runtime.cmd.JavaProjectClassLoader;
7165
import net.sourceforge.pmd.eclipse.runtime.preferences.IPreferences;
7266
import net.sourceforge.pmd.eclipse.runtime.preferences.IPreferencesFactory;
@@ -91,8 +85,6 @@
9185
import net.sourceforge.pmd.lang.LanguageVersion;
9286
import net.sourceforge.pmd.lang.java.JavaLanguageModule;
9387

94-
import ch.qos.logback.classic.LoggerContext;
95-
9688
/**
9789
* The activator class controls the plug-in life cycle
9890
*/
@@ -123,14 +115,14 @@ public class PMDPlugin extends AbstractUIPlugin {
123115

124116
private StringTable stringTable; // NOPMD by Herlin on 11/10/06 00:22
125117

126-
public static final String ROOT_LOG_ID = "net.sourceforge.pmd";
127-
private static final String PMD_ECLIPSE_APPENDER_NAME = "PMDEclipseAppender";
118+
@Deprecated
119+
public static final String ROOT_LOG_ID = LogbackConfiguration.ROOT_LOG_ID;
128120
private IPreferencesFactory preferencesFactory = new PreferencesFactoryImpl();
129121
private IPropertiesFactory propertiesFactory = new PropertiesFactoryImpl();
130122

131123
private final IRuleSetManager ruleSetManager = new RuleSetManagerImpl(); // NOPMD:SingularField
132124

133-
private EclipseLogAppender logbackEclipseAppender;
125+
private final LogbackConfiguration logbackConfiguration = new LogbackConfiguration();
134126

135127
/**
136128
* The constructor
@@ -242,15 +234,15 @@ public static File getPluginFolder() {
242234
*/
243235
public void start(BundleContext context) throws Exception {
244236
super.start(context);
245-
configureLogback();
237+
logbackConfiguration.configureLogback();
246238

247239
// this needs to be executed before the preferences are loaded, because
248240
// the standard
249241
// rulesets are needed for the default active rules.
250242
registerStandardRuleSets();
251243

252244
IPreferences prefs = loadPreferences();
253-
configureLogs(prefs);
245+
logbackConfiguration.applyLogPreferences(prefs.getLogFileName(), prefs.getLogLevel().toString());
254246
registerAdditionalRuleSets();
255247
fileChangeListenerEnabled(prefs.isCheckAfterSaveEnabled());
256248

@@ -271,57 +263,6 @@ public void resourceChanged(IResourceChangeEvent arg0) {
271263
LOGGER.debug("PMD Plugin {} has started...", version);
272264
}
273265

274-
private void configureLogback() {
275-
unconfigureLogback();
276-
LoggerContext logbackContext = getLogbackContext();
277-
if (logbackContext == null) {
278-
return;
279-
}
280-
281-
logbackEclipseAppender = new EclipseLogAppender(PLUGIN_ID, getLog());
282-
logbackEclipseAppender.setContext(logbackContext);
283-
logbackEclipseAppender.setName(PLUGIN_ID);
284-
logbackEclipseAppender.start();
285-
286-
ch.qos.logback.classic.Logger l = logbackContext.getLogger("net.sourceforge.pmd");
287-
l.addAppender(logbackEclipseAppender);
288-
}
289-
290-
private void unconfigureLogback() {
291-
if (logbackEclipseAppender == null) {
292-
return;
293-
}
294-
295-
LoggerContext logbackContext = getLogbackContext();
296-
if (logbackContext == null) {
297-
return;
298-
}
299-
300-
ch.qos.logback.classic.Logger l = logbackContext.getLogger("net.sourceforge.pmd");
301-
l.detachAppender(logbackEclipseAppender);
302-
logbackEclipseAppender.stop();
303-
logbackEclipseAppender = null;
304-
}
305-
306-
private LoggerContext getLogbackContext() {
307-
ILoggerFactory loggerFactory = LoggerFactory.getILoggerFactory();
308-
int maxTries = 10;
309-
while (!(loggerFactory instanceof LoggerContext) && maxTries > 0) {
310-
try {
311-
Thread.sleep(100);
312-
} catch (InterruptedException e) {
313-
Thread.currentThread().interrupt();
314-
return null;
315-
}
316-
maxTries--;
317-
loggerFactory = LoggerFactory.getILoggerFactory();
318-
}
319-
if (loggerFactory instanceof LoggerContext) {
320-
return (LoggerContext) loggerFactory;
321-
}
322-
return null;
323-
}
324-
325266
/**
326267
* Get a list of all the files that are open in eclipse currently
327268
*
@@ -441,7 +382,7 @@ public void stop(BundleContext context) throws Exception {
441382
ShapePainter.disposeAll();
442383
ResourceManager.dispose();
443384
PriorityDescriptorCache.INSTANCE.dispose();
444-
unconfigureLogback();
385+
logbackConfiguration.unconfigureLogback();
445386
super.stop(context);
446387
}
447388

@@ -611,45 +552,8 @@ public IRuleSetWriter getRuleSetWriter() {
611552
return new WriterFactoryImpl().getRuleSetWriter();
612553
}
613554

614-
/**
615-
* Apply the log preferences
616-
*/
617555
public void applyLogPreferences(IPreferences preferences) {
618-
Logger log = Logger.getLogger(ROOT_LOG_ID);
619-
log.setLevel(preferences.getLogLevel());
620-
RollingFileAppender appender = (RollingFileAppender) log.getAppender(PMD_ECLIPSE_APPENDER_NAME);
621-
if (appender == null) {
622-
configureLogs(preferences);
623-
} else if (!appender.getFile().equals(preferences.getLogFileName())) {
624-
appender.setFile(preferences.getLogFileName());
625-
appender.activateOptions();
626-
}
627-
}
628-
629-
/**
630-
* Configure the logging
631-
*
632-
*/
633-
private void configureLogs(IPreferences preferences) {
634-
try {
635-
Layout layout = new PatternLayout("%d{yyyy/MM/dd HH:mm:ss,SSS} %-5p %-32c{1} %m%n");
636-
637-
RollingFileAppender appender = new RollingFileAppender(layout, preferences.getLogFileName());
638-
appender.setName(PMD_ECLIPSE_APPENDER_NAME);
639-
appender.setMaxBackupIndex(1);
640-
appender.setMaxFileSize("10MB");
641-
642-
Logger.getRootLogger().addAppender(new ConsoleAppender(layout));
643-
Logger.getRootLogger().setLevel(Level.WARN);
644-
Logger.getRootLogger().setAdditivity(false);
645-
646-
Logger.getLogger(ROOT_LOG_ID).addAppender(appender);
647-
Logger.getLogger(ROOT_LOG_ID).setLevel(preferences.getLogLevel());
648-
Logger.getLogger(ROOT_LOG_ID).setAdditivity(false);
649-
650-
} catch (IOException e) {
651-
logError("IO Exception when configuring logging.", e);
652-
}
556+
logbackConfiguration.applyLogPreferences(preferences.getLogFileName(), preferences.getLogLevel().toString());
653557
}
654558

655559
/**

0 commit comments

Comments
 (0)