log4j2.xml文件详解及在日志中加入全局guid

目录
  • log4j2.xml文件及在日志中加入全局guid
    • 只有定义了这个,上面的才会真实有效
    • 想在日志中加入全局guid需要修改日志的格式
  • log4j2.x配置文件中各标签
    • 1、Logger 完成日志信息的处理
    • 2、Appender 设置在哪输出日志信息
    • 3、Layout 设置日志信息的输出格式
    • 4、Filters
    • 5、Status
    • 6、monitorInterval
    • 7、Policies 配置日志相关策略

log4j2.xml文件及在日志中加入全局guid

<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"/>

只有定义了这个,上面的才会真实有效

  • 日志信息输出到文件中,超过指定大小压缩存档
  • 日志信息输出到文件中,按照日期来压缩存档

想在日志中加入全局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用于查询日志处理问题了。

log4j2.x配置文件中各标签

log4j2.0以后我们通常在log4j2.xml中配置相关参数,在配置的时候我们需要理解这些参数的具体含义,下面列出了这些参数的解释。

1、Logger 完成日志信息的处理

<logger name="com.srd.ljzd" level="INFO" additivity="true">
    <appender-ref ref="INFO" />
    <appender-ref ref="WARN" />
    <appender-ref ref="ERROR" />
    <appender-ref ref="Mail" />
</logger>

logger中的name是指代码的包名或类名,路径要写全,可以配置不同包中的日志输出到不同的文件中。level是日志输出级别,定义输出的层次和决定信息是否输出,

DEBUG<INFO<WARN<ERROR

additivity设置事件是否在root logger输出,为了避免重复输出,可以在Logger 标签下设置additivity为”false”。

2、Appender 设置在哪输出日志信息

  • FileAppender:普通地输出到本地文件
  • FlumeAppender:将几个不同源的日志汇集、集中到一处。
  • JMSQueueAppender VS. JMSTopicAppender:与JMS相关的日志输出
  • RewriteAppender:对日志事件进行掩码或注入信息
  • RollingFileAppender:对日志文件进行封存(详细)
  • RoutingAppender:在输出地之间进行筛选路由
  • SMTPAppender:将LogEvent发送到指定邮件列表
  • SocketAppender:将LogEvent以普通格式发送到远程主机
  • SyslogAppender:将LogEvent以RFC 5424格式发送到远程主机
  • AsynchAppender:将一个LogEvent异步地写入多个不同输出地
  • ConsoleAppender:将LogEvent输出到命令行
  • FailoverAppender:维护一个队列,系统将尝试向队列中的Appender依次输出LogEvent,直到有一个成功为止

其中ConsoleAppender、RollingFileAppender和SMTPAppender较为常用。如果想详细了解,可以参考log4j的官方文档

  • ConsoleAppender将输出写到System.err或System.out。如果想将输出写到System.out,设置Console标签下的target为”SYSTEM_OUT”即可;如果想将输出写到System.err,设置Console标签下的target为”SYSTEM_ERR “即可。
  • RollingFileAppender跟FileAppender的基本用法一样。但RollingFileAppender可以设置log文件的size(单位:KB/MB/GB)上限、数量上限,当log文件超过设置的size上限,会自动被压缩。RollingFileAppender可以理解为滚动输出日志,如果log4j 2记录的日志达到上限,旧的日志将被删除,腾出的空间用于记录新的日志,DefaultRolloverStrategy 标签的max设置压缩文件的上限(默认值为7)。
  • SMTPAppender主要用来给指定的E-mail发送log event。
<SMTP name="Mail" subject="****SaaS系统正式版异常信息" to="yong.shi@lengjing.info" from="message@lengjing.info" smtpUsername="message@lengjing.info" smtpPassword="LENG****1234" smtpHost="mail.lengjing.info" smtpDebug="false" smtpPort="25" bufferSize="10">
    <PatternLayout pattern="[%-5p]:%d{YYYY-MM-dd HH:mm:ss} [%t] %c{1}:%L - %msg%n" />
        </SMTP>

SMTPAppender默认情况下只发送ERROR级别以上的日志,在测试的时候会发现低级别的日志是不会通过邮箱发送的。

3、Layout 设置日志信息的输出格式

layout有以下几种:

  • org.apache.log4j.HTMLLayout(以HTML表格形式布局)
  • org.apache.log4j.SimpleLayout(包含日志讯息的级别和讯息字符串)
  • org.apache.log4j.TTCCLayout(包含日志产生的时间、执行绪、类别等讯息)
  • org.apache.log4j.PatterLayout(可以灵活地指定布局格式)

