Log4j2使用简介

本文目录

1 Log4J2相关包

2 配置步骤

3 使用示例

4 相关文章


1 Log4J2相关包

log4j-api.jar(Apache Log4j 2 API)

提供统一接口

log4j-core.jar(Apache Log4j 2 Implementation)

提供接口的具体实现

log4j-web(Apache Log4j 2 Web)

包含一些Web应用相关的类,例如:Log4jServletContextListener等。

在Servlet 3.0及以后版本中,Servlet提供了ServletContainerInitializer接口,在Servlet容器初始化阶段执行该接口。

在log4j-web.jar中,通过Log4jServletContainerInitializer实现了该接口。

在接口实现中对ServletContext添加了Log4jServletContextListener,log4jConfigLocation默认为/WEB-INF/log4j2.xml。

因此,不在web.xml进行上述配置,即可自动完成监听及加载操作。

详细内容参考官网:http://logging.apache.org/log4j/2.x/manual/webapp.html

log4j-jcl.jar(Apache Log4j 2 Commons Logging Bridge)

应用中使用Commons Logging API日志框架,绑定log4j2作为接口的具体实现

log4j-slf4j-impl.jar(Apache Log4j 2 SLF4J Binding)

应用中使用slf4j日志框架,绑定log4j2作为接口的具体实现。

log4j-to-slf4j.jar(Apache Log4j 2 to SLF4J Adapter)

应用中使用log4j2日志框架,通过适配器,实现log4j2底层转调slf4j接口。

log4j-slf4j-impl.jar与log4j-to-slf4j.jar不可共存,否则会产生冲突。

2 配置步骤

(1)添加依赖项:log4j-core.jar、log4j-api.jar、log4j-web.jar

<dependency>
   <groupId>org.apache.logging.log4j</groupId>
   <artifactId>log4j-core</artifactId>
   <version>${log4j.version}</version>
</dependency>

<dependency>
   <groupId>org.apache.logging.log4j</groupId>
   <artifactId>log4j-api</artifactId>
   <version>${log4j.version}</version>
</dependency>

<dependency>
   <groupId>org.apache.logging.log4j</groupId>
   <artifactId>log4j-web</artifactId>
   <version>${log4j.version}</version>
</dependency>

(2)配置log4j2.xml文件:/src/main/resources/log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>

