- commons-logging和slf4j是java中的日志门面,即它们提供了一套通用的接口,具体的实现可以由开发者*选择。log4j和logback则是具体的日志实现方案。
- 比较常用的搭配是commons-logging+log4j,slf4j+logback
-
为什么要用SLF4J+Logback 替换commons-logging+log4j?
- SLF4J是编译时绑定到具体的日志框架,性能优于采用运行时搜寻的方式的commons-logging
- 不需要使用logger.isDebugEnabled()来解决日志因为字符拼接产生的性能问题
logger.info("my name is {}", "medusar");
logger.info("my name is " + "medusar");-
在效率上,第一行比第二行更高,因为如果当前日志级别是ERROR,第一行不会进行字符串拼接,而第二行,无论日志级别是什么,都会先进行字符串拼接。
- 所以为了解决这个问题,commons-logging等框架提供了下面的方式:
if (log.isDebugEnabled()){
log.debug("dddd"+"eee");
}
- 基于commons-logging的日志使用
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class XXXService {
private static final Log log = LogFactory.getLog(XXXService.class);
public void doSomething(){
log.info("begin dosomething....");
}
}
-
基于slf4j的日志使用
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class XXXService {
private static final Logger logger = LoggerFactory.getLogger(XXXService.class);
public void doSomething() {
logger.info("begin dosomething...");
}
}
- SpringBoot底层也是使用slf4j+logback的方式进行日志记录;
- SpringBoot也把其他的日志都替换成了slf4j;
-
Spring Boot能自动适配所有的日志,而且底层使用slf4j+logback的方式记录日志,引入其他框架的时候,只需要把这个框架依赖的日志框架排除掉。
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>- 以后开发的时候,日志记录方法的调用,不应该直接调用日志的实现类,而是调用日志抽象层里面的方法;给系统里面导入slf4j的jar和logback的实现jar
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class HelloWorld {
public static void main(String[] args) {
Logger logger = LoggerFactory.getLogger(HelloWorld.class);
logger.info("Hello World"); }
}
-
指定文件中日志输出的格式
# 在控制台输出的日志格式 logging.pattern.console=%d{yyyy-MM-dd} [%thread] %-5level %logger{} - %msg%n
# 指定文件中日志输出的格式 logging.pattern.file=%d{yyyy-MM-dd} === [%thread] === %-5level === %logger{} === - %msg%n- <!-- 日志输出格式:
- %d表示日期时间,
- %thread表示线程名,
- %-5level:级别从左显示5个字符宽度
- %logger{50} 表示logger名字最长50个字符,否则按照句点分割。
- %msg:日志消息,
- %n是换行符-->
-
切换日志框架(无意义,slf4j+logback已经是最佳实现)
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!--排除转换包-->
<exclusions>
<exclusion>
<artifactId>logback-classic</artifactId>
<groupId>ch.qos.logback</groupId>
</exclusion>
<exclusion>
<artifactId>log4j-over-slf4j</artifactId>
<groupId>org.slf4j</groupId> </exclusion>
</exclusions>
</dependency>
<!--添加slf4j依赖-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
- 调整日志级别
- Log Level:
ERROR
,WARN
,INFO
,DEBUG
, orTRACE
. - Logback does not have a
FATAL
level. It is mapped toERROR
. - The default log configuration echoes messages to the console as they are written. By default,
ERROR
-level,WARN
-level, andINFO
-level messages are logged. You can also enable a “debug” mode by starting your application with a--debug
flag. $ java -jar myapp.jar --debug
- Alternatively, you can enable a “trace” mode by starting your application with a
--trace
flag (ortrace=true
in yourapplication.properties
). -
All the supported logging systems can have the logger levels set in the Spring
Environment
(for example, inapplication.properties
) by usinglogging.level.<logger-name>=<level>
wherelevel
is one of TRACE, DEBUG, INFO, WARN, ERROR, FATAL, or OFF. Theroot
logger can be configured by usinglogging.level.root
.The following example shows potential logging settings in
application.properties
: logging.level.root=WARN
logging.level.org.springframework.web=DEBUG
logging.level.org.hibernate=ERROR
- Log Level:
- 日志文件
- By default, Spring Boot logs only to the console and does not write log files. If you want to write log files in addition to the console output, you need to set a
logging.file
orlogging.path
property (for example, in yourapplication.properties
). - Log files rotate when they reach 10 MB and, as with console output,
ERROR
-level,WARN
-level, andINFO
-level messages are logged by default. Size limits can be changed using thelogging.file.max-size
property. Previously rotated files are archived indefinitely unless thelogging.file.max-history
property has been set. - Logging properties are independent of the actual logging infrastructure. As a result, specific configuration keys (such as
logback.configurationFile
for Logback) are not managed by spring Boot.
- By default, Spring Boot logs only to the console and does not write log files. If you want to write log files in addition to the console output, you need to set a
-
Log Groups
-
It’s often useful to be able to group related loggers together so that they can all be configured at the same time. For example, you might commonly change the logging levels for all Tomcat related loggers, but you can’t easily remember top level packages.
To help with this, Spring Boot allows you to define logging groups in your Spring
Environment
. For example, here’s how you could define a “tomcat” group by adding it to yourapplication.properties
:logging.group.tomcat=org.apache.catalina, org.apache.coyote, org.apache.tomcat
Once defined, you can change the level for all the loggers in the group with a single line:
logging.level.tomcat=TRACE
Spring Boot includes the following pre-defined logging groups that can be used out-of-the-box:
Name Loggers web
org.springframework.core.codec
,org.springframework.http
,org.springframework.web
sql
org.springframework.jdbc.core
,org.hibernate.SQL
-
-
Custom Log Configuration
- The various logging systems can be activated by including the appropriate libraries on the classpath and can be further customized by providing a suitable configuration file in the root of the classpath or in a location specified by the following Spring
Environment
property:logging.config
. - Since logging is initialized before the
ApplicationContext
is created, it is not possible to control logging from@PropertySources
in Spring@Configuration
files. The only way to change the logging system or disable it entirely is via System properties. - Depending on your logging system, the following files are loaded:
Logging System Customization Logback
logback-spring.xml
,logback-spring.groovy
,logback.xml
, orlogback.groovy
Log4j2
log4j2-spring.xml
orlog4j2.xml
JDK (Java Util Logging)
logging.properties
- When possible, we recommend that you use the
-spring
variants for your logging configuration (for example,logback-spring.xml
rather thanlogback.xml
). If you use standard configuration locations, Spring cannot completely control log initialization. -
To help with the customization, some other properties are transferred from the Spring
Environment
to System properties, as described in the following table:Spring Environment System Property Comments logging.exception-conversion-word
LOG_EXCEPTION_CONVERSION_WORD
The conversion word used when logging exceptions.
logging.file
LOG_FILE
If defined, it is used in the default log configuration.
logging.file.max-size
LOG_FILE_MAX_SIZE
Maximum log file size (if LOG_FILE enabled). (Only supported with the default Logback setup.)
logging.file.max-history
LOG_FILE_MAX_HISTORY
Maximum number of archive log files to keep (if LOG_FILE enabled). (Only supported with the default Logback setup.)
logging.path
LOG_PATH
If defined, it is used in the default log configuration.
logging.pattern.console
CONSOLE_LOG_PATTERN
The log pattern to use on the console (stdout). (Only supported with the default Logback setup.)
logging.pattern.dateformat
LOG_DATEFORMAT_PATTERN
Appender pattern for log date format. (Only supported with the default Logback setup.)
logging.pattern.file
FILE_LOG_PATTERN
The log pattern to use in a file (if
LOG_FILE
is enabled). (Only supported with the default Logback setup.)logging.pattern.level
LOG_LEVEL_PATTERN
The format to use when rendering the log level (default
%5p
). (Only supported with the default Logback setup.)PID
PID
The current process ID (discovered if possible and when not already defined as an OS environment variable).
- The various logging systems can be activated by including the appropriate libraries on the classpath and can be further customized by providing a suitable configuration file in the root of the classpath or in a location specified by the following Spring
- xx