Last active
January 3, 2018 06:20
-
-
Save yangl/59860b8690f537621e436ab0902bcdd2 to your computer and use it in GitHub Desktop.
log4j2配置例子及使用编码方式增加配置(Log4j2.7+ 参数配置,避免外部项目再在配置文件中配置并防止他人修改)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <Filters> | |
| <!-- 只记录info和warn级别信息 --> | |
| <ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/> | |
| <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY" /> | |
| </Filters> | |
| <Filters> | |
| <!-- 只记录error级别信息 --> | |
| <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY" /> | |
| </Filters> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <?xml version="1.0" encoding="UTF-8"?> | |
| <configuration monitorInterval="60"> | |
| <properties> | |
| <property name="pattern">[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%p] [%t] [%c{1.}] [%L] %m%n</property> | |
| <property name="infologpath">./logs</property> | |
| <property name="errorlogpath">/data/errorlog</property> | |
| <property name="applogpath">/data/applog</property> | |
| <property name="appname">metrics-mq</property> | |
| </properties> | |
| <appenders> | |
| <!--####################################--> | |
| <!--# catalina输出(方便开发调试用)--> | |
| <!--####################################--> | |
| <Console name="stdout" target="SYSTEM_OUT"> | |
| <PatternLayout pattern="${pattern}"/> | |
| </Console> | |
| <!--####################################--> | |
| <!--# 系统运行INFO日志(按大小滚动)--> | |
| <!--####################################--> | |
| <!--<RollingRandomAccessFile name="infologFile" immediateFlush="false" bufferSize="10240" | |
| fileName="${infologpath}/${appname}-info.log" | |
| filePattern="${infologpath}/${appname}-info.log.%i.gz"> | |
| <PatternLayout> | |
| <pattern>${pattern}</pattern> | |
| </PatternLayout> | |
| <Policies> | |
| <SizeBasedTriggeringPolicy size="3 GB"/> | |
| </Policies> | |
| <DefaultRolloverStrategy max="9"/> | |
| </RollingRandomAccessFile>--> | |
| <!--####################################--> | |
| <!--# 系统运行INFO日志(按天保存,最多保留7天)--> | |
| <!--####################################--> | |
| <RollingRandomAccessFile name="infologFile" immediateFlush="false" bufferSize="10240" | |
| fileName="${infologpath}/${appname}-info.log" | |
| filePattern="${infologpath}/${appname}-info.log.%d{yyyy-MM-dd}.gz"> | |
| <PatternLayout> | |
| <pattern>${pattern}</pattern> | |
| </PatternLayout> | |
| <Policies> | |
| <!--<TimeBasedTriggeringPolicy interval="1" modulate="true"/>--> | |
| <CronTriggeringPolicy schedule="0 0 2 * * ?" evaluateOnStartup="false"/> | |
| </Policies> | |
| <DefaultRolloverStrategy> | |
| <Delete basePath="${infologpath}" maxDepth="2"> | |
| <IfFileName glob="${appname}-info.log.*.gz" /> | |
| <IfLastModified age="7d" /> | |
| </Delete> | |
| </DefaultRolloverStrategy> | |
| </RollingRandomAccessFile> | |
| <!--####################################--> | |
| <!--# 系统运行ERROR日志(永久保存)--> | |
| <!--####################################--> | |
| <RollingRandomAccessFile name="errorlogFile" immediateFlush="true" | |
| fileName="${errorlogpath}/${appname}/${appname}-error.log" | |
| filePattern="${errorlogpath}/${appname}/${appname}-error.log.%d{yyyy-MM-dd}.gz" | |
| ignoreExceptions="false"> | |
| <PatternLayout> | |
| <Pattern>${pattern}</Pattern> | |
| </PatternLayout> | |
| <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/> | |
| <TimeBasedTriggeringPolicy/> | |
| </RollingRandomAccessFile> | |
| <!--####################################--> | |
| <!--# 业务自定义日志(永久保存)--> | |
| <!--####################################--> | |
| <RollingRandomAccessFile name="applogFile" immediateFlush="true" | |
| fileName="${applogpath}/${appname}/${appname}-app.log" | |
| filePattern="${applogpath}/${appname}/${appname}-app.log.%d{yyyy-MM-dd}.gz" | |
| ignoreExceptions="false"> | |
| <PatternLayout> | |
| <Pattern>${pattern}</Pattern> | |
| </PatternLayout> | |
| <TimeBasedTriggeringPolicy/> | |
| </RollingRandomAccessFile> | |
| </appenders> | |
| <loggers> | |
| <!--第三方类库日志级别,根据自己项目需求修改--> | |
| <!--<Logger name="com.zaxxer.hikari" level="DEBUG"/>--> | |
| <Logger name="com.opensymphony" level="ERROR"/> | |
| <Logger name="org.apache" level="ERROR"/> | |
| <!--<Logger name="org.springframework" level="ERROR"/>--> | |
| <!--<Logger name="org.mybatis" level="ERROR"/>--> | |
| <!--<Logger name="org.quartz" level="ERROR"/>--> | |
| <root level="info"> | |
| <appender-ref ref="stdout"/> | |
| <appender-ref ref="infologFile"/> | |
| <appender-ref ref="errorlogFile"/> | |
| </root> | |
| <Logger name="applog" level="info" additivity="false"> | |
| <AppenderRef ref="applogFile"/> | |
| </Logger> | |
| </loggers> | |
| </configuration> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| package com.uxin.metrics.client; | |
| import org.apache.logging.log4j.Level; | |
| import org.apache.logging.log4j.LogManager; | |
| import org.apache.logging.log4j.core.Appender; | |
| import org.apache.logging.log4j.core.LoggerContext; | |
| import org.apache.logging.log4j.core.appender.RollingRandomAccessFileAppender; | |
| import org.apache.logging.log4j.core.appender.rolling.DefaultRolloverStrategy; | |
| import org.apache.logging.log4j.core.appender.rolling.RolloverStrategy; | |
| 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.*; | |
| import org.apache.logging.log4j.core.config.*; | |
| import org.apache.logging.log4j.core.config.plugins.Plugin; | |
| import org.apache.logging.log4j.core.config.xml.XmlConfiguration; | |
| import org.apache.logging.log4j.core.layout.PatternLayout; | |
| import java.nio.charset.Charset; | |
| /** | |
| * Log4j2.x参数配置,避免外部项目再在配置文件中配置改动 | |
| * <p> | |
| * 注:log4j2版本:2.7+ | |
| * | |
| * 详见:https://logging.apache.org/log4j/2.x/manual/customconfig.html | |
| * | |
| * @author YANGLiiN | |
| * @date 2016-06-04 22:40 | |
| */ | |
| @Order(10) | |
| @Plugin(name = "MetricsLog4j2ConfigurationFactory", | |
| category = "ConfigurationFactory") | |
| public class MetricsLog4j2ConfigurationFactory extends ConfigurationFactory { | |
| /** | |
| * Valid file extensions for XML files. | |
| */ | |
| public static final String[] SUFFIXES = new String[]{".xml", "*"}; | |
| /** | |
| * Returns the Configuration. | |
| * | |
| * @param loggerContext | |
| * The logger context. | |
| * @param source | |
| * The InputSource. | |
| * @return The Configuration. | |
| */ | |
| @Override | |
| public Configuration getConfiguration(final LoggerContext loggerContext, | |
| final ConfigurationSource source) { | |
| return new MetricsLog4j2Configuration(loggerContext, source); | |
| } | |
| /** | |
| * Returns the file suffixes for XML files. | |
| * | |
| * @return An array of File extensions. | |
| */ | |
| @Override | |
| public String[] getSupportedTypes() { | |
| return SUFFIXES; | |
| } | |
| } | |
| class MetricsLog4j2Configuration extends XmlConfiguration { | |
| private static final String LOG_BASE_PATH = "/data/metricslog/%s"; | |
| private static final String LOG_NAME_FORMAT = LOG_BASE_PATH + "/%s.log"; | |
| public MetricsLog4j2Configuration(final LoggerContext loggerContext, | |
| final ConfigurationSource configSource) { | |
| super(loggerContext, configSource); | |
| } | |
| @Override | |
| protected void doConfigure() { | |
| super.doConfigure(); | |
| this.addConfigure(MetricsEnum.ALIVE); | |
| this.addConfigure(MetricsEnum.BUSINESS); | |
| this.addConfigure(MetricsEnum.TP); | |
| } | |
| private void addConfigure(MetricsEnum me) { | |
| String metricsName = me.getLowerName(); | |
| String appenderName = metricsName + "logFile"; | |
| String loggerName = metricsName; | |
| final LoggerContext ctx = (LoggerContext) LogManager.getContext(false); | |
| final Configuration config = ctx.getConfiguration(); | |
| // final PatternLayout layout2 = PatternLayout.createLayout("%m%n", | |
| // null, | |
| // config, | |
| // null, | |
| // null, | |
| // true, | |
| // false, | |
| // null, | |
| // null); | |
| final PatternLayout layout = PatternLayout.newBuilder() | |
| .withPattern("%m%n") | |
| .withConfiguration(config) | |
| .withCharset(Charset.forName("UTF-8")) | |
| .withAlwaysWriteExceptions(true) | |
| .withNoConsoleNoAnsi(false) | |
| .build(); | |
| Long now = System.currentTimeMillis(); | |
| String fileName = String.format(LOG_NAME_FORMAT, metricsName, now); | |
| // 删除两天的日志文件 | |
| PathCondition lm = IfLastModified.createAgeCondition(Duration.parse("P2D"), | |
| null); | |
| PathCondition fn = IfFileName.createNameCondition("*.log*", null, null); | |
| PathCondition[] pcs = new PathCondition[]{lm, fn}; | |
| String bp = String.format(LOG_BASE_PATH, metricsName); | |
| Action da = DeleteAction.createDeleteAction(bp, | |
| false, | |
| 2, | |
| false, | |
| null, | |
| pcs, | |
| null, | |
| config); | |
| Action[] actions = new Action[]{da}; | |
| RolloverStrategy strategy = DefaultRolloverStrategy.createStrategy(null, | |
| null, | |
| null, | |
| null, | |
| actions, | |
| true, | |
| config); | |
| // 每天一个文件 | |
| TriggeringPolicy policy = TimeBasedTriggeringPolicy.createPolicy(null, | |
| null); | |
| // final Appender appender = | |
| // RollingRandomAccessFileAppender.createAppender(fileName, | |
| // fileName | |
| // + ".%d{yyyy-MM-dd}", | |
| // "true", | |
| // appenderName, | |
| // "true", | |
| // "10240", | |
| // policy, | |
| // strategy, | |
| // layout, | |
| // null, | |
| // "false", | |
| // "false", | |
| // null, | |
| // config); | |
| final Appender appender = RollingRandomAccessFileAppender.newBuilder() | |
| .withFileName(fileName) | |
| .withFilePattern(fileName | |
| + ".%d{yyyy-MM-dd}") | |
| .withAppend(true) | |
| .withName(appenderName) | |
| .withImmediateFlush(true) | |
| .withBufferSize(10240) | |
| .withPolicy(policy) | |
| .withStrategy(strategy) | |
| .withLayout(layout) | |
| .withFilter(null) | |
| .withIgnoreExceptions(false) | |
| .withAdvertise(false) | |
| .withAdvertiseURI(null) | |
| .setConfiguration(config) | |
| .build(); | |
| appender.start(); | |
| addAppender(appender); | |
| final AppenderRef ref = AppenderRef.createAppenderRef(appenderName, | |
| null, | |
| null); | |
| final AppenderRef[] refs = new AppenderRef[]{ref}; | |
| LoggerConfig loggerConfig = LoggerConfig.createLogger(false, | |
| Level.DEBUG, | |
| loggerName, | |
| "true", | |
| refs, | |
| null, | |
| config, | |
| null); | |
| loggerConfig.addAppender(appender, null, null); | |
| addLogger(loggerName, loggerConfig); | |
| } | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <dependency> | |
| <groupId>org.apache.logging.log4j</groupId> | |
| <artifactId>log4j-api</artifactId> | |
| <version>${log4j2.version}</version> | |
| </dependency> | |
| <dependency> | |
| <groupId>org.apache.logging.log4j</groupId> | |
| <artifactId>log4j-core</artifactId> | |
| <version>${log4j2.version}</version> | |
| </dependency> | |
| <dependency> | |
| <groupId>org.apache.logging.log4j</groupId> | |
| <artifactId>log4j-slf4j-impl</artifactId> | |
| <version>${log4j2.version}</version> | |
| </dependency> | |
| <dependency> | |
| <groupId>org.slf4j</groupId> | |
| <artifactId>slf4j-api</artifactId> | |
| <version>${slf4j.version}</version> | |
| </dependency> | |
| <dependency> | |
| <groupId>org.slf4j</groupId> | |
| <artifactId>jcl-over-slf4j</artifactId> | |
| <version>${slf4j.version}</version> | |
| </dependency> | |
| <dependency> | |
| <groupId>org.slf4j</groupId> | |
| <artifactId>jul-to-slf4j</artifactId> | |
| <version>${slf4j.version}</version> | |
| </dependency> | |
| <dependency> | |
| <groupId>org.slf4j</groupId> | |
| <artifactId>log4j-over-slf4j</artifactId> | |
| <version>${slf4j.version}</version> | |
| </dependency> | |
| <dependency> | |
| <groupId>commons-logging</groupId> | |
| <artifactId>commons-logging</artifactId> | |
| <version>1.2</version> | |
| <scope>provided</scope> | |
| </dependency> | |
| <dependency> | |
| <groupId>log4j</groupId> | |
| <artifactId>log4j</artifactId> | |
| <version>1.2.17</version> | |
| <!--<scope>runtime</scope>--> | |
| <scope>provided</scope> | |
| </dependency> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment