Creando logger logger programáticamente

Tengo un problema con respecto al proyecto de inicio de sesión. Mi requisito es que tengo que crear propiedades de registro dinámicamente. Déjame explicarte esto con un ejemplo.

Mi proyecto crea comunicación de socket con un sistema externo y puede tener múltiples sockets. Para cada socket, quiero tener diferentes archivos de registro que contendrán los mensajes que se leen y se envían. Para lograr esto, creo el registrador para sockets mediante programación. El problema es cuando quiero reconfigurar los registradores basados en logback.xml (agregando scan = "true" o reiniciando el logback), los registradores que creé se vuelven inutilizables. ¿Cómo puedo solucionarlo o puede aconsejarme otra solución?

Este es mi archivo de configuración (logback.xml)

<?xml version="1.0" ?>
<configuration>
    <property name="HOME_PATH" value="/data/logs/myapp/" scope="CONTEXT" />
    <property name="MYAPP_LOG_FILE" value="myapp.log" />
    <property name="MYAPP_ROLLING_TEMPLATE" value="%d{yy-MM-dd}" scope="CONTEXT" />
    <property name="MYAPP_OLD_LOG_FILE" value="${MYAPP_LOG_FILE}.%d{yy-MM-dd}" />
    <property name="DEFAULT_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%file:%line] [%level] %msg%n" scope="CONTEXT" />

    <appender name="myAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${HOME_PATH}${MYAPP_LOG_FILE}</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${HOME_PATH}${MYAPP_LOG_FILE}.${MYAPP_ROLLING_TEMPLATE}</fileNamePattern>
        </rollingPolicy>

        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${DEFAULT_PATTERN}</pattern>
        </encoder>
    </appender>

    <logger name="com.myapp" level="DEBUG" additivity="false">
        <appender-ref ref="myAppender" />
    </logger>

    <root level="OFF">
    </root>
</configuration>

y aquí puede ver cómo creo registradores mediante programación (de nuevo, hago esto solo para registros de socket).

public static Logger createLogger(String name) {
        ch.qos.logback.classic.Logger templateLogger = (ch.qos.logback.classic.Logger) LogUtil.getLogger("com.myapp");
        LoggerContext context = templateLogger.getLoggerContext();

        String logDir = context.getProperty("HOME_PATH");

        PatternLayoutEncoder encoder = new PatternLayoutEncoder();
        encoder.setPattern(context.getProperty("DEFAULT_PATTERN"));
        encoder.setContext(context);

        DefaultTimeBasedFileNamingAndTriggeringPolicy<ILoggingEvent> timeBasedTriggeringPolicy = new DefaultTimeBasedFileNamingAndTriggeringPolicy<ILoggingEvent>();
        timeBasedTriggeringPolicy.setContext(context);

        TimeBasedRollingPolicy<ILoggingEvent> timeBasedRollingPolicy = new TimeBasedRollingPolicy<ILoggingEvent>();
        timeBasedRollingPolicy.setContext(context);
        timeBasedRollingPolicy.setFileNamePattern(logDir + name + ".log." + context.getProperty("MYAPP_ROLLING_TEMPLATE"));
        timeBasedRollingPolicy.setTimeBasedFileNamingAndTriggeringPolicy(timeBasedTriggeringPolicy);
        timeBasedTriggeringPolicy.setTimeBasedRollingPolicy(timeBasedRollingPolicy);

        RollingFileAppender<ILoggingEvent> rollingFileAppender = new RollingFileAppender<ILoggingEvent>();
        rollingFileAppender.setAppend(true);
        rollingFileAppender.setContext(context);
        rollingFileAppender.setEncoder(encoder);
        rollingFileAppender.setFile(logDir + name + ".log");
        rollingFileAppender.setName(name + "Appender");
        rollingFileAppender.setPrudent(false);
        rollingFileAppender.setRollingPolicy(timeBasedRollingPolicy);
        rollingFileAppender.setTriggeringPolicy(timeBasedTriggeringPolicy);

        timeBasedRollingPolicy.setParent(rollingFileAppender);

        encoder.start();
        timeBasedRollingPolicy.start();

        rollingFileAppender.stop();
        rollingFileAppender.start();

        ch.qos.logback.classic.Logger logbackLogger = (ch.qos.logback.classic.Logger) LogUtil.getLogger(name);
        logbackLogger.setLevel(templateLogger.getLevel());
        logbackLogger.setAdditive(false);
        logbackLogger.addAppender(rollingFileAppender);

        return logbackLogger;
}

Y así es como reinicio el inicio de sesión

private static void initializeLogback() {
    File logbackFile = new File(logFilePath);
    System.setProperty("logback.configurationFile", logbackFile.getAbsolutePath());
    StaticLoggerBinder loggerBinder = StaticLoggerBinder.getSingleton();
    LoggerContext loggerContext = (LoggerContext) loggerBinder.getLoggerFactory();

    loggerContext.reset();
    JoranConfigurator configurator = new JoranConfigurator();
    configurator.setContext(loggerContext);
    try {
        configurator.doConfigure(logbackFile);
    } catch( JoranException e ) {
        throw new ColumbusRuntimeException(e.getMessage(), e);
    }
}

Respuestas a la pregunta(2)

Su respuesta a la pregunta