详细配置可以参考官方文档

4、Filters

Filter可以过滤log事件,并控制log输出,详细配置可以参考官方文档

例如ThresholdFilter 可以实现单个log级别的过滤功能。

5、Status

<Configuration status="OFF" monitorInterval="30">

log4j 2定义的status级别有8个:ALL,TRACE, DEBUG, INFO, WARN, ERROR ,FATAL,OFF。其实status属性是帮助开发者找错用的,它可以检测log4j 2的配置文件是否有错,也可以检测到死循环的logger。

6、monitorInterval

<Configuration status="OFF" monitorInterval="30">

通过设置monitorInterval属性,即可设置log4j 2自动检测配置文件的时间间隔(单位:秒),最小间隔为5秒。log4j 2检测到配置文件有变化,会重新配置自己。

7、Policies 配置日志相关策略

  • SizeBasedTriggeringPolicy:设置日志大小达到一定大小后打包生成压缩文件。
  • TimeBasedTriggeringPolicy:基于时间的触发策略。该策略主要是完成周期性的log文件封存工作。有两个参数:
  • intervalinteger型,指定两次封存动作之间的时间间隔。单位:以日志的命名精度来确定单位,比如yyyy-MM-dd-HH 单位为小时,yyyy-MM-dd-HH-mm 单位为分钟。
  • modulateboolean型,说明是否对封存时间进行调制。若modulate=true,则封存时间将以0点为边界进行偏移计算。比如,modulate=true,interval=4hours,那么假设上次封存日志的时间为03:00,则下次封存日志的时间为04:00,之后的封存时间依次为08:00,12:00,16:00。

这里将我在项目中常用配置贡献给大家,可以满足大部分需求。

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="OFF" monitorInterval="30">
    <properties>
        <!--设置日志在硬盘上输出的目录-->
        <property name="logPath">D:/ljzx_log</property>
    </properties>
    <Appenders>
        <!--设置在控制台打印日志-->
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="[%-5p]:%d{YYYY-MM-dd HH:mm:ss} [%t] %c{1}:%L - %msg%n" />
        </Console>
        <!--设置级别为INFO日志输出到info.log中-->
        <RollingFile name="INFO" filename="${logPath}/info.log"
                     filepattern="${logPath}/%d{YYYYMMdd}-%i-info.log.zip">
            <Filters>
                <!--设置只输出级别为INFO的日志-->
                <ThresholdFilter level="INFO"/>
                <ThresholdFilter level="WARN" onMatch="DENY" onMismatch="NEUTRAL"/>
            </Filters>
            <PatternLayout pattern="[ %-5p]:%d{YYYY-MM-dd HH:mm:ss} [%t] %c{1}:%L - %msg%n" />
            <Policies>
                <!--设置每天打包日志一次-->
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                <!--设置日志文件满1MB后打包-->
                <SizeBasedTriggeringPolicy size="1 MB" />
            </Policies>
            <DefaultRolloverStrategy max="20" />
        </RollingFile>
        <!--设置级别为WARN日志输出到warn.log中-->
        <RollingFile name="WARN" filename="${logPath}/warn.log"
                     filepattern="${logPath}/%d{YYYYMMdd}-%i-warn.log.zip">
            <Filters>
                <!--设置只输出级别为WARN的日志-->
                <ThresholdFilter level="WARN"/>
                <ThresholdFilter level="ERROR" onMatch="DENY" onMismatch="NEUTRAL"/>
            </Filters>
            <PatternLayout pattern="[ %-5p]:%d{YYYY-MM-dd HH:mm:ss} [%t] %c{1}:%L - %msg%n" />
            <Policies>
                <!--设置每天打包日志一次-->
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                <!--设置日志文件满1MB后打包-->
                <SizeBasedTriggeringPolicy size="1 MB" />
            </Policies>
            <DefaultRolloverStrategy max="20" />
        </RollingFile>
        <!--设置级别为ERROR日志输出到error.log中-->
        <RollingFile name="ERROR" filename="${logPath}/error.log"
                     filepattern="${logPath}/%d{YYYYMMdd}-%i-error.log.zip">
            <!--设置只输出级别为ERROR的日志-->
            <ThresholdFilter level="ERROR"/>
            <PatternLayout pattern="[ %-5p]:%d{YYYY-MM-dd HH:mm:ss} [%t] %c{1}:%L - %msg%n" />
            <Policies>
                <!--设置每天打包日志一次-->
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                <!--设置日志文件满1MB后打包-->
                <SizeBasedTriggeringPolicy size="1 MB" />
            </Policies>
            <DefaultRolloverStrategy max="20" />
        </RollingFile>
        <!--设置通过邮件发送日志信息-->
        <SMTP name="Mail" subject="XXXXSaaS系统正式版异常信息" to="yong.shi@lengjing.info" from="message@lengjing.info"
              smtpUsername="message@lengjing.info" smtpPassword="LENG****1234" smtpHost="mail.lengjing.info" smtpDebug="false"
              smtpPort="25" bufferSize="10">
            <PatternLayout pattern="[%-5p]:%d{YYYY-MM-dd HH:mm:ss} [%t] %c{1}:%L - %msg%n" />
        </SMTP>
    </Appenders>
    <Loggers>
        <logger name="com.srd.ljzd" level="INFO" additivity="true">
            <appender-ref ref="INFO" />
            <appender-ref ref="WARN" />
            <appender-ref ref="ERROR" />
            <appender-ref ref="Mail" />
        </logger>
        <root level="DEBUG">
            <appender-ref ref="Console"/>
        </root>
    </Loggers>
