log4j2获取JVM启动参数

没有检索到摘要

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在log4j1.x版本如果想获取如下的JVM启动参数

Dlog.path.prefix=/export/home/tomcat/logs/apps/myApp -Ddeploy.project.id=2856 -Ddeploy.app.id=370 -Ddeploy.app.name=myApp


其中log.path.prefix是需要配置在log4j日志路径中的,在1.x版本可以使用${log.path.prefix}来获取如下:

log4j.appender.file.File=${log.path.prefix}/my_log.log


但是在log4j2.x版本中这样是获取不到路径的,正确的方法是:

 <property name="LOG_HOME">${sys:log.path.prefix}</property>


完整的线上的log4j2.xml配置如下,可参考:

<?xml version="1.0" encoding="UTF-8"?>
<configuration status="WARN">
       <properties>
              <!-- 日志路径 -->
              <property name="LOG_HOME">${sys:log.path.prefix}</property>
              <!-- INFO级别日志名称 -->
              <property name="LOG_INFO_NAME">/app_log.log</property>
              <!-- INFO级别备份日志名称 -->
              <property name="BACKUP_INFO_NAME">app-%d{MM-dd-yyyy}-%i.log</property></span>
              <!-- ERROR级别日志名称 -->
              <property name="LOG_ERROR_NAME">/err.log</property>
		      <!-- ERROR级别备份日志名称-->
              <property name="BACKUP_ERROR_NAME">app-err-%d{MM-dd-yyyy}-%i.log</property>
       </properties>
       <appenders>
              <Console name="Console" target="SYSTEM_OUT">
                     <PatternLayout pattern="[%p][%date{yyyy-MM-dd HH:mm:ss.SSS}]%msg[%thread]([%c:%line])%n"/>
              </Console>
              <RollingFile name="AllLog" fileName="${LOG_HOME}/${LOG_INFO_NAME}"
                           filePattern="${LOG_HOME}/${BACKUP_INFO_NAME}">
                     <PatternLayout pattern="[%p][%date{yyyy-MM-dd HH:mm:ss.SSS}]%msg[%thread]([%c:%line])%n"/>
                     <SizeBasedTriggeringPolicy size="50MB"/>
              </RollingFile>
              <RollingFile name="ErrLog" fileName="${LOG_HOME}/${LOG_ERROR_NAME}"
                           filePattern="${LOG_HOME}/${BACKUP_ERROR_NAME}">
		   		     <Filters>
                       <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
                     </Filters>
                     <PatternLayout pattern="[%p][%date{yyyy-MM-dd HH:mm:ss.SSS}]%msg[%thread]([%c:%line])%n"/>
                     <SizeBasedTriggeringPolicy size="50MB"/>
              </RollingFile>
       </appenders>
       <Loggers>
              <logger name="java.sql" level="ERROR" additivity="false"/>
              <logger name="java.sql.ResultSet" level="ERROR" additivity="false"/>
              <logger name="com.ibatis" level="ERROR" additivity="false"/>
              <logger name="org.apache" level="ERROR" additivity="false"/>
              <logger name="org.apache.ibatis" level="ERROR" additivity="false"/>
              <logger name="org.springframework" level="ERROR" additivity="false"/>
              <logger name="com.mchange" level="ERROR" additivity="false"/>
              <logger name="org.apache.commons" level="ERROR" additivity="false"/>	

              <root level="info">
                    <appenderRef ref="AllLog"/>
	            <appenderRef ref="ErrLog"/>
              </root>
       </Loggers>
</configuration>


关于各种路径的获取方式,详情参考官方文档:

http://logging.apache.org/log4j/2.x/manual/lookups.html

