1. 程式人生 > >log4j2 動態生成logger,每個logger一個輸出檔案

log4j2 動態生成logger,每個logger一個輸出檔案

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

聽說,打賞我的人最後都找到了真愛。
在這裡插入圖片描述