</Configuration>

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • log4j2采用AsyncLogger出现的错误及解决方案

    目录 log4j2采用AsyncLogger的错误 配置文件,配置日志打印控制 解决方法 log4j的AsyncLogger的name属性 可以是包路径比如:org.apache 也可以是自定义名字比如:myLogger log4j2采用AsyncLogger的错误 配置文件,配置日志打印控制 Appender采用默认同的(不额外加异步控制的Async) Logger采用异步的AsyncLogger(root无所谓) 如果此时是这样配置的,也就是想要使用AsyncLogger + (sync)A

  • 处理Log4j2不能打印行号的问题(AsyncLogger)

    目录 Log4j2不能打印行号问题(AsyncLogger) 背景 解决方案 注意 附完整配置节点 Log4j2异步日志中打印方法名和行号信息 解决方案 pom配置 属性配置 Log4j2不能打印行号问题(AsyncLogger) 背景 %d{yyyy-MM-dd HH:mm:ss,SSS} %level [%t] %logger{36}(%F:%L) - %m%n 日志的输出格式已经指定了文件名.行号显示,可是打印出来却是空的,为什么?答案在这里: 解决方案 pom.xml <dependen

  • 详谈异步log4j2中的location信息打印问题

    目录 异步log4j2的location信息打印问题 说下解决 1.全异步 同步异步混合 log4j2支持异步打印提高打印输出速度 pom依赖添加 全局模式2两种 局部模式 AsyncLogger 异步log4j2的location信息打印问题 背景:项目改造过程中将log4j2改成异步,发现行号没有打印,于是扒了下官方文档,大概陈述下: 先说一下这个问题是怎么解决的,然后稍微扩展一下其他配置,有兴趣的可以往下看或者溜一遍官方文档 说下解决 在<AsyncLogger>标签中配置include

  • 使用Log4j2代码方式配置实现线程级动态控制

    目录 一 需求 二 对外暴露的接口 三 代码方式配置Log4j2日志对象 四 线程级日志对象的设计 五 标准日志头 六 异常日志的堆栈信息打印 七 测试 一 需求 最近平台进行升级,要求日志工具从Log4j升级到Log4j2,以求性能上的提升.之前我写过以代码方式的配置Log4j,来实现线程级日志对象的管理,今天把版本升级到Log4j2,依然采用原有思路来做,但是实现上有诸多区别,这是因为Log4j2的实现较老版本改动太多. 至于以配置文件方式配置的方法,我不做介绍,对于Log4j2的详细实现亦

  • log4j2的异步使用及添加自定义参数方式

    目录 log4j2异步使用及添加自定义参数 添加依赖(这里省略了版本号) 下面写一个生产可用的log4j2.xml的模板 补充知识 自定义日志格式 如何在日志中添加自己想传的参数? log4j 输入自定义参数 测试代码如下 log4j2异步使用及添加自定义参数 关于log4j2的性能和原理就不赘述了,这篇主要讲使用,配置文件解读,和添加自定义参数,偏应用的一篇文章. 相比与其他的日志系统,log4j2丢数据这种情况少:disruptor技术,在多线程环境下,性能高于logback等10倍以上:利

  • log4j2异步打印性能提升方式

    目录 log4j2异步打印性能提升 分析原因 解决方案 log4j2性能提升点 理解为以下三点 log4j2异步打印性能提升 压测结果发现,log4j升级成log4j2之后对系统性能影响并不大,更改打印日志方式(同步修改成异步打印) 压测结果发现TPS在开始阶段提升较快,当压力上来之后,TPS下降迅速,不如同步的数据(log4j2用的版本是2.3) 分析原因 获取压测是堆栈日志如下: 发现线程都在跑LockSupport.parkNanos也就是unsafe.park(false, 1);(pr

  • log4j2.xml文件详解及在日志中加入全局guid

    目录 log4j2.xml文件及在日志中加入全局guid 只有定义了这个,上面的才会真实有效 想在日志中加入全局guid需要修改日志的格式 log4j2.x配置文件中各标签 1.Logger 完成日志信息的处理 2.Appender 设置在哪输出日志信息 3.Layout 设置日志信息的输出格式 4.Filters 5.Status 6.monitorInterval 7.Policies 配置日志相关策略 log4j2.xml文件及在日志中加入全局guid <Configuration sta

  • Android 中Manifest.xml文件详解

    Android 中Manifest.xml文件详解 每一个Android项目都包含一个清单(Manifest)文件--AndroidManifest.xml,它存储在项目层次中的最底层.清单可以定义应用程序及其组件的结构和元数据. 它包含了组成应用程序的每一个组件(活动.服务.内容提供器和广播接收器)的节点,并使用Intent过滤器和权限来确定这些组件之间以及这些组件和其他应用程序是如何交互的. 它还提供了各种属性来详细地说明应用程序的元数据(如它的图标或者主题)以及额外的可用来进行安全设置和单

  • 基于Maven的pom.xml文件详解

    如下所示: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd "> <!-- 父项

  • mybatis映射XML文件详解及实例

    mybatis映射XML文件 一个简单的映射文件: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > <mapper namespace="c

  • dom4j读取XML文件详解

    dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的.dom4j是一个非常非常优秀的Java XML API,具有性能优异.功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件,现在越来越多的Java软件都在使用dom4j来读写XML,特别值得一提的是连Sun的JAXM也在用dom4j.这是必须使用的jar包. 上面说dom4j这么优秀,那么好用,那么从今天开始就跟大家一起分享dom4j的一些用法. dom4j的主要接口都在org.dom4j这个包里定义: 要想

  • MybatisPlus代码生成器含XML文件详解

    目录 MybatisPlus代码生成器含XML 所需依赖 代码如下 MybatisPlus代码生成器,自用版本不带xml MybatisPlus代码生成器含XML 所需依赖         <!--Mybatis-Plus-->         <dependency>             <groupId>com.baomidou</groupId>             <artifactId>mybatis-plus-boot-sta

  • log4j2异步Logger(详解)

    1 异步Logger的意义 之前的日志框架基本都实现了AsyncAppender,被证明对性能的提升作用非常明显. 在log4j2日志框架中,增加了对Logger的异步实现.那么这一步的解耦,意义何在呢? 如图,按我目前的理解:异步Logger是让业务逻辑把日志信息放入Disruptor队列后可以直接返回(无需等待"挂载的各个Appender"都取走数据) 优点:更高吞吐.调用log方法更低的延迟. 缺点:异常处理麻烦. 可变日志消息问题.更大的CPU开销.需要等待"最慢的A

  • SpringCloud项目的log4j2漏洞解决方案详解流程

    步骤如下: <properties> <log4j2.version>2.15.0</log4j2.version> </properties> 下面为上边对应版本号的具体依赖 <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.15.

  • Mybatis中 XML配置详解

    Mybatis常用带有禁用缓存的XML配置 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd" > <configuration> <

  • Python常用内置模块之xml模块(详解)

    xml即可扩展标记语言,它可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言.从结构上,很像HTML超文本标记语言.但他们被设计的目的是不同的,超文本标记语言被设计用来显示数据,其焦点是数据的外观.它被设计用来传输和存储数据,其焦点是数据的内容.那么Python是如何处理XML语言文件的呢?下面一起来看看Python常用内置模块之xml模块吧. 本文主要学习的ElementTree是python的XML处理模块,它提供了一个轻量级的对象模型.在使用ElementTre

随机推荐