<Configuration status="WARN" monitorInterval="30">
<Appenders>
<!-- 输出到控制台 -->
<Console name="STDOUT" target="SYSTEM_OUT">
<!--
%d 日期
%p 日志级别
%c 输出所属的类目,通常就是所在类的全名
[%t] 线程
- %m 输出代码中指定的消息
%n 换行
%L : 日志输出所在行数
%M : 日志输出所在方法名
-->
<PatternLayout pattern="%d %p %c [%t] - %m%n"/>
</Console>
<!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份-日建立的文件夹下面并进行压缩,作为存档 -->
<RollingFile name="RollingFileInfo" fileName="${sys:user.home}/logs/info.log"
filePattern="${sys:user.home}/logs/provider/${date:yyyy-MM-dd}/info-%d{yyyy-MM-dd}-%i.log.gz">
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY" />
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n" />
<Policies>
<SizeBasedTriggeringPolicy size="100 MB" />
<!-- 切割文件的话最多切割多少个 -->
<DefaultRolloverStrategy max="20"/>
</Policies>
</RollingFile>
<!-- 按照天来存储,过了这天的东西会被保存为压缩包,并且配置了大小分割 -->
<RollingFile name="InfoFileAppender" fileName="${sys:user.home}/logs/info.log"
filePattern="${sys:user.home}/logs/provider/${date:yyyy-MM-dd}/info-%d{yyyy-MM-dd}-%i.log.gz">
<PatternLayout pattern="%d %-5p %c:%L [%t] - %m%n"/>
<Policies>
<!-- 时间滚动策略,默认1小时 -->
<TimeBasedTriggeringPolicy modulate="true" interval="24"/>
</Policies>
</RollingFile>
</Appenders>
<!--然后定义logger,只有定义了logger并引入的appender,appender才会生效-->
<Loggers>
<Logger name="com.opensymphony.xwork2.ognl.OgnlValueStack" level="ERROR"/>
<logger name="org.springframework" level="INFO"></logger>
<logger name="org.mybatis" level="INFO"></logger>
<Logger name="net.sf.ehcache" level="INFO"/>
<Logger name="com.alisoft.xplatform.asf" level="WARN"/>
<Logger name="com.mbi" level="ERROR"/>
<Logger name="net.mlw" level="INFO"/>
<Logger name="java.sql" level="INFO"/>
<Logger name="org.hibernate.type" level="ERROR"/>
<Logger name="com.opensymphony.webwork" level="ERROR"/>
<Logger name="org.apache" level="INFO"/>
<Logger name="org.jgroups" level="WARN"/>
<Logger name="org.jboss.axis" level="INFO"/>
<Logger name="org.jboss.management" level="INFO"/>
<Logger name="org.apache.commons.httpclient" level="ERROR"/>
<Logger name="org.springframework" level="INFO"/>
<Logger name="org.springboot" level="INFO" />
<!-- 缺省日志级别,如果package有定制级别,则按package的定制级别走,即使package级别更低 -->
<Root level="INFO">
<AppenderRef ref="STDOUT"/>
<AppenderRef ref="RollingFileInfo"/>
<!-- <AppenderRef ref="InfoFileAppender"/> -->
</Root>
</Loggers>
</Configuration><AppenderRef ref="STDOUT"/>只有定义了这个,上面的才会真实有效,
日志信息输出到文件中,超过指定大小压缩存档
日志信息输出到文件中,按照日期来压缩存档
2.想在日志中加入全局guid需要修改日志的格式,加入自定义参数H
<PatternLayout pattern="%d %-5p %c:%L [%t] -%H %n"/>/**
* 有时候需要在日志中实现类似aop的效果,统一加进去某些参数。对于这种需要,log4j2则可以使用插件机制
* Plugin 表示的是这是一个插件,name是名称,category为PatternConverter.CATEGORY(目前插件只有这个选择)
ConverterKeys表示的就是自定义的参数,可以多个
* @author yp-tc-m-7129
*
*/
@Plugin(name = "LogPatternConverter", category = PatternConverter.CATEGORY)
@ConverterKeys({ "H" })
public class LogPatternConverter extends LogEventPatternConverter {
/**
* 检查全局guid是否正确 - GUID[45a696c385f341efbebf05fd0b3b1344] - TYPE[MANUAL]
* @param args
*/
/*public static void main(String[] args) {
System.out.println(getPayplusLogUUID());
}*/
private static final LogPatternConverter INSTANCE = new LogPatternConverter();
public static LogPatternConverter newInstance(final String[] options) {
return INSTANCE;
}
private LogPatternConverter(){
super("LogId", "logId");
}
/**
* 另外的格式化日志,在日志中加入一个全局guid
* 这里有两个参数,LogEvent是系统已经存在的一些可选数据,StringBuilder 表示的是最终的输出字符流。一般都是将自定义的append进去
*/
@Override
public void format(LogEvent event, StringBuilder builder) {
final Message msg = event.getMessage();
if (msg != null) {
String result = msg.getFormattedMessage();
result = getPayplusLogUUID() + result;
builder.append(result);
}
}
/**
* 业务日志全局UUID
*
* @return
*/
protected String getPayplusLogUUID() {
StringBuilder builder = new StringBuilder();
if (!ThreadContextUtils.contextInitialized()) {
ThreadContextUtils.initContext("applicationName", null, ThreadContextType.MANUAL);
}
builder.append("- GUID[");
builder.append(ThreadContextUtils.getContext().getThreadUID());
builder.append("] - TYPE[");
builder.append(ThreadContextUtils.getContext().getType());
builder.append("] ");
return builder.toString();
}
}这样就在日志中加入了全局guid用于查询日志处理问题了。简单配置 Appenders:记录方式(Console/ RollingFile / RollingRandomAccessFile) Console :将日志在控制台输出 RollingFile:将日志输出到文件中 PatternLayout:日志输出的格式 Loggers:日志定义 logger :起过滤作用,用name指定包名,level指定级别,日志级别之下不输出 root :level属...
...
点击查看log4j2.xml官方文档 标准log4j2.xml...
log4j2.xml配置...
PatternLayout自定义日志布局: ...
...
捐助开发者 在兴趣的驱动下,写一个免费的东西,有欣喜,也还有汗水,希望你喜欢我的作品,同时也能支持一下。 当然,有钱捧个钱场(右上角的爱心标志,支持支付宝和Pay...
log4j2是log4j的升级版,略有差异,使用方式不变,引入依赖和配置有所区别 配置文件名称改为log4j2.xml,也放在resources目录下,默认读取 配置 依赖(也只需要引入这一个依赖桥接包即可)...
日志级别 trace:追踪,就是程序推进一下,可以写个trace输出 debug:调试,一般作为最低级别,trace基本不用。 info:输出重要的信息,使用较多 warn:警告,有些信息不是错误信息,但也要给程序员一些提示。 error:错误信息。用的也很多。 fatal:致命错误。级别较高,这种级别不用调试了,重写吧…… 机制:如果一条日志信息的级别大于等于配置文件...
for_each,允许对区间内的元素进行修改,当然transform也可以实现相同的操作,只是transform效率较低,因为transform是通过拷贝函数返回值实现。当然C++11之后for_each变得不再重要,因为range-based for更加直观简单。 接下来我们看一下for_each的实现: 通过源码可以清晰的看出for_each有三个参数,前两个参数用来确定一个区间,...