<think>我们正在配置log4j2以实现异步日志打印。根据引用,有几种方式可以实现异步日志:1.全局异步:所有日志都异步输出。这可以通过设置系统属性`Log4jContextSelector`为`org.apache.logging.log4j.core.async.AsyncLoggerContextSelector`来实现。2.混合异步:部分Logger使用异步,部分使用同步。根据引用[1]和引用[4],我们可以通过以下两种方式之一实现全局异步:-方式一:在类路径下添加一个`log4j2.component.properties`文件,并设置:```propertiesLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector``` -方式二:在启动JVM时设置系统属性:```-Dlog4j2.contextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector```另外,根据引用[2]和引用[3],我们还需要添加disruptor依赖,因为异步日志需要这个库。 现在,我们来看log4j2.xml的配置。根据引用[4],我们可以配置一个异步的Appender,但注意,全局异步设置(通过ContextSelector)会使所有Logger都异步。同时,我们也可以在配置文件中为特定的Logger设置异步,这称为混合模式。下面是一个全局异步的配置示例(需要配合系统属性或log4j2.component.properties文件)以及log4j2.xml的配置: 步骤:1.添加disruptor依赖(Maven项目):```xml<dependency><groupId>com.lmax</groupId><artifactId>disruptor</artifactId><version>3.4.4</version> </dependency>``` 2.设置系统属性(或者在log4j2.component.properties文件中设置):-在log4j2.component.properties文件中写入:```propertiesLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector```3.编写log4j2.xml配置文件,注意:在全局异步模式下,所有的Appender实际上都是被异步调用的,因此我们只需要配置普通的Appender(比如File、Console等),然后Logger引用这些Appender即可。但是,在配置Appender时,可以设置`immediateFlush="false"`来提高性能(因为异步日志会批量刷新)。 示例log4j2.xml(全局异步): ```xml<?xmlversion="1.0"encoding="UTF-8"?> <Configuration status="WARN"><Appenders><!--定义一个文件输出,注意:immediateFlush设置为false,因为异步日志会批量刷新--><Filename="File"fileName="logs/app.log"immediateFlush="false"append="true"><PatternLayoutpattern="%d{yyyy-MM-ddHH:mm:ss.SSS}[%t]%-5level%logger{36} -%msg%n"/></File><Console name="Console" target="SYSTEM_OUT"><PatternLayout pattern="%d{HH:mm:ss.SSS}[%t]%-5level%logger{36} -%msg%n"/></Console></Appenders><Loggers><Rootlevel="info"><AppenderRef ref="Console"/><AppenderRefref="File"/></Root></Loggers> </Configuration>``` 注意:上面的配置中,我们并没有在配置文件里指定异步,因为我们通过系统属性或log4j2.component.properties设置了全局异步。如果我们不想设置全局异步,而只想让某个特定的Logger异步,我们可以使用AsyncLogger。这就是混合模式。例如: ```xml<?xmlversion="1.0"encoding="UTF-8"?> <Configuration status="WARN"><Appenders><Filename="File"fileName="logs/app.log"immediateFlush="false"append="true"><PatternLayoutpattern="%d{yyyy-MM-ddHH:mm:ss.SSS}[%t]%-5level%logger{36} -%msg%n"/></File><Consolename="Console"target="SYSTEM_OUT"><PatternLayoutpattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36}- %msg%n"/></Console></Appenders><Loggers><!--一个异步Logger,注意:需要指定includeLocation(可选)和additivity(是否传递给父Logger) --><AsyncLoggername="com.example" level="info" includeLocation="false"additivity="false"><AppenderRefref="File"/></AsyncLogger><Root level="info"><AppenderRefref="Console"/></Root></Loggers> </Configuration>``` 在混合模式下,我们不需要设置系统属性`Log4jContextSelector`,但是AsyncLogger仍然需要disruptor依赖。总结:-全局异步:设置系统属性(或log4j2.component.properties)并添加disruptor依赖,然后在log4j2.xml中配置普通Appender。-混合异步:添加disruptor依赖,在log4j2.xml中使用`<AsyncLogger>`或`<AsyncRoot>`。根据引用[4]的示例,它展示了一个全局异步的配置(通过系统属性设置)和一个混合模式的配置(在配置文件中使用AsyncLogger)。在混合模式中,它使用了`<RandomAccessFile>`这个Appender,并设置了`immediateFlush="false"`。 因此,根据用户需求,我们选择一种方式配置即可。如果希望所有日志都异步,推荐全局异步方式,性能更好。 注意:在全局异步模式下,不需要在log4j2.xml中做特殊配置(除了设置系统属性),只需要添加disruptor依赖。而混合模式则需要在配置文件中使用`<AsyncLogger>`。最后,引用[5]提供了一个示例项目的链接,如果需要可以参考。相关问题: 1.如何验证log4j2的异步日志配置是否生效? 2.异步日志和同步日志在性能上有什么具体差异?3.在log4j2中,如何配置异步日志的队列大小和等待策略? 4.使用异步日志时,如果应用关闭,未输出的日志会丢失吗?</think>### Log4j2 异步日志配置指南 #### 核心配置步骤 1. **添加依赖** 必须引入 disruptor 依赖以实现异步日志(引用[2][3]): ```xml <dependency> <groupId>com.lmax</groupId> <artifactId>disruptor</artifactId> <version>3.4.4</version> </dependency> ``` 2. **启用全局异步模式**(二选一) - **方式1**:创建 `log4j2.component.properties` 文件(引用[1]): ```properties Log4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector ``` - **方式2**:JVM 启动参数: ```bash -Dlog4j2.contextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector ``` 3. **log4j2.xml 配置示例**(引用[4]): ```xml <?xml version="1.0" encoding="UTF-8"?> <Configuration status="WARN"> <Appenders> <!-- 异步文件输出 --> <RandomAccessFile name="AsyncFile" fileName="logs/app.log" immediateFlush="false" append="true"> <PatternLayout pattern="%d %p %c [%t] %m%n"/> </RandomAccessFile> <!-- 控制台输出 --> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %msg%n"/> </Console> </Appenders> <Loggers> <!-- 异步根日志 --> <Root level="info"> <AppenderRef ref="AsyncFile"/> <AppenderRef ref="Console"/> </Root> </Loggers> </Configuration> ``` #### 关键配置说明 1. **异步优化参数**: - `immediateFlush="false"`:禁用立即刷新,提升性能(引用[4]) - `includeLocation="false"`:禁用位置信息获取(性能提升 30-100%) 2. **混合异步模式**(同步/异步组合): ```xml <Loggers> <!-- 同步Logger --> <Logger name="com.sync" level="debug" additivity="false"> <AppenderRef ref="Console"/> </Logger> <!-- 异步Logger --> <AsyncLogger name="com.async" level="info"> <AppenderRef ref="AsyncFile"/> </AsyncLogger> </Loggers> ``` #### 验证配置是否生效 检查日志输出中是否包含异步标识: ``` 2023-08-01 12:34:56 [AsyncLogger-1] INFO com.example.Main - 异步日志已启动 ``` 若线程名显示 `AsyncLogger-*` 则表明异步模式生效。 #### 性能调优建议 1. 设置合理的队列大小(JVM 参数): ```bash -DAsyncLogger.RingBufferSize=4096 ``` 2. 当日志量极大时,使用 `RandomAccessFile` 替代 `File` Appender(引用[4]) > **注意**:异步日志在应用关闭时可能丢失最后几条日志,重要场景建议添加同步日志兜底(引用[5])。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值