关于日志分离和 Log4j 配置

项目目前的日志文件每天特别大,并且各种类型的日志混在一起,经过这段时间的研究,总算研究出一点东西 (下面这几点只讲解了容易有疑问的点)

  1. log4j.rootLogger 标识根设置,我更愿意理解为基础设置,不管你在后面加多少配置(比如增加 独立的日志文件配置),如果不另外设置属性那么所有的日志都会出现在基础日志里。

2.log4j.logger.XXX 这里的 XXX 既可以填写包名,也可以填写自己取得名字,区别就是如果填写的是包名那么只要是该包下的类调用时直接 Logger.getLogger(UmppAPService.class); 就可以了,如果是填写的自己写的别名 那么直接 Logger.getLogger(“XXX”); 调用即可。那么这里就存在一种特殊情况,如果我填写 com.xxx.xxx 但是这个包名确是错的呢,比如下图

image.png

image.png

在经过我测试之后,发现 com.epichust.UmppApService 被识别成了别名, 调用的时候必须按照别名的方法去调用.

这里还有个很重要的属性,上面说了如果你不特殊设置,基本所有的日志都会出现在 root 设置指定的日志里,那么比如我要把排程的日志从根日志分离出来,那么就必须加上

log4j.additivity.XXX=false 这里 XXX 可以使包名也可以是别名(别名亲测可行,包名未测试)

3.log4j.appender.XXX 这里主要设置日志输出到哪里以及格式等等 具体可去研究文档,这里有个属性要注意 BufferdIO 和 BufferSize 这个貌似是设置缓存控件,即超过此空间大小之后,日志才会被输出到文件或者别的地方(亲测)

另外我发现 appender 可以自定义 详情见

https://blog.csdn.net/x6582026/article/details/51460472

4. 关于改了配置之后的测试, 可以直接使用 main 方法测试, 这样会快很多

public static void main(String[] args)

{

try

{

PropertyConfigurator.configure(“配置文件位置”);

Logger logger = Logger.getLogger(UmppAPService.class);

logger.debug(“quartz***********************************”);

logger.info(“quartz***********************************”);

} catch (Exception e)

{

System.out.println(e.getMessage());

}

}


Log4J 配置文件的基本格式如下:

#配置根 Logger log4j.rootLogger = [level] , appenderName1 , appenderName2 , …
#配置日志信息输出目的地 Appender
log4j.appender.appenderName = fully.qualified.name.of.appender.class log4j.appender.appenderName.option1 = value1 … log4j.appender.appenderName.optionN = valueN #配置日志信息的格式(布局) log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class log4j.appender.appenderName.layout.option1 = value1 … log4j.appender.appenderName.layout.optionN = valueN

其中 [level] 是日志输出级别,共有 5 级:

FATAL 0 记录影响系统正常运行,可能导致系统崩溃的事件
ERROR 3 记录影响业务流程正常进行,导致业务流程提前终止的事件
WARN 4 记录未预料到,可能导致业务流程无法进行的事件
INFO 6 记录系统启动 / 停止,模块加载 / 卸载之类事件
DEBUG 7 记录业务详细流程,用户鉴权 / 业务流程选择 / 数据存取事件
TRACE 记录系统进出消息,码流信息

Appender 为日志输出目的地,Log4j 提供的 appender 有以下几种:

org.apache.log4j.ConsoleAppender(控制台),
org.apache.log4j.FileAppender(文件),
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件, 也可指定超过某大小也自动产生新的文件),
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)

Layout:日志输出格式,Log4j 提供的 layout 有以下几种:

org.apache.log4j.HTMLLayout(以 HTML 表格形式布局), org.apache.log4j.PatternLayout(可以灵活地指定布局模式), org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串), org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)

打印参数: Log4J 采用类似 C 语言中的 printf 函数的打印格式格式化日志信息,如下:

%m 输出代码中指定的消息
%p 输出优先级,即 DEBUG,INFO,WARN,ERROR,FATAL
%r 输出自应用启动到输出该 log 信息耗费的毫秒数 %c 输出所属的类目,通常就是所在类的全名
%t 输出产生该日志事件的线程名
%n 输出一个回车换行符,Windows 平台为“\r\n”,Unix 平台为“\n”
%d 输出日志时间点的日期或时间,默认格式为 ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH🇲🇲ss , SSS},输出类似:2002 年 10 月 18 日 22 : 10 : 28 , 921 %l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java: 10)


把这三个属性都基本理解了基本就可以玩转日志了,当然还是推荐把文档自己看一遍!

https://logging.apache.org/log4j/2.x/articles.html