프로젝트를 로그백하는 것과 관련하여 문제가 있습니다. 내 요구 사항은 동적으로 로그 속성을 만들어야한다는 것입니다. 예를 들어 설명해 드리겠습니다.프로그래밍 방식으로 로그백 로거 만들기
내 프로젝트는 외부 시스템과 소켓 통신을 생성하며 소켓이 여러 개있을 수 있습니다. 각 소켓에 대해, 나는 읽혀지고 보내지는 메시지를 담고있는 다른 로그 파일을 갖고 싶다. 이것을 달성하기 위해서, 소켓 용의 로거를 프로그램에 의해 작성합니다. Logback.xml을 기반으로 로거를 재구성하려는 경우 (즉, scan = "true"를 추가하거나 로그백을 다시 초기화하여) 내가 만든 로거는 사용할 수 없게됩니다. 어떻게 해결할 수 있습니까? 아니면 다른 해결책을 알려 줄 수 있습니까?
이 내 구성 파일 (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>
이며, 여기에 내가 프로그래밍 로거를 만드는 방법을 볼 수 있습니다 (다시, 나는 소켓 로그 만이 작업을 수행).
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;
}
는 그리고 이것은 내가 당신의 판별이 소켓 ID 자체, 또는 결합 변화 될 것이다 어디가 SiftingAppender이 필요한 것처럼
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);
}
}
로그백 설명서 http://logback.qos.ch/manual/mdc.html에서 "logback-classic은 값이 적당한 빈도로 MDC에 저장된다고 가정합니다"라고 기록되어 있습니다. 초당 1000 건의 요청을 처리 할 수 있습니까? "중간 주파수"에 관해 이야기 할 때 TPS 간격이란 무엇입니까? –
확실하지 않습니다. 작성자에게 연락하거나 메일 링리스트에 게시 할 수 있습니다. 나는 이것에 관해 독서를 기억하고 당신의 문제와 유사하다고 생각했습니다. –
나는이 질문을 메일 링리스트에 올리고 Ceki는 응답을 보냈다. 여기에 그것은 : "나는 1000 MDC 수정이 잘되어야한다고 생각한다. 자세한 내용은 LogbackMDCAdapter [1]을 참고하십시오. /logback/classic/util/LogbackMDCAdapter.html " –