Reputation: 170
i want to logappendar Programmatically , but this code is not correcty work
this is my configuration code...
public enum Logger {
INSTANCE;
Logger logger;
LoggerContext loggerContext;
public final String CONSOLE_APPENDER_NAME="CONSOLE_";
public final String FILE_APPENDER_NAME="FILE_";
public final String LOGGER_NAME="LOGGER";
public final String LOG_FILE_NAME="log.log";
Logger(){
loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
String patternRf = "%d{HH:mm:ss} %-5level [%thread] %logger{36} - %msg%n";
PatternLayoutEncoder encoder = new PatternLayoutEncoder();
encoder.setPattern(patternRf);
encoder.setContext(loggerContext);
encoder.start();
ConsoleAppender<ILoggingEvent> soutAppender = new ConsoleAppender<ILoggingEvent>();
soutAppender.setName(CONSOLE_APPENDER_NAME);
soutAppender.setEncoder(encoder);
loggerContext.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME).detachAndStopAllAppenders();
logger = loggerContext.getLogger(LOGGER_NAME);
logger.detachAndStopAllAppenders();
IPath logDirPath = new Path("/log");
File logDir = new File(logDirPath.toOSString());
if(!logDir.exists()){
logDir.mkdir();
}
RollingFileAppender<ILoggingEvent> rfAppender = rollingFileLog(logDirPath, loggerContext, encoder);
rfAppender.start();
soutAppender.start();
logger.addAppender(soutAppender);
logger.addAppender(rfAppender);
}
private RollingFileAppender<ILoggingEvent> rollingFileLog(IPath logDirPath, LoggerContext loggerContext, PatternLayoutEncoder encoder) {
RollingFileAppender<ILoggingEvent> logFileAppender = new RollingFileAppender<ILoggingEvent>();
logFileAppender.setContext(loggerContext);
logFileAppender.setName(FILE_APPENDER_NAME);
logFileAppender.setEncoder(encoder);
logFileAppender.setAppend(true);
logFileAppender.setFile(logDirPath.append(LOG_FILE_NAME).toOSString());
TimeBasedRollingPolicy<ILoggingEvent> logFilePolicy = new TimeBasedRollingPolicy<ILoggingEvent>();
logFilePolicy.setContext(loggerContext);
logFilePolicy.setParent(logFileAppender);
logFilePolicy.setFileNamePattern("./log/%d{yyyy,aux}/%d{MM,aux}/%d{dd,aux}/service_rolling.log.%d{yyyy-MM-dd_hhmmss}");
logFilePolicy.setMaxHistory(7);
logFilePolicy.start();
logFileAppender.setRollingPolicy(logFilePolicy);
return logFileAppender;
}
public void debug(String msg){
logger.debug(msg);
}
}
and this is my test code
public class test {
public static void main(String[] args) {
Logger.INSTANCE.debug("a");
Logger.INSTANCE.debug("b");
Logger.INSTANCE.debug("c");
Logger.INSTANCE.debug("d");
Logger.INSTANCE.debug("e");
Logger.INSTANCE.debug("f");
Logger.INSTANCE.debug("g");
Logger.INSTANCE.debug("h");
}
}
after test my console wrriten this message 11:14:53 DEBUG [Thread-1] LOGGER - a
and my log file wrriten this messages
11:14:53 DEBUG [Thread-1] LOGGER - a
11:14:53 DEBUG [Thread-1] LOGGER - b
11:14:53 DEBUG [Thread-1] LOGGER - b
11:14:53 DEBUG [Thread-1] LOGGER - c
11:14:53 DEBUG [Thread-1] LOGGER - c
11:14:53 DEBUG [Thread-1] LOGGER - d
11:14:53 DEBUG [Thread-1] LOGGER - d
11:14:53 DEBUG [Thread-1] LOGGER - e
11:14:53 DEBUG [Thread-1] LOGGER - e
11:14:53 DEBUG [Thread-1] LOGGER - f
.....
i think first log is writen to console
and others is writen to file
what's this program's problem..
thanks
Upvotes: 1
Views: 405
Reputation: 3541
I couldn't fully reproduce this behavior: Taking your code (and making it compile) either wrote everything (twice) to file, or everything (twice) to console, but not the first statement to console and all subsequent to file.
However, the problem with your code is that, apparently, you cannot share encoders. If you set the same encoder to the file appender and the console appender, everything gets written either to file, or to console. Try creating a second Encoder
instance (you can use the same configuration) for your file appender.
By the way: Instead of
loggerContext.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME).detachAndStopAllAppenders();
you could also use
loggerContext.reset();
which, I think, should have the same effect.
Upvotes: 1