本人近年都在做
Android
项目,最近有个纯
Java
项目紧张,临时介入其中。日志模块,控制端显示不同等级日志同时保存到文件中,要求每天保存一个日志文件,日志目录保留最近30天日志文件。最初没想到用库,自己采用线程池方式写日志,在写日志时先判断是否有30天前的日志删除,然后对比时间判定是否有当天日志文件,之后采用BufferedWriter写日志。写好后,客户进行代码审查,不太相信我写的效率,要求采用公共控件的方式来写日志。无奈就找到了Log4j2。
以上,无聊记录一下,本文中不会涉及太基本的配置与字段的意义,部分会较详细说明一下。
1.官网下载
Log4j包
;
2.将其中的log4j-api-2.5.jar,log4j-core-2.5.jar加入工程;
3.src目录下加入log4j2.xml,配置好相关属性;
4.需用的代码中加入static Logger sLogger = LogManager.getLogger(LogManage.class.getName()); sLogger.debug(strLog);即可调用使用。
现就log4j2.xml注释说明:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Appenders>
<!-- 输出到控制台 -->
<Console name="CONSOLE" target="SYSTEM_OUT">
<!-- 输出格式 -->
<PatternLayout pattern="ROOT:%d %-5p %C %L - %m%n" />
</Console>
<!-- 按天备份一个日志 -->
<!-- fileName为生成的文件名,x为路径,也可以采用相对路径模式,filePattern为时间到达后产生新日志,旧日志的文件名 -->
<RollingFile name="TASK" fileName="x:/xxxx/logs.log"
filePattern="x:/xxxx/logs_%d{yyyy-MM-dd}.log" >
<!-- 输出格式 -->
<PatternLayout pattern="%d %-5p %m%n" />
<Policies>
<!-- 每1天更新一次,此处查阅网上和官方示例中,都是以小时出现,我测试是以天为单位。(官方文档中说明按item类型是否是小时,但没找到在哪里设置item类型)另有其他各类型策略,请参阅官方文档 -->
<!-- TimeBasedTriggeringPolicy需要和filePattern配套使用,由于filePattern配置的时间最小粒度是dd天,所以表示每一天新建一个文件保存日志。SizeBasedTriggeringPolicy表示当文件大小大于指定size时,生成新的文件保存日志。 -->
<TimeBasedTriggeringPolicy modulate="true"
interval="1" />
<!-- 此处为每个文件大小策略限制,使用它一般会在文件中filePattern采用%i模式 -->
<!-- <SizeBasedTriggeringPolicy size="128KB" /> -->
</Policies>
<!-- 最多备份30天以内的日志,此处为策略限制,Delete中可以按自己需要用正则表达式编写 -->
<!-- DefaultRolloverStrategy字段中加入max=“30”经测试是配合SizeBasedTriggeringPolicy限制%i的存在数量,并没有发现是网上流传的是最多保存多少个文件的限制,也或许是我写的有问题 -->
<DefaultRolloverStrategy>
<Delete basePath="x:/xxxx" maxDepth="1">
<IfFileName glob="logs_*.log" />
<IfLastModified age="30d" />
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
</Appenders>
<!-- 链接到Console和RollingFile标签实现debug以上等级的输出 -->
<loggers>
<root level="debug">
<appender-ref ref="CONSOLE"/>
<AppenderRef ref="TASK" />
</root>
</loggers>
</Configuration>
-
import
org.apache.logging.log4j.LogManager;
-
import
org.apache.logging.log4j.Logger;
-
import
org.dom4j.Document;
-
import
org.dom4j.DocumentHelper;
-
import
org.dom4j.Element;
-
-
import
taskservice.GlobalInstance;
-
-
public
class
LogManage
implements
ILogManage {
-
-
private
ServiceState mServiceState;
-
private
final
String strLogFilePath = GlobalInstance.taskServiceConfig.strLogFilePath;
-
-
static
Logger sLogger = LogManager.getLogger(LogManage.
class
.getName());
-
-
public
LogManage() {
-
mServiceState =
new
ServiceState();
-
}
-
-
@Override
-
public
void
log(
int
level, String strLog) {
-
GlobalInstance.taskServiceUi.logInfo(strLog);
-
-
switch
(level) {
-
case
LogLevel.DEBUG:
-
sLogger.debug(strLog);
-
break
;
-
case
LogLevel.INFO:
-
sLogger.info(strLog);
-
break
;
-
case
LogLevel.WARNING:
-
sLogger.warn(strLog);
-
break
;
-
case
LogLevel.ERROR:
-
sLogger.error(strLog);
-
break
;
-
default
:
-
break
;
-
}
-
}
-
}
网上看的文章,亲测有用.
果你做过类似的资料搜索工作, 你会容易找到相关的配置方法. 然而, 但是, 大部分都是你抄我, 我抄你的, 并没有仔细检测, 就写的教程.
其中重要的就是删除过期日志
文件
的配置. 很多都说通过max=数字控制.
这是扯淡, 这个只是控制某时间段内(根据配置不同)
文件
的数目.它并不会关心你的目录下一共有多少个日志
文件
了. 可想而知, 这样随着时间的推移, 虽然每个时间区间内日志数目控制在范围内, 但是, 总日志
文件
个数, 依然日益膨胀.
log
4j2.xml
RollingFile:
使用
文件
方式记录日志
- fileName:记录日志的
文件
- filePattern:当日志记录
文件
超过指定大小时,以指定的
文件
格式生成新的
文件
SizeBasedTriggeringPolicy
- size:指定每个日志
文件
大小,如果超过该大小,则生成新的日志
文件
DefaultRolloverStrategy
- max 指定相同规则
文件
最多保留多少个,如果规则是root-%d{yyyy-MM-dd}-%i.
log
,那么此时是以天为单位记录,会依次生成root-2022-0
当
log
4j
使用
DailyRollingFileAppender进行日志归档时,需要对日志的个数进行控制。
此时需要对DailyRollingFileAppender进行重写。
package org.apache.
log
4j;
import org.slf4j.
Log
ger;
import org.slf4j.
Log
gerFactory;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
<Configuration status="WARN">
<Properties>
<Property name="
LOG
_PATTERN">%highlight{%d{yyyy-MM-dd HH:mm:ss} ...
日志
文件
大小1MB,每天最多保留10个
文件
,只保留7天的日志
rollingRandomAccessFile: # 日志
文件
Appender,将日志信息输出到日志
文件
- name: ROLLING_FILE
fileName: ${
log
Path}/${projectName}.
log
filePattern: "${
log
Path}/history
Log
s/$${date:yyyy-MM}/${projectName}-%d{yyyy-MM-dd}-%i.
log
.gz"
原文:http://www.shanhh.com/set_max_count_of_
log
_files_for_
log
4j/
Appender为日志输出目的地,
log
4j已经提供了非常丰富的Appender用以满足不同的需求:
org.apache.
log
4j.ConsoleAppender 输出到控制台org.apache.
log
4j.FileAppender 输出到
文件
org.a
scan:当此属性设置为true时,配置
文件
如果发生改变,将会被重新加载,默认值为true。
scanPeriod:设置监测配置
文件
是否有修改的时间间隔,如果没有给出时间单位,默认...
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/
log
ging/
log
back/defaults.xml" />
<appender name="CONSOLE" class="ch.qos.
log
back.core.ConsoleAppe