log4j2 動態生成logger,每個logger一個輸出檔案
阿新 • • 發佈:2019-01-03
maven依賴
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.7</version>
</dependency>
java實現
package log4j2; import java.io.File; import java.io.IOException; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.core.Layout; import org.apache.logging.log4j.core.LoggerContext; import org.apache.logging.log4j.core.appender.RollingFileAppender; import org.apache.logging.log4j.core.appender.rolling.CompositeTriggeringPolicy; import org.apache.logging.log4j.core.appender.rolling.DefaultRolloverStrategy; import org.apache.logging.log4j.core.appender.rolling.SizeBasedTriggeringPolicy; import org.apache.logging.log4j.core.appender.rolling.TimeBasedTriggeringPolicy; import org.apache.logging.log4j.core.appender.rolling.TriggeringPolicy; import org.apache.logging.log4j.core.appender.rolling.action.Action; import org.apache.logging.log4j.core.appender.rolling.action.DeleteAction; import org.apache.logging.log4j.core.appender.rolling.action.Duration; import org.apache.logging.log4j.core.appender.rolling.action.IfFileName; import org.apache.logging.log4j.core.appender.rolling.action.IfLastModified; import org.apache.logging.log4j.core.appender.rolling.action.PathCondition; import org.apache.logging.log4j.core.config.AppenderRef; import org.apache.logging.log4j.core.config.Configuration; import org.apache.logging.log4j.core.config.LoggerConfig; import org.apache.logging.log4j.core.layout.PatternLayout; /** * 動態建立日誌 * @author:塗有 * @date 2017年4月19日 下午6:03:41 */ public class LogUtil { /**日誌列印的目錄*/ private static final String datalogDir = "log"; private static final LoggerContext ctx = (LoggerContext) LogManager.getContext(false); private static final Configuration config = ctx.getConfiguration(); private LogUtil(){} /**啟動一個動態的logger*/ @SuppressWarnings({ "rawtypes", "unchecked" }) private static void start(String loggerName) { //建立一個展示的樣式:PatternLayout, 還有其他的日誌列印樣式。 Layout layout = PatternLayout.newBuilder() .withConfiguration(config).withPattern("%msg%n").build(); //單個日誌檔案大小 TimeBasedTriggeringPolicy tbtp = TimeBasedTriggeringPolicy.createPolicy(null, null); TriggeringPolicy tp = SizeBasedTriggeringPolicy.createPolicy("10M"); CompositeTriggeringPolicy policyComposite = CompositeTriggeringPolicy.createPolicy(tbtp, tp); String loggerDir = datalogDir + File.separator + loggerName; //刪除日誌的條件 IfFileName ifFileName = IfFileName.createNameCondition(null, loggerName + "\\.\\d{4}-\\d{2}-\\d{2}.*"); IfLastModified ifLastModified = IfLastModified.createAgeCondition(Duration.parse("1d")); DeleteAction deleteAction = DeleteAction.createDeleteAction( loggerDir, false, 1, false, null, new PathCondition[]{ifLastModified,ifFileName}, null, config); Action[] actions = new Action[]{deleteAction}; DefaultRolloverStrategy strategy = DefaultRolloverStrategy.createStrategy( "7", "1", null, null, actions, false, config); String loggerPathPrefix = loggerDir + File.separator + loggerName; RollingFileAppender appender = RollingFileAppender.newBuilder() .withFileName(loggerPathPrefix + ".log") .withFilePattern(loggerPathPrefix + ".%d{yyyy-MM-dd}.%i.log") .withAppend(true) .withStrategy(strategy) .withName(loggerName) .withPolicy(policyComposite) .withLayout(layout) .withConfiguration(config) .build(); appender.start(); config.addAppender(appender); AppenderRef ref = AppenderRef.createAppenderRef(loggerName, null, null); AppenderRef[] refs = new AppenderRef[]{ref}; LoggerConfig loggerConfig = LoggerConfig.createLogger(false, Level.ALL, loggerName, "true", refs, null, config, null); loggerConfig.addAppender(appender, null, null); config.addLogger(loggerName, loggerConfig); ctx.updateLoggers(); } /**使用完之後記得呼叫此方法關閉動態建立的logger,避免記憶體不夠用或者檔案開啟太多*/ public static void stop(String loggerName) { synchronized (config){ config.getAppender(loggerName).stop(); config.getLoggerConfig(loggerName).removeAppender(loggerName); config.removeLogger(loggerName); ctx.updateLoggers(); } } /**獲取Logger*/ public static Logger getLogger(String loggerName) { synchronized (config) { if (!config.getLoggers().containsKey(loggerName)) { start(loggerName); } } return LogManager.getLogger(loggerName); } public static void main(String[] args) throws IOException, InterruptedException { for(int i = 0; i < 10000; i++){ String name = "s" + String.valueOf(i); Logger logger = getLogger(name); logger.info("asdfasdf"); stop(name); } } }
聽說,打賞我的人最後都找到了真愛。