申明:本文的配置部分很大部分参考自博客园博主“滕秋宇”,我将复制他博文的一部分,在这之前,我先总结一些我认为比较重要的部分。
他的博文链接:https://www.cnblogs.com/tengqiuyu/p/7535373.html; 致谢!
首先搞清楚log4j是个啥?
wikipedia-log4j
Apache Log4j is a Java-based logging utility. It was originally written by Ceki Gülcü and is part of the Apache Logging Services project of the Apache Software Foundation. Log4j is one of several Java logging frameworks
log4j是一个基于Java的写日志的工具,最初由一个不知道哪国人的叫 Ceki Gülcü的写的,并且是Apache软件基金会的日志服务工程之一。log4j是Java的几个日志框架之一。(那么Java还有哪些日志框架呢?我们跟进:wikipedia-Java logging frameworks 有
-
Log4J: 广泛使用
-
Java Logging API: java亲生的
-
Logging: 基于底层log框架的架子,广泛使用,常与Log4J结合;
-
SLF4J: 基于底层log框架的架子,配合使用的,不能脱离它们;Simple Logging Facade for Java;作者和Log4J是一个人。
它依赖后端(更底层)的logging框架,当已有的代码或者第三方代码已经选定了底层logging框架,比如Log4J,logback,tinylog时,代码整合就很方便,SLF4J的作用就在这里。说到facade(那个字母c不是c):JUnit提供了一个facade,org.junit.runner.JunitCore,它可以运行任何测试运行任何测试运行器,你可以使用facade来将一些复杂的对象交互简化成一个单独的接口。
-
tinylog: 轻量型的log框架,专为Java和Android设计:https://tinylog.org/
-
Logback: 将作为Log4J的继承者,完善了Log4J,理由是:Reasons to prefer logback over log4j;(更快,占用内存更小;经过了更大的测试,经历了无数个日日夜夜,更可靠)Logback主要由三模块组成:
Logback-core:底层核心为后两个服务;logback-classic: 被认为是Log4J的重要提升,同时,它实现了SLF4J的API,方便切换框架,and logback-access,结合了一些Servlet。
Logger
A Logger is an object that allows the application to log without regard to where the output is sent/stored. >The application logs a message by passing an object or an object and an exception with an optional >severity level to the logger object under a given a name/identifier.
Name
A logger has a name. The name is usually structured hierarchically, with periods (.) separating the levels. >A common scheme is to use the name of the class or package that is doing the logging. Both log4j and >the Java logging API support defining Handlers higher up the hierarchy.
For example, the logger might be named “com.sun.some.UsefulClass”. The handler can be defined for any of the following:
com
com.sun
com.sun.some
com.sun.some.UsefulClass
logger是一个对象,允许程序输出log,不管它输出到哪里(为appender埋伏笔)…
应用通过一个对象或者一个对象和一个异常,再加上通过名字或者标识符标志的可选的严重等级来记录信息。
所以这个名字是什么意思?
日志记录器有个名字,名字通常是结构化继承的,用点点来分等级。一个通用的办法是用类名或者包名来打logging!(白人感叹号脸-_-).log4j和那Java的logging 应用程序接口支持定义处理者在更高的等级。
比如一个日志记录器叫com.sun.some.UsefulClass,那处理者可以被定义为下面任何一个,曾祖父(母),爷爷(奶奶),爸爸或者自己。
看看日志严重等级分哪些(Log4J 2):
-
OFF:最高的可能的等级,日志马上即将都记不了了;
-
FATAL:严重的错误导致过早终止,希望这些错误在状态控制台可以马上看到!
-
ERROR:其他的运行时错误或者意料之外的情况,希望这些错误在状态控制台可以马上看到!
-
WARN:用旧的API,API用得很糟糕,几乎出错(就像合金弹头里小人在崖边流鼻涕那种),其他运行
时不期望的情况,但不至于是“错误的”,状态控制台也很想见”WARN“。 -
INFO:你感兴趣的运行时事件(启动和关闭)啦,状态控制台也想看它,但它比较腼腆,不常露面。
-
DEBUG:数据在系统中流动的细节由它掌管。只有这些才会被希望写到日志里(实际应用中状态控制台谁去盯着看,都要保存的)。话句话说,你的程序打的大多数log应该写成DEBUG.
-
TRACE:最细节的信息(明察秋毫),希望写到log文件里,自从1.2.12版本。(log4j的1.2.12版本)。
嗯,Log4J 2代支持 自定义等级!
自定义等级使用的方法是Level.forName(name,value);其中,value就是等级;
看看自带的等级的value是多少?StandardLevel.class
package org.apache.logging.log4j 中 Level.class
OFF(0),
FATAL(100),
ERROR(200),
WARN(300),
INFO(400),
DEBUG(500),
TRACE(600),
ALL(2147483647).
log4J可以用配置文件或者通过java代码,其中配置文件可以用XML,JSON,YAML,或者properties格式。
在配置中,你可以定义,注意,重点,定义三个组件:Logger,Appender,Layout,即日志记录器,输出目的地,输出的格式(布局)。
说点重点吧:log4j 2 添加了Appender啦,有这么几位:Apache Flume(什么东东?),Java Persistence API(Java持久化API,什么东东?),Apache Kafka(正中下怀),NoSQL数据库,内存映射文件(Memory-mapped files),随机流(java.io.RandomAccessFile什么东东?没见过)还有个ZeroMQ endpoint(没见过)。
en~,Fileter也很重要的!
Log4J2_IN_WIKIPEDIA
In Log4j 2, Filters can be defined on configuration elements to give more fine-grained control over which log entries should be processed by which Loggers and Appenders. In addition to filtering by log level and regular expression matching on the message string, Log4j 2 added burst filters, time filters, filtering by other log event attributes like Markers or Thread Context Map and JSR 223 script filters.
跑偏了:
好了;
***Log4J配置怎么写?***
https://logging.apache.org/log4j/2.x/manual/configuration.html#Appenders
实际用了下下,感觉Log4J 2比 1代确实好,可以自定义等级,在我看来分工也更明确,使用xml表达方便理解各自组件的关系
有个问题,如何指定某个类的日志输出等级(比如你使用Tomcat时,打出一大堆INFO日志都是你不需要的,想看自己代码的DEBUG把别的也带出来一大堆,很不爽):
Log4J 1.x中是这样写的:log4j.logger.org.springframework=ERROR
不过这个好像是全局控制的
Log4J 2.x中这样写的:<Logger name="com.another.project" level="ERROR" />
logger是logger,appender是appender,感觉比Log4J 1.x 从形式上好看些,完整的见下:https://stackoverflow.com/questions/16917008/filter-by-class-name-in-log4j2
具体在properties文件下写法,应该差不多
<Configuration status="warn">
<Appenders>
<File name="MyFile" fileName="logs/my.log">
<PatternLayout pattern="%d %p %c{1.} [%t] %m%n" />
</File>
</Appenders>
<Loggers>
<!-- drops all DEBUG and TRACE logging done by any class in this package -->
<Logger name="com.other.company" level="INFO" />
<!-- log only ERROR and FATAL logging by classes in this package -->
<Logger name="com.another.project" level="ERROR" />
<!-- by default, all log events are written to MyFile -->
<Root level="trace">
<AppenderRef ref="MyFile"/>
</Root>
</Loggers>
</Configuration>
配置%M, %d的含义是什么呢?
https://logging.apache.org/log4j/2.x/manual/layouts.html 搜索“Pattern Layout”
%d 就是date
%p 就是level
%m 就是message,应用对日志事件所提供的信息???
%n 就是换行符
一个比较深刻的博客:
https://www.cnblogs.com/Mainz/p/3628414.html
配置详解:
https://www.cnblogs.com/ITtangtang/p/3926665.html