Skip to content

Instantly share code, notes, and snippets.

@yangl
Last active January 3, 2018 06:20
Show Gist options
  • Select an option

  • Save yangl/59860b8690f537621e436ab0902bcdd2 to your computer and use it in GitHub Desktop.

Select an option

Save yangl/59860b8690f537621e436ab0902bcdd2 to your computer and use it in GitHub Desktop.
log4j2配置例子及使用编码方式增加配置(Log4j2.7+ 参数配置,避免外部项目再在配置文件中配置并防止他人修改)
<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>
<?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>
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);
}
}
<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