2012-01-30 13 views
6

Tengo un problema con respecto al proyecto de logback. Mi requisito es que tengo que crear propiedades de registro dinámicamente. Déjame explicar esto por un ejemplo.Creando logger logger programmatically

Mi proyecto crea una comunicación de socket con un sistema externo y puede tener varios sockets. Para cada socket, quiero tener diferentes archivos de registro que contendrán los mensajes que se leen y envían. Para lograr esto, creo el registrador para sockets programáticamente. 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 arreglar eso o me puede aconsejar 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í se puede ver cómo creo registradores de programación (de nuevo, hago esto sólo para los 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 me REINITIALIZE logback

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); 
    } 
} 

Respuesta

3

Parece que necesita el SiftingAppender donde su discriminador sería la Identificación del propio zócalo, o cualquier variación combinada. No sé qué problemas de enhebrado encontrará con esto (cuando se lea MDC, etc.), pero este debería ser un buen punto de partida y parece similar a su caso.

+0

En el manual de inicio de sesión http://logback.qos.ch/manual/mdc.html, está escrito que "logback-classic supone que los valores se colocan en el MDC con frecuencia moderada". ¿puede manejar 1000 solicitudes por segundo? ¿Cuál es el intervalo TPS cuando hablamos de "frecuencia moderada"? –

+0

No estoy seguro. Puede contactar al autor o publicar en la lista de correo. Recordaba haber leído sobre esto y pensé que era similar a tu problema. –

+1

Publiqué esta pregunta en la lista de correo y Ceki devolvió una respuesta. Aquí está: "Creo que las modificaciones de 1000 MDC deberían ser correctas. Mire LogbackMDCAdapter [1] para más detalles. Cheers, [1] [link] http://logback.qos.ch/xref/ch/qos /logback/classic/util/LogbackMDCAdapter.html " –

Cuestiones relacionadas