Changed logging framework to SLF4J/Logback

This commit is contained in:
Vhati 2017-12-27 04:26:27 -05:00
parent 8038ba2f56
commit 80c151aef8
23 changed files with 158 additions and 110 deletions

32
pom.xml
View file

@ -22,24 +22,34 @@
-->
<dependencies>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.0-beta9</version>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.0-beta9</version>
<groupId>org.slf4j</groupId>
<artifactId>jul-to-slf4j</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>com.ovh.ws</groupId>
<artifactId>jsonizer-json-jackson</artifactId>
<version>2.2.0</version>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<dependency> <!-- Since 2.7, uses Java 7 features via reflection, but runs on Java 6. -->
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.7.9.2</version> <!-- Since 2.8, will not run on Java 6. -->
</dependency>
<dependency>
<groupId>ar.com.hjg</groupId>
<artifactId>pngj</artifactId>
<version>2.0.1</version>
<version>2.1.0</version>
</dependency>
<dependency>
<groupId>org.jdom</groupId>
@ -49,7 +59,7 @@
<dependency>
<groupId>commons-cli</groupId>
<artifactId>commons-cli</artifactId>
<version>1.2</version>
<version>1.4</version>
</dependency>
</dependencies>

View file

@ -41,16 +41,13 @@ This project depends on the following libraries.
- JDOM 2.x
http://www.jdom.org/
(For JavaDocs, look left.)
- log4j2
http://logging.apache.org/log4j/2.x/
(JavaDocs are not available.)
There was a bug in Java 1.7.0_25 that causes log4j2-beta8 to hang
the moment a Logger object is created. 1.7.0_40 fixed it, 1.6 didn't
have the bug, and log4j2-beta9 will compensate, when it's released.
https://issues.apache.org/jira/browse/LOG4J2-322
- Apache Commons CLI 1.2
- SLF4J
https://www.slf4j.org/
(For JavaDocs, look left.)
- Logback
https://logback.qos.ch/
(For JavaDocs, look left.)
- Apache Commons CLI 1.x
http://commons.apache.org/proper/commons-cli/
(For JavaDocs, scroll down.)

View file

@ -18,7 +18,8 @@
"Edited a comment in boilerplate mod metadata to include AE ships",
"Made the comments in boilerplace mod metadata optional",
"Fixed omitted Validate warnings for PNG files",
"Added Validate warnings about FTL 1.6.1+ for TTF, MP3, and PNG files"
"Added Validate warnings about FTL 1.6.1+ for TTF, MP3, and PNG files",
"Changed logging framework to SLF4J/Logback"
]
},
{

View file

@ -5,6 +5,7 @@ Changelog
- Made the comments in boilerplace mod metadata optional
- Fixed omitted Validate warnings for PNG files
- Added Validate warnings about FTL 1.6.1+ for TTF, MP3, and PNG files
- Changed logging framework to SLF4J/Logback
1.9:
- Fixed corrupted civilian sector music in FTL 1.6.1+

View file

@ -5,6 +5,8 @@ import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.Date;
import java.util.Properties;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
@ -13,8 +15,13 @@ import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UIManager.LookAndFeelInfo;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
import ch.qos.logback.core.FileAppender;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.bridge.SLF4JBridgeHandler;
import net.vhati.modmanager.cli.SlipstreamCLI;
import net.vhati.modmanager.core.ComparableVersion;
@ -25,7 +32,7 @@ import net.vhati.modmanager.ui.ManagerFrame;
public class FTLModManager {
private static final Logger log = LogManager.getLogger( FTLModManager.class );
private static final Logger log = LoggerFactory.getLogger( FTLModManager.class );
public static final String APP_NAME = "Slipstream Mod Manager";
public static final ComparableVersion APP_VERSION = new ComparableVersion( "1.9" );
@ -34,8 +41,42 @@ public class FTLModManager {
public static void main( String[] args ) {
if ( args.length > 0 ) SlipstreamCLI.main( args );
// Redirect any libraries' java.util.Logging messages.
SLF4JBridgeHandler.removeHandlersForRootLogger();
SLF4JBridgeHandler.install();
// Doing this here instead of in "logback.xml", allows for conditional log files.
// For example, the app could decide not to or in a different place.
// Fork log into a file.
LoggerContext lc = (LoggerContext)LoggerFactory.getILoggerFactory();
PatternLayoutEncoder encoder = new PatternLayoutEncoder();
encoder.setContext( lc );
encoder.setCharset( Charset.forName( "UTF-8" ) );
encoder.setPattern( "%d{HH:mm:ss.SSS} [%thread] %-5level %logger{5} - %msg%n" );
encoder.start();
FileAppender<ILoggingEvent> fileAppender = new FileAppender<ILoggingEvent>();
fileAppender.setContext( lc );
fileAppender.setName( "LogFile" );
fileAppender.setFile( new File( "./modman-log.txt" ).getAbsolutePath() );
fileAppender.setAppend( false );
fileAppender.setEncoder( encoder );
fileAppender.start();
lc.getLogger( Logger.ROOT_LOGGER_NAME ).addAppender( fileAppender );
// Log a welcome message.
log.debug( "Started: {}", new Date() );
log.debug( "{} v{}", APP_NAME, APP_VERSION );
log.debug( "OS: {} {}", System.getProperty( "os.name" ), System.getProperty( "os.version" ) );
log.debug( "VM: {}, {}, {}", System.getProperty( "java.vm.name" ), System.getProperty( "java.version" ), System.getProperty( "os.arch" ) );
if ( args.length > 0 ) {
SlipstreamCLI.main( args );
return;
}
// Ensure all popups are triggered from the event dispatch thread.
@ -50,15 +91,12 @@ public class FTLModManager {
private static void guiInit() {
try {
log.debug( String.format( "%s v%s", APP_NAME, APP_VERSION ) );
log.debug( String.format( "%s %s", System.getProperty( "os.name" ), System.getProperty( "os.version" ) ) );
log.debug( String.format( "%s, %s, %s", System.getProperty( "java.vm.name" ), System.getProperty( "java.version" ), System.getProperty( "os.arch" ) ) );
// Nag if the jar was double-clicked.
if ( new File( "./mods/" ).exists() == false ) {
String currentPath = new File( "." ).getAbsoluteFile().getParentFile().getAbsolutePath();
log.error( String.format( "Slipstream could not find its own folder (Currently in \"%s\"), exiting...", currentPath ) );
showErrorDialog( String.format( "Slipstream could not find its own folder.\nCurrently in: %s\n\nRun one of the following instead of the jar...\nWindows: modman.exe or modman_admin.exe\nLinux/OSX: modman.command or modman-cli.sh\n\nThe Mod Manager will now exit.", currentPath ) );
System.err.println( String.format( "Slipstream could not find its own folder (Currently in \"%s\"), exiting.", currentPath ) );
throw new ExitException();
}

View file

@ -23,8 +23,8 @@ import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.ParseException;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import net.vhati.ftldat.AbstractPack;
import net.vhati.ftldat.FolderPack;
@ -44,7 +44,7 @@ import net.vhati.modmanager.core.SlipstreamConfig;
public class SlipstreamCLI {
private static final Logger log = LogManager.getLogger(SlipstreamCLI.class);
private static final Logger log = LoggerFactory.getLogger( SlipstreamCLI.class );
private static File backupDir = new File( "./backup/" );
private static File modsDir = new File( "./mods/" );

View file

@ -6,8 +6,8 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import net.vhati.ftldat.PackUtilities;
import net.vhati.modmanager.core.HashObserver;
@ -21,7 +21,7 @@ import net.vhati.modmanager.core.HashObserver;
*/
public class HashThread extends Thread {
private static final Logger log = LogManager.getLogger( HashThread.class );
private static final Logger log = LoggerFactory.getLogger( HashThread.class );
private List<File> fileList = new ArrayList<File>();
private HashObserver hashObserver = null;

View file

@ -16,8 +16,8 @@ import java.util.zip.ZipInputStream;
import org.jdom2.JDOMException;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import net.vhati.ftldat.AbstractPack;
import net.vhati.ftldat.AbstractPack.RepackResult;
@ -31,7 +31,7 @@ import net.vhati.modmanager.core.ModUtilities;
public class ModPatchThread extends Thread {
private static final Logger log = LogManager.getLogger( ModPatchThread.class );
private static final Logger log = LoggerFactory.getLogger( ModPatchThread.class );
// Other threads can check or set this.
public volatile boolean keepRunning = true;

View file

@ -36,8 +36,8 @@ import org.jdom2.JDOMException;
import org.jdom2.input.JDOMParseException;
import org.jdom2.input.SAXBuilder;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import net.vhati.modmanager.core.EmptyAwareSAXHandlerFactory;
import net.vhati.modmanager.core.EOLWriter;
@ -48,7 +48,7 @@ import net.vhati.modmanager.core.SloppyXMLParser;
public class ModUtilities {
private static final Logger log = LogManager.getLogger(ModUtilities.class);
private static final Logger log = LoggerFactory.getLogger( ModUtilities.class );
private static Pattern junkFilePtn = Pattern.compile( "[.]DS_Store$|(?:^|/)thumbs[.]db$|(?:^|/)[.]dropbox$|(?:^|/)~|~$|(?:^|/)#.+#$" );

View file

@ -9,8 +9,8 @@ import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import net.vhati.ftldat.PackUtilities;
import net.vhati.modmanager.core.ModDB;
@ -27,7 +27,7 @@ import net.vhati.modmanager.xml.JDOMModMetadataReader;
*/
public class ModsScanThread extends Thread {
private static final Logger log = LogManager.getLogger( ModsScanThread.class );
private static final Logger log = LoggerFactory.getLogger( ModsScanThread.class );
private List<File> fileList = new ArrayList<File>();
private ModDB newDB;

View file

@ -15,8 +15,8 @@ import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import net.vhati.modmanager.core.AutoUpdateInfo;
import net.vhati.modmanager.core.ComparableVersion;
@ -24,7 +24,7 @@ import net.vhati.modmanager.core.ComparableVersion;
public class JacksonAutoUpdateReader {
private static final Logger log = LogManager.getLogger( JacksonAutoUpdateReader.class );
private static final Logger log = LoggerFactory.getLogger( JacksonAutoUpdateReader.class );
public static AutoUpdateInfo parse( File jsonFile ) {
@ -75,7 +75,7 @@ public class JacksonAutoUpdateReader {
exception = e;
}
if ( exception != null ) {
log.error( exception );
log.error( "Failed to parse info about available updates", exception );
return null;
}

View file

@ -10,8 +10,8 @@ import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import net.vhati.modmanager.core.ModDB;
import net.vhati.modmanager.core.ModInfo;
@ -19,7 +19,7 @@ import net.vhati.modmanager.core.ModInfo;
public class JacksonCatalogReader {
private static final Logger log = LogManager.getLogger( JacksonCatalogReader.class );
private static final Logger log = LoggerFactory.getLogger( JacksonCatalogReader.class );
public static ModDB parse( File jsonFile ) {

View file

@ -18,13 +18,13 @@ import java.util.Date;
import java.util.List;
import java.util.Map;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class URLFetcher {
private static final Logger log = LogManager.getLogger( URLFetcher.class );
private static final Logger log = LoggerFactory.getLogger( URLFetcher.class );
/**

View file

@ -53,8 +53,8 @@ import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.ParseException;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import net.vhati.ftldat.PackUtilities;
import net.vhati.modmanager.core.ModDB;
@ -66,7 +66,7 @@ import net.vhati.modmanager.json.JacksonCatalogWriter;
public class ForumScraper {
private static final Logger log = LogManager.getLogger( ForumScraper.class );
private static final Logger log = LoggerFactory.getLogger( ForumScraper.class );
private static final String MASTER_LIST_URL = "https://subsetgames.com/forum/viewtopic.php?f=11&t=2645";
private static final String FORUM_URL_FRAGMENT = "https://subsetgames.com/forum/viewtopic.php";

View file

@ -22,8 +22,8 @@ import javax.swing.ScrollPaneConstants;
import javax.swing.event.AncestorEvent;
import javax.swing.event.AncestorListener;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import net.vhati.modmanager.ui.FieldEditorPanel;
import net.vhati.modmanager.ui.FieldEditorPanel.ContentType;
@ -33,7 +33,7 @@ import net.vhati.modmanager.xml.JDOMModMetadataWriter;
public class CreateModDialog extends JDialog implements ActionListener {
private static final Logger log = LogManager.getLogger( CreateModDialog.class );
private static final Logger log = LoggerFactory.getLogger( CreateModDialog.class );
protected static final String DIR_NAME = "Directory Name";
protected static final String AUDIO_ROOT = "audio/";

View file

@ -10,8 +10,8 @@ import java.util.List;
import javax.swing.JDialog;
import javax.swing.SwingUtilities;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import net.vhati.ftldat.AbstractPack;
import net.vhati.ftldat.FolderPack;
@ -21,7 +21,7 @@ import net.vhati.ftldat.PkgPack;
public class DatExtractDialog extends ProgressDialog {
private static final Logger log = LogManager.getLogger( DatExtractDialog.class );
private static final Logger log = LoggerFactory.getLogger( DatExtractDialog.class );
private boolean started = false;

View file

@ -53,8 +53,8 @@ import javax.swing.UIManager;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import net.vhati.modmanager.core.AutoUpdateInfo;
import net.vhati.modmanager.core.ComparableVersion;
@ -85,7 +85,7 @@ import net.vhati.modmanager.ui.table.ListState;
public class ManagerFrame extends JFrame implements ActionListener, ModsScanObserver, Nerfable, Statusbar, Thread.UncaughtExceptionHandler {
private static final Logger log = LogManager.getLogger( ManagerFrame.class );
private static final Logger log = LoggerFactory.getLogger( ManagerFrame.class );
public static final String CATALOG_URL = "https://raw.github.com/Vhati/Slipstream-Mod-Manager/master/skel_common/backup/current_catalog.json";
public static final String APP_UPDATE_URL = "https://raw.github.com/Vhati/Slipstream-Mod-Manager/master/skel_common/backup/auto_update.json";

View file

@ -15,8 +15,8 @@ import java.util.List;
import java.util.concurrent.locks.Lock;
import javax.swing.SwingUtilities;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import net.vhati.modmanager.core.AutoUpdateInfo;
import net.vhati.modmanager.core.ModDB;
@ -39,7 +39,7 @@ import net.vhati.modmanager.ui.table.ListState;
*/
public class ManagerInitThread extends Thread {
private static final Logger log = LogManager.getLogger( ManagerInitThread.class );
private static final Logger log = LoggerFactory.getLogger( ManagerInitThread.class );
private final ManagerFrame frame;
private final SlipstreamConfig appConfig;

View file

@ -24,15 +24,15 @@ import javax.swing.text.StyleConstants;
import javax.swing.text.StyleContext;
import javax.swing.text.StyledDocument;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import net.vhati.modmanager.ui.Statusbar;
public class ModInfoArea extends JScrollPane {
private static final Logger log = LogManager.getLogger( ModInfoArea.class );
private static final Logger log = LoggerFactory.getLogger( ModInfoArea.class );
private static final String STYLE_REGULAR = "regular";
private static final String STYLE_HYPERLINK = "hyperlink";

View file

@ -8,8 +8,8 @@ import javax.swing.JComponent;
import javax.swing.JTable;
import javax.swing.TransferHandler;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import net.vhati.modmanager.ui.table.Reorderable;
@ -21,7 +21,7 @@ import net.vhati.modmanager.ui.table.Reorderable;
*/
public class TableRowTransferHandler extends TransferHandler {
private static final Logger log = LogManager.getLogger( TableRowTransferHandler.class );
private static final Logger log = LoggerFactory.getLogger( TableRowTransferHandler.class );
private DataFlavor localIntegerFlavor = null;
@ -36,10 +36,10 @@ public class TableRowTransferHandler extends TransferHandler {
this.table = table;
try {
localIntegerFlavor = new DataFlavor( DataFlavor.javaJVMLocalObjectMimeType + ";class=\""+ Integer.class.getName() +"\"" );
localIntegerFlavor = new DataFlavor( String.format( "%s;class=\"%s\"", DataFlavor.javaJVMLocalObjectMimeType, Integer.class.getName() ) );
}
catch ( ClassNotFoundException e ) {
log.error( e );
log.error( "Failed to construct a table row transfer handler", e );
}
}
@ -84,7 +84,7 @@ public class TableRowTransferHandler extends TransferHandler {
}
}
catch ( Exception e ) {
log.error( e );
log.error( "Dragging failed", e );
}
return false;
}

View file

@ -14,8 +14,8 @@ import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import net.vhati.modmanager.core.ModDB;
import net.vhati.modmanager.core.ModInfo;
@ -25,7 +25,7 @@ import net.vhati.modmanager.core.ModUtilities.DecodeResult;
public class JDOMModMetadataReader {
private static final Logger log = LogManager.getLogger( JDOMModMetadataReader.class );
private static final Logger log = LoggerFactory.getLogger( JDOMModMetadataReader.class );
public static final String METADATA_INNERPATH = "mod-appendix/metadata.xml";

View file

@ -1,27 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="warn">
<appenders>
<Console name="Console" target="SYSTEM_ERR">
<ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY" />
<PatternLayout>
<pattern>%-5level %logger{1} - %msg%throwable%n</pattern>
</PatternLayout>
</Console>
<File name="LogFile" fileName="modman-log.txt" append="false">
<ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY" />
<PatternLayout>
<pattern>%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%throwable%n</pattern>
</PatternLayout>
</File>
</appenders>
<loggers>
<logger name="net.vhati" level="trace" additivity="false">
<appender-ref ref="Console"/>
<appender-ref ref="LogFile"/>
</logger>
<root level="error">
<appender-ref ref="Console"/>
<appender-ref ref="LogFile"/>
</root>
</loggers>
</configuration>

View file

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<!-- Notify java.util.logging to adjust its levels, to stop messages that'd get ignored anyway. -->
<contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator" />
<appender name="Console" class="ch.qos.logback.core.ConsoleAppender">
<target>System.err</target>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>info</level>
</filter>
<encoder>
<pattern>%-5level %logger{0} - %msg%n</pattern>
</encoder>
</appender>
<!-- Appenders declared here but not attached to loggers will be ignored. -->
<!-- LogFile appender will be constructed and added programmatically as needed. -->
<!-- Additive loggers inherit appenders and omitted values, like level. -->
<logger name="net.vhati" level="debug" additivity="true">
</logger>
<!-- Limit verbosity of any other packages. -->
<root level="error">
<appender-ref ref="Console" />
</root>
</configuration>