30 Aralık 2019 Pazartesi

JUL Kullanımı

Giriş
JUL (java.util.logging) anlamına gelir. JUL kullanmak için özel bir şey yapmaya gerek yok, JVM ile geliyor.

JUL vs SLF4J
JUL pek kullanılmıyor. JUL loglarını SLF4J'e yönlendirmek için main.java dosyasının başına şu satırları ekleriz.
import java.util.logging.Logger;
import org.slf4j.bridge.SLF4JBridgeHandler;

SLF4JBridgeHandler.removeHandlersForRootLogger();
SLF4JBridgeHandler.install();
Logger.getLogger("").setLevel(Level.FINEST); // Root logger, for example.
JUL Konfigürasyon Dosyası
JUL Konfigürasyon Dosyası yazısına taşıdım

Unit Test
Örnek
Properties dosyasının yolunu değiştirmek için şöyle yaparız
@BeforeClass
public static void beforeClass() {
  System.setProperty("java.util.logging.config.file", 
    ClassLoader.getSystemResource("logging.properties").getPath());
}
src/test/resources/logging.properties altına şöyle yaparız
.level=FINEST
handlers=java.util.logging.ConsoleHandler
java.util.logging.ConsoleHandler.level=FINEST
Loglama Seviyesi
Şöyle
SEVERE (highest value)
WARNING
INFO
CONFIG
FINE
FINER
FINEST (lowest value)
Bunların dışında OFF ve ALL var. Açıklaması şöyle
In addition, there is a level OFF that can be used to turn off logging, and a level ALL that can be used to enable the logging of all messages.
LogManager Sınıfı
LogManager Sınıfı yazısına taşıdım.

Logger Sınıfı
Logger Sınıfı yazısına taşıdım.

ConsoleHandler 
ConsoleHandler yazısına taşıdım.

FileHandler Sınıfı
FileHandler Sınıfı yazısına taşıdım.

JUL Logger Sınıfı

Giriş
Şu satırı dahil ederiz.
import java.util.logging.Logger;
Gerekirse şu satırı dahil ederiz.
import java.util.logging.FileHandler;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.SimpleFormatter;
Root Logger
Root Logger ConsoleHandler aracılığıyla konsola loglar. Açıklaması şöyle.
0)Every logger whatever its name is has the root logger as parent.
1) the logger property useParentHandlers is true by default
2) the root logger has a ConsoleHandler by default

So. A new logger, by default sends its log records also to his parent(point 1) that is the root logger(point 0) which, by default, logs them to console(point 2).
String Birleştirme Yerine {} Parametresi
Örnek
Bu sınıfı kullanırken string birleştirmesinden ve hesaplama yapmaktan kaçınmak için şöyle yapmayız.
logger.debug("My text is" + x);
Şöyle yaparız.
String param1 = "1";
String param2 = "2";
LOGGER.log(Level.INFO,"Found : {0} {1} as params", new Object[]{param1, param2});
addHandler metodu

Örnek
Şöyle yaparız. FileHandler nesnesi eklenir
private final String filename = "Logs/LogFsForensics.log";
private final String loggerName = "FsLogger";

private final int limit = 1024*10000; //10 MB

private static Logger logger =  Logger.getLogger(loggerName);

try {
  FileHandler fileHandler = new FileHandler(filename, limit, 1, true);
SimpleFormatter simpleFormatter = new SimpleFormatter();
fileHandler.setFormatter(simpleFormatter);
logger.addHandler(fh); } catch (SecurityException | IOException e) { e.printStackTrace(); }
Örnek
Şöyle yaparız.
import java.util.logging.Logger;
import java.util.logging.FileHandler;
import java.util.logging.SimpleFormatter;

private static final int FILE_SIZE = 1024 * 1024 * 100; // 100 MB
private static final int FILE_COUNT = 15;
public static Logger logger = Logger.getLogger(Foo.class);

try {
  System.setProperty("java.util.logging.SimpleFormatter.format", 
    "[%1$tF %1$tT.%1$tL] [%4$-4s] %5$s %n");
  FileHandler handler = new FileHandler("my.log", FILE_SIZE, FILE_COUNT, true);
  handler.setFormatter(new SimpleFormatter());
  logger.addHandler(handler);
  logger.setUseParentHandlers(false);
} catch (IOException e) {
  logger.warning("Failed to initialize logger handler.");
}
getHandlers metodu
Örnek
Şöyle yaparız.
public static void setDebugLevel(Level newLvl) {
  Logger rootLogger = LogManager.getLogManager().getLogger("");
  Handler[] handlers = rootLogger.getHandlers();
  rootLogger.setLevel(newLvl);
  for (Handler h : handlers) {
    if(h instanceof FileHandler)
      h.setLevel(newLvl);
   }
}
info metodu
İmzası şöyle
public void info(String msg)
public void info(Supplier<String> msgSupplier)
log metodu
İmzası şöyle
public void log(Level level, String msg)
public void log(Level level, Supplier<String> msgSupplier)
public void log(Level level, String msg, Object param1)
public void log(Level level, String msg, Object params[])
public void log(Level level, String msg, Throwable thrown)
public void log(Level level, Throwable thrown, Supplier<String> msgSupplier)
public void log(LogRecord record)
log metodu - Level + String + Throwable
exception loglama için kullanılır. debug(),info(),warning() gibi metodlardan farklı olarak loglama seviyesi parametre olarak geçilebilir.

Örnek
Şöyle yaparız
try {
  ...something that can throw an ignorable exception
} catch( Exception ex ) {
    LOGGER.log(Level.SEVERE, ex.toString(), ex);
}
log metodu - LogRecord
Örnek
Şöyle yaparız
import java.util.logging.LogRecord;

Logger logger = Logger.getLogger("...");

public void log(Level level, String message, Throwable thrown) {
  LogRecord logRecord = new LogRecord(level, message);
  logRecord.setLoggerName(logger.getName());
  logRecord.setThrown(thrown);
  logRecord.setSourceClassName(logger.getName());
  logger.log(logRecord);
}
removeHandler metodu
Örnek
Şöyle yaparız
Logger rootLogger = Logger.getLogger("");
rootLogger.removeHandler(rootLogger.getHandlers()[0]);
Örnek
Şöyle yaparız
// Option 1: Remove the default ConsoleHandler :
Logger rootLogger = Logger.getLogger("");
Handler[] handlers = rootLogger.getHandlers();
for (Handler handler : handlers) {
  if (handler instanceof ConsoleHandler) {
    rootLogger.removeHandler(handler);
  }
}

// Option 2: call LOGGER.setUseParentHandlers(false);
LOGGER.setUseParentHandlers(false);
setLevel metodu

Örnek
Şöyle yaparız.
Logger.getLogger("").setLevel(Level.FINEST); // Root logger, for example.
Örnek
Şöyle yaparız
public class MyLogger {
  private static final Logger hazelCastLogger = Logger.getLogger("com.hazelcast");

  static {
    Level level = Level.WARNING;
    hazelCastLogger.setLevel(level);
  }
}
setUseParentHandlers metodu
Şöyle yaparız.
logger.setUseParentHandlers(false);