simple-logger v1.0
This commit is contained in:
@@ -0,0 +1,4 @@
|
|||||||
|
/target/
|
||||||
|
/maven-repo.bat
|
||||||
|
/.idea/
|
||||||
|
*.iml
|
||||||
@@ -0,0 +1,89 @@
|
|||||||
|
# Simple Logger
|
||||||
|
A simple but useful Java logger to use everywhere.
|
||||||
|
|
||||||
|
Current version v1.0
|
||||||
|
|
||||||
|
## Download
|
||||||
|
|
||||||
|
* [simple-logger-1.0.jar](../../raw/master/download/simple-logger-1.0.jar)
|
||||||
|
|
||||||
|
## How to use
|
||||||
|
|
||||||
|
Initialization :
|
||||||
|
```Java
|
||||||
|
Logger.init("logging.properties", Level.WARNING);
|
||||||
|
// or
|
||||||
|
Logger.init("logging.properties");
|
||||||
|
Logger.setLevel(Level.WARNING);
|
||||||
|
```
|
||||||
|
|
||||||
|
Configuration file as follow (example) :
|
||||||
|
```
|
||||||
|
#Parameters for good behavior
|
||||||
|
handlers=java.util.logging.ConsoleHandler
|
||||||
|
.level=WARNING
|
||||||
|
java.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter
|
||||||
|
|
||||||
|
#Customize date/time shown with this line
|
||||||
|
java.util.logging.SimpleFormatter.format=[%1$tF %1$tT][%4$s]%5$s %n
|
||||||
|
|
||||||
|
#Specify your app name here
|
||||||
|
app_name=YourApp
|
||||||
|
# (Optional, specify your app package)
|
||||||
|
default_package=com.your.app
|
||||||
|
```
|
||||||
|
|
||||||
|
The default package works as follow : When logging stack trace of an error, it will stop when the package doesnt't match your app anymore. It helps having small and relevant stack trace in logs.
|
||||||
|
|
||||||
|
Usage :
|
||||||
|
```Java
|
||||||
|
//general logging
|
||||||
|
Logger.log("my message"); //INFO log
|
||||||
|
Logger.log("my message : {0}", 123); //INFO log with parameters
|
||||||
|
Logger.log(Level.WARNING, "my message"); //custom level log
|
||||||
|
Logger.log(Level.SEVERE, "my message : {0}-{1}", 123, 456); //custom level log with parameters
|
||||||
|
//exception logging
|
||||||
|
Logger.log(exception1); //SEVERE logging with stack trace
|
||||||
|
Logger.log(exception2, "exception when doing task"); //SEVERE logging with stack trace and message
|
||||||
|
Logger.log(Level.WARNING, exception3); //custom level logging without stack trace
|
||||||
|
Logger.log(Level.INFO, exception4, "exception when doing task"); //custom level logging with message
|
||||||
|
```
|
||||||
|
This will show the following :
|
||||||
|
```
|
||||||
|
[INFO][MyApp-CallingClass] my message
|
||||||
|
[INFO][MyApp-CallingClass] my message : 123
|
||||||
|
[WARNING][MyApp-CallingClass] my message
|
||||||
|
[SEVERE][MyApp-CallingClass] my message : 123-456
|
||||||
|
[SEVERE][MyApp-CallingClass] (exception1.toString)
|
||||||
|
[SEVERE][MyApp-CallingClass] (exception1.stackTrace)
|
||||||
|
[SEVERE][MyApp-CallingClass] (exception1.stackTrace)
|
||||||
|
[SEVERE][MyApp-CallingClass] ...
|
||||||
|
[SEVERE][MyApp-CallingClass] exception when doing task : (exception2.toString)
|
||||||
|
[SEVERE][MyApp-CallingClass] (exception2.stackTrace)
|
||||||
|
[SEVERE][MyApp-CallingClass] (exception2.stackTrace)
|
||||||
|
[SEVERE][MyApp-CallingClass] ...
|
||||||
|
[WARNING][MyApp-CallingClass] (exception3.toString)
|
||||||
|
[INFO][MyApp-CallingClass] exception when doing task : (exception4.toString)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Maven
|
||||||
|
|
||||||
|
You can use this project as a maven dependency with this :
|
||||||
|
```XML
|
||||||
|
<repositories>
|
||||||
|
...
|
||||||
|
<repository>
|
||||||
|
<id>fr.klemek</id>
|
||||||
|
<url>https://github.com/klemek/mvn-repo/raw/master</url>
|
||||||
|
</repository>
|
||||||
|
</repositories>
|
||||||
|
...
|
||||||
|
<dependencies>
|
||||||
|
...
|
||||||
|
<dependency>
|
||||||
|
<groupId>fr.klemek</groupId>
|
||||||
|
<artifactId>simple-logger</artifactId>
|
||||||
|
<version>1.0</version>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
```
|
||||||
Binary file not shown.
@@ -0,0 +1,73 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
<groupId>fr.klemek</groupId>
|
||||||
|
<artifactId>simple-logger</artifactId>
|
||||||
|
<version>1.0</version>
|
||||||
|
|
||||||
|
<name>SimpleLogger</name>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<outputDirectory>target/${project.artifactId}/WEB-INF/classes</outputDirectory>
|
||||||
|
<sourceDirectory>src/main/java</sourceDirectory>
|
||||||
|
<testSourceDirectory>src/test/java</testSourceDirectory>
|
||||||
|
<testResources>
|
||||||
|
<testResource>
|
||||||
|
<directory>src/test/resources</directory>
|
||||||
|
<excludes>
|
||||||
|
<exclude>**/*.java</exclude>
|
||||||
|
</excludes>
|
||||||
|
</testResource>
|
||||||
|
</testResources>
|
||||||
|
<plugins>
|
||||||
|
<!-- Notify plugin/dependecies updates -->
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.codehaus.mojo</groupId>
|
||||||
|
<artifactId>versions-maven-plugin</artifactId>
|
||||||
|
<version>2.5</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<phase>validate</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>display-dependency-updates</goal>
|
||||||
|
<goal>display-plugin-updates</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
<!-- Compilation -->
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<version>3.7.0</version>
|
||||||
|
<configuration>
|
||||||
|
<source>1.8</source>
|
||||||
|
<target>1.8</target>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
<!-- JAR -->
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-jar-plugin</artifactId>
|
||||||
|
<version>3.1.0</version>
|
||||||
|
<configuration>
|
||||||
|
<outputDirectory>download</outputDirectory>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
<!-- Unit tests -->
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-surefire-plugin</artifactId>
|
||||||
|
<version>2.22.0</version>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
|
||||||
|
</project>
|
||||||
@@ -0,0 +1,172 @@
|
|||||||
|
package fr.klemek.logger;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.util.Locale;
|
||||||
|
import java.util.logging.Level;
|
||||||
|
import java.util.logging.LogManager;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Simple logger for this application.
|
||||||
|
*
|
||||||
|
* @author Clement Gouin
|
||||||
|
*/
|
||||||
|
public final class Logger {
|
||||||
|
|
||||||
|
private static java.util.logging.Logger appLogger = java.util.logging.Logger.getLogger(Utils.getString("app_name","Unkown"));
|
||||||
|
private static final String APP_NAME = Utils.getString("app_name","Unkown");
|
||||||
|
private static final String BASE_PACKAGE = Utils.getString("default_package",null);
|
||||||
|
private static final int DEFAULT_DEPTH = 4;
|
||||||
|
|
||||||
|
private static boolean initialized = false;
|
||||||
|
|
||||||
|
private Logger() {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the current logger level;
|
||||||
|
*/
|
||||||
|
public static Level getLevel() {
|
||||||
|
return appLogger.getLevel();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Change the log level of this logger.
|
||||||
|
*
|
||||||
|
* @param newLevel the level of log to show
|
||||||
|
*/
|
||||||
|
public static void setLevel(Level newLevel) {
|
||||||
|
appLogger.setLevel(newLevel);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load a config file for the logger and set locale to english.
|
||||||
|
*
|
||||||
|
* @param relativePath the path in resources of the config file
|
||||||
|
*/
|
||||||
|
public static void init(String relativePath) {
|
||||||
|
init(relativePath, Level.INFO);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load a config file for the logger and set locale to english.
|
||||||
|
*
|
||||||
|
* @param relativePath the path in resources of the config file
|
||||||
|
* @param level the level to set the logger to
|
||||||
|
*/
|
||||||
|
public static void init(String relativePath, Level level) {
|
||||||
|
Locale.setDefault(Locale.ENGLISH);
|
||||||
|
loadConfigFromFile(relativePath);
|
||||||
|
Logger.setLevel(level);
|
||||||
|
Logger.initialized = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load a config file for the logger.
|
||||||
|
*
|
||||||
|
* @param relativePath the path in resources of the config file
|
||||||
|
*/
|
||||||
|
private static void loadConfigFromFile(String relativePath) {
|
||||||
|
try {
|
||||||
|
InputStream is = Logger.class.getClassLoader().getResourceAsStream(relativePath);
|
||||||
|
if (is == null) {
|
||||||
|
Logger.log(Level.SEVERE, "Logger config file not found at path {0}", relativePath);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
LogManager.getLogManager().readConfiguration(is);
|
||||||
|
appLogger = java.util.logging.Logger.getLogger(APP_NAME);
|
||||||
|
} catch (IOException e) {
|
||||||
|
Logger.log(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Log an exception.
|
||||||
|
*
|
||||||
|
* @param e the exception to log
|
||||||
|
*/
|
||||||
|
public static void log(Exception e) {
|
||||||
|
Logger.log(Logger.DEFAULT_DEPTH, Level.SEVERE, e.toString(), e);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Log an exception.
|
||||||
|
*
|
||||||
|
* @param lvl the level of logging
|
||||||
|
* @param e the exception to log
|
||||||
|
*/
|
||||||
|
public static void log(Level lvl, Exception e) {
|
||||||
|
Logger.log(Logger.DEFAULT_DEPTH, lvl, e.toString(), e);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Log an exception.
|
||||||
|
*
|
||||||
|
* @param e the exception to log
|
||||||
|
* @param msg the exception msg
|
||||||
|
*/
|
||||||
|
public static void log(Exception e, String msg) {
|
||||||
|
Logger.log(Logger.DEFAULT_DEPTH, Level.SEVERE, msg + " : {0}", e);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Log an exception.
|
||||||
|
*
|
||||||
|
* @param lvl the level of logging
|
||||||
|
* @param e the exception to log
|
||||||
|
* @param msg the exception msg
|
||||||
|
*/
|
||||||
|
public static void log(Level lvl, Exception e, String msg) {
|
||||||
|
Logger.log(Logger.DEFAULT_DEPTH, lvl, msg + " : {0}", e);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Log an INFO message.
|
||||||
|
*
|
||||||
|
* @param message the message
|
||||||
|
* @param objects the object for the message formatting
|
||||||
|
*/
|
||||||
|
public static void log(String message, Object... objects) {
|
||||||
|
Logger.log(Logger.DEFAULT_DEPTH, Level.INFO, message, objects);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Log a message.
|
||||||
|
*
|
||||||
|
* @param lvl the level of logging
|
||||||
|
* @param message the message
|
||||||
|
* @param objects the object for the message formatting
|
||||||
|
*/
|
||||||
|
public static void log(Level lvl, String message, Object... objects) {
|
||||||
|
Logger.log(Logger.DEFAULT_DEPTH, lvl, message, objects);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Log a message.
|
||||||
|
*
|
||||||
|
* @param depth the source depth in stack
|
||||||
|
* @param lvl the level of logging
|
||||||
|
* @param message the message
|
||||||
|
* @param objects the object for the message formatting
|
||||||
|
*/
|
||||||
|
private static void log(int depth, Level lvl, String message, Object... objects) {
|
||||||
|
if(!initialized) {
|
||||||
|
Logger.log(Level.WARNING, "Logger was not initialized please do so before using.");
|
||||||
|
initialized = true;
|
||||||
|
}
|
||||||
|
message = String.format("[%s-%s] %s", APP_NAME, Utils.getCallingClassName(depth), message);
|
||||||
|
appLogger.log(lvl, message, objects);
|
||||||
|
if (lvl == Level.SEVERE && objects.length > 0 && objects[0] instanceof Exception) {
|
||||||
|
boolean inPackage = false;
|
||||||
|
for (StackTraceElement ste : ((Exception) objects[0]).getStackTrace()) {
|
||||||
|
Logger.log(depth + 1, Level.SEVERE, "\t {0}", ste);
|
||||||
|
if(Logger.BASE_PACKAGE != null){
|
||||||
|
if (!inPackage && ste.getClassName().startsWith(Logger.BASE_PACKAGE))
|
||||||
|
inPackage = true;
|
||||||
|
else if (inPackage && !ste.getClassName().startsWith(Logger.BASE_PACKAGE))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
package fr.klemek.logger;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.MissingResourceException;
|
||||||
|
import java.util.ResourceBundle;
|
||||||
|
import java.util.logging.Level;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Utility class that store useful misc functions.
|
||||||
|
*
|
||||||
|
* @author Clement Gouin
|
||||||
|
*/
|
||||||
|
final class Utils {
|
||||||
|
|
||||||
|
private static final ResourceBundle CONFIGURATION_BUNDLE = ResourceBundle.getBundle("logging");
|
||||||
|
|
||||||
|
private Utils() {
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Configuration utils
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a configuration string by its key.
|
||||||
|
*
|
||||||
|
* @param key the key in the config file
|
||||||
|
* @param defaultValue the default value to use if not found
|
||||||
|
* @return the string or default value if not found
|
||||||
|
*/
|
||||||
|
static String getString(String key, String defaultValue) {
|
||||||
|
try {
|
||||||
|
return CONFIGURATION_BUNDLE.getString(key);
|
||||||
|
} catch (MissingResourceException e) {
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the class name from the calling class in th stack trace.
|
||||||
|
*
|
||||||
|
* @param stackLevel the level in the stack trace
|
||||||
|
* @return the classname of th calling class
|
||||||
|
*/
|
||||||
|
static String getCallingClassName(int stackLevel) {
|
||||||
|
StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
|
||||||
|
if (stackLevel >= stackTrace.length)
|
||||||
|
return null;
|
||||||
|
String[] source = stackTrace[stackLevel].getClassName().split("\\.");
|
||||||
|
return source[source.length - 1];
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
#Parameters for good behavior
|
||||||
|
handlers=java.util.logging.ConsoleHandler
|
||||||
|
.level=WARNING
|
||||||
|
java.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter
|
||||||
|
|
||||||
|
#Customize date/time shown with this line
|
||||||
|
java.util.logging.SimpleFormatter.format=[%1$tF %1$tT][%4$s]%5$s %n
|
||||||
|
|
||||||
|
#Specify your app name here
|
||||||
|
app_name=Test
|
||||||
|
#(Optional, specify your app package)
|
||||||
|
default_package=fr.klemek.logger
|
||||||
Reference in New Issue
Block a user