LoggerProvider.java
package eu.javaexperience.log;
import java.io.File;
import java.io.PrintWriter;
import java.util.Collection;
import java.util.concurrent.ConcurrentHashMap;
import eu.javaexperience.collection.map.ConcurrentMapTools;
import eu.javaexperience.interfaces.simple.getBy.GetBy1;
import eu.javaexperience.resource.ReferenceCounted;
import static eu.javaexperience.log.JavaExperienceLoggingFacility.LOG;
public class LoggerProvider implements LoggerFactory
{
public static LoggerProvider logIntoDirectory(File dir, String logfilePerfix)
{
return new LoggerProvider
(
new DayliLogrotaOutput(dir+"/"+logfilePerfix)
);
}
protected final LogOutput out;
public LoggerProvider(LogOutput lo)
{
this.out = lo;
}
protected final ConcurrentHashMap<LoggableUnitDescriptor, Logger> LFS =
new ConcurrentHashMap<>();
@Override
public Logger createLoggerFor(LoggableUnitDescriptor unit)
{
return ConcurrentMapTools.getOrCreate
(
LFS,
unit,
new GetBy1<Logger, LoggableUnitDescriptor>()
{
@Override
public Logger getBy(LoggableUnitDescriptor a)
{
return new AbstractLogger(a)
{
@Override
protected void doLog(String toLog)
{
try
{
try(ReferenceCounted<PrintWriter> rc_pw = out.getLogOutput())
{
rc_pw.getSubject().println(toLog);
}
}
catch(Exception e)
{
LoggingTools.tryLogSimple(LOG, LogLevel.WARNING, e);
}
}
};
}
}
);
}
@Override
public void fillActiveLoggers(Collection<Logger> facilities)
{
for(Logger lf:LFS.values())
{
facilities.add(lf);
}
}
}