<!-- status : Log4j2自身日志输出级别 | OFF 表示关闭Log4j2自身日志输出 -->
<!-- monitorInterval : 动态加载配置文件间隔(单位:秒) -->
<Configuration status="WARN" monitorInterval="60">

  <!-- 自定义参数 -->
  <Properties>
    <!-- 日志路径 -->
    <Property name="base_log_dir">/data/logs</Property>
    <!--
        %d{yyyy-MM-dd HH:mm:ss, SSS} : 日志记录时间
        %t : 线程名称
        %-5level : 日志级别,-表示左对齐,5表示固定长度为5
        %l : 执行位置(包括类名、方法名、行数)
        %m : 日志内容
        %xEx : 异常信息
        %n : 换行符
     -->
    <Property name="def_pattern">%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] [%-5level] - %l%n- %msg%xEx%n</Property>
  </Properties>

  <!-- 输出源 -->
  <Appenders>
    <!-- 控制台 -->
    <Console name="Console" target="SYSTEM_OUT">
      <PatternLayout pattern="${def_pattern}"/>
    </Console>
    <!-- 日志文件 -->
    <!-- name : 输出源ID -->
    <!-- fileName : 输出文件名 -->
    <!-- append : 是否追加 | true 追加内容 | false 覆盖文件 -->
    <File name="File" fileName="${base_log_dir}/app.log" append="true">
      <PatternLayout pattern="${def_pattern}"/>
    </File>
    <!-- 滚动日志文件 -->
    <!-- 通常设置三个RollingFile输出源:Info, Error, Fatal -->
    <RollingFile name="RollingFile" fileName="${base_log_dir}/app.log"
      filePattern="${base_log_dir}/app-%d{yyyy-MM-dd}-%i.log">
      <!-- level : 输出级别控制 -->
      <!-- onMatch : 满足级别操作(ACCEPT输出) -->
      <!-- onMismatch : 不满足级别操作(DENY忽略) -->
      <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
      <!-- 输出格式 -->
      <PatternLayout pattern="${def_pattern}"/>
      <Policies>
        <!-- 更新时间策略 -->
        <!-- 配合filePattern中的时间部分使用,当文件名不再符合时间部分规则,则新建一个日志文件 -->
        <!-- modulate : 是否以00:00作为基准,计算interval偏移量 -->
        <!-- interval : 指定每隔多少小时进行一次日志文件名检查 -->
        <TimeBasedTriggeringPolicy modulate="true" interval="24"/>
        <!-- 文件大小策略 : 当前日志文件操作10MB时创建一个新日志文件 -->
        <!-- 规定日志文件大小,当超过限制时,触发Rollover操作,新建一个日志文件 -->
        <SizeBasedTriggeringPolicy size="10MB"/>
      </Policies>
      <!-- 最大文件数量 -->
      <!-- 同filePattern中的%i(计数)配合使用,对于相同文件名的日志文件,仅保最近指定数量的文件 -->
      <DefaultRolloverStrategy max="2"/>
      <!-- 删除策略 -->
      <DefaultRolloverStrategy>
        <Delete basePath="${base_log_dir}/" maxDepth="1">
          <IfFileName glob="*.log">
            <IfLastModified age="40d"/>
          </IfFileName>
        </Delete>
      </DefaultRolloverStrategy>
    </RollingFile>
  </Appenders>

  <!-- 记录器 -->
  <Loggers>

    <!-- 默认记录器 -->
    <!-- level : 日志级别限制 -->
    <Root level="INFO">
      <!-- ref : 输出源绑定 -->
      <Appender-ref ref="Console"/>
    </Root>

    <!-- 监控记录器 -->
    <!-- name : 指定监控对象名(包名或类名) -->
    <!-- level : 日志输出级别 -->
    <!-- additivity : 是否生效 -->
    <Logger name="org.springframework" level="INFO" additivity="false">
      <!-- 输出源 -->
      <Appender-ref ref="RollingFile"/>
    </Logger>
  </Loggers>
</Configuration>

(3)日志文件夹创建与删除:

 - 添加依赖:org.codehaus.groovy:groovy-all:2.4.15 (为了支持groovy语言)

 - Rolling策略会自动生成文件夹:filePattern 包含类似 $${date:yyyy-MM-dd} 可变路径

<RollingRandomAccessFile name="RollingFileDaily" fileName="${LOG_HOME}/xxxx.log" filePattern="${LOG_HOME}/$${date:yyyy-MM-dd}/xxxx@%d{yyyy-MM-dd_HH}#%i.log">

 - 添加 Delete Script 脚本节点,自定义执行删除逻辑。

<Delete basePath="${LOG_HOME}/" maxDepth="2">
	<ScriptCondition>
		<Script name="GroovyCondition" language="groovy">
			<![CDATA[
				import java.util.List
				import java.util.ArrayList
				import java.io.File
				import java.nio.file.*
				import java.nio.file.attribute.BasicFileAttributes
				import org.apache.logging.log4j.core.appender.rolling.action.PathWithAttributes

				List<PathWithAttributes> result = new ArrayList<PathWithAttributes>();
				File baseDir = basePath.toFile();
				if (baseDir.exists()) {
					File[] folders = baseDir.listFiles();
					if (folders != null) {
						for (File folder : folders) {
							if (folder.isDirectory()) {
								File[] file = folder.listFiles();
								if (file == null || file.length == 0) {
									Path folderPath = folder.toPath();
									statusLogger.error 'SCRIPT: find empty log folder, path: ' + folderPath
									BasicFileAttributes attributes = Files.readAttributes(folderPath, BasicFileAttributes.class);
									result.add(new PathWithAttributes(folderPath, attributes));
								}
							}
						}
					}
				}
				return result;
			]]>
		</Script>
	</ScriptCondition>
</Delete>

3 使用示例

private static final Logger logger =LogManager.getLogger(Xxxx.class);
logger.info(“Message”);

4 相关文章

《SLF4J使用简介》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值