All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.digitalid.utility.logging.logger.PrintStreamLogger Maven / Gradle / Ivy

The newest version!
package net.digitalid.utility.logging.logger;

import java.io.PrintStream;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.annotation.Nonnull;
import javax.annotation.Nullable;

import net.digitalid.utility.annotations.method.Impure;
import net.digitalid.utility.annotations.method.Pure;
import net.digitalid.utility.annotations.ownership.Capturable;
import net.digitalid.utility.annotations.ownership.Captured;
import net.digitalid.utility.contracts.Require;
import net.digitalid.utility.logging.Level;
import net.digitalid.utility.logging.Version;
import net.digitalid.utility.validation.annotations.type.Mutable;

/**
 * This class implements a logger that logs the messages to a print stream.
 * 
 * @see StandardOutputLogger
 * @see FileLogger
 */
@Mutable
public abstract class PrintStreamLogger extends Logger {
    
    /* -------------------------------------------------- Time Format -------------------------------------------------- */
    
    private static final @Nonnull ThreadLocal<@Nonnull DateFormat> timeFormat = new ThreadLocal() {
        @Pure @Override protected @Capturable @Nonnull DateFormat initialValue() {
            return new SimpleDateFormat("yyyy-MM-dd 'at' HH:mm:ss.SSS");
        }
    };
    
    /* -------------------------------------------------- Print Stream -------------------------------------------------- */
    
    private @Nonnull PrintStream printStream;
    
    /**
     * Sets the print stream to which the messages are printed.
     * This class uses the given print stream for synchronization.
     */
    @Impure
    @SuppressWarnings("SynchronizeOnNonFinalField")
    protected void setPrintStream(@Captured @Nonnull PrintStream printStream) {
        Require.that(printStream != null).orThrow("The print stream may not be null.");
        
        synchronized (this.printStream) {
            this.printStream.close();
            this.printStream = printStream;
        }
    }
    
    /* -------------------------------------------------- Constructors -------------------------------------------------- */
    
    /**
     * Creates a print stream logger that logs the messages to the given print stream.
     * This class uses the given print stream for synchronization.
     */
    protected PrintStreamLogger(@Captured @Nonnull PrintStream printStream) {
        Require.that(printStream != null).orThrow("The print stream may not be null.");
        
        this.printStream = printStream;
    }
    
    /* -------------------------------------------------- Logging -------------------------------------------------- */
    
    @Impure
    @Override
    @SuppressWarnings("SynchronizeOnNonFinalField")
    protected void log(@Nonnull Level level, @Nonnull String caller, @Nonnull String thread, @Nonnull String message, @Nullable Throwable throwable) {
        final @Nonnull String version = Version.string.get();
        synchronized (printStream) {
            printStream.println(timeFormat.get().format(new Date()) + (version.isEmpty() ? "" : " in " + version) + " [" + thread + "] (" + level + ") <" + caller + ">: " + message);
            if (throwable != null) {
                printStream.println();
                throwable.printStackTrace(printStream);
                printStream.println();
            }
            printStream.flush();
        }
    }
    
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy