java log日志
1. log4j
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<artifactId>spring-boot-starter-logging</artifactId>
<groupId>org.springframework.boot</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j</artifactId>
<version>1.3.8.RELEASE</version>
</dependency>
-
application.propertie配置文件中添加如下配置
logging.config=classpath:log4j.properties
-
添加log4j 配置文件 lo4j.properties
log4j.rootLogger=INFO,Console,File
log4j.logger.com.xx.xx=DEBUG,stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L - %m%n
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.Target=System.out
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=[%p] [%d{yyyy-MM-dd HH\:mm\:ss}][%c - %L]%m%n
2. log4j2
特点:
1. 插件式结构。Log4j 2支持插件式结构。我们可以根据自己的需要自行扩展Log4j 2. 我们可以实现自己的appender、logger、filter。
2. 配置文件优化。在配置文件中可以引用属性,还可以直接替代或传递到组件。而且支持json格式的配置文件。不像其他的日志框架,它在重新配置的时候不会丢失之前的日志文件。
3. Java 5的并发性。Log4j 2利用Java 5中的并发特性支持,尽可能地执行最低层次的加锁。解决了在log4j 1.x中存留的死锁的问题。
4. 异步logger。Log4j 2是基于LMAX Disruptor库的。在多线程的场景下,和已有的日志框架相比,异步的logger拥有10倍左右的效率提升。
官方推荐使用异步方式, log4j2异步日志需要加载disruptor-3.0.0.jar或者更高的版本
<dependency>
<groupId>com.lmax</groupId>
<artifactId>disruptor</artifactId>
<version>3.3.6</version>
</dependency>
使用方式
- 引入依赖包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<artifactId>spring-boot-starter-logging</artifactId>
<groupId>org.springframework.boot</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<!-- log4j2异步日志需要加载disruptor-3.0.0.jar或者更高的版本 -->
<dependency>
<groupId>com.lmax</groupId>
<artifactId>disruptor</artifactId>
<version>3.3.6</version>
</dependency>
添加日志配置
<Configuration status="WARN">
<Properties>
<property name="LOG_PATH">../logs/</property>
<property name="LOG_FILE">testlog4j2</property>
</Properties>
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout>
<pattern>%-d{yyyy-MM-dd HH:mm:ss} [%t] [%tn] [%tp] [%c]-[%p] - %m%n</pattern>
</PatternLayout>
</Console>
<RollingFile name="errorlogfile" fileName="${LOG_PATH}/${LOG_FILE}.log"
filePattern="${LOG_PATH}/$${date:yyyy-MM}/${LOG_FILE}-%d{yyyy-MM-dd HH-mm}-%i.log">
<PatternLayout>
<pattern>%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] - %m%n</pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="50 MB"/>
</Policies>
<DefaultRolloverStrategy max="20"/>
</RollingFile>
</Appenders>
<loggers>
<AsyncLogger name="AsyncLogger" level="trace" includeLocation="true">
<appender-ref ref="Console"/>
</AsyncLogger>
<asyncRoot level="trace" includeLocation="true">
<appender-ref ref="Console"/>
</asyncRoot>
</loggers>
</Configuration>
使用
public static org.apache.logging.log4j.Logger logger2 = LogManager.getLogger(TestController.class);
logger2.debug(" ========> debug 111111");
logger2.info(" ========> info 333");
logger2.error(" ========> erro 333");
3. SLFJ
- SLF4J,即简单日志门面(Simple Logging Facade for Java),不是具体的日志解决方案,而是通过Facade Pattern提供一些Java logging slf4j跟commons-logging类似,是各种日志实现的通用入口。
- 作者创建SLF4J的目的是为了替代Jakarta Commons-Logging。common-logging通过动态查找的机制,在程序运行时自动找出真正使用的日志库;
- 实际上,SLF4J所提供的核心API是一些接口以及一个LoggerFactory的工厂类。在使用SLF4J的时候,不需要在代码中或配置文件中指定你打算使用那个具体的日志系统。
- 在部署的时候不修改任何配置即可接入一种日志实现方案。但是,他在编译时静态绑定真正的Log库。
- 使用SLF4J时,如果你需要使用某一种日志实现,那么你必须选择正确的SLF4J的jar包的集合(各种桥接包)。
- SLF4J提供了统一的记录日志的接口,只要按照其提供的方法记录即可,最终日志的格式、记录级别、输出方式等通过具体日志系统的配置来实现,因此可以在应用中灵活切换日志系统。
适合范围
- 如果你开发的是类库或者嵌入式组件,那么就应该考虑采用SLF4J,因为不可能影响最终用户选择哪种日志系统。
- 在另一方面,如果是一个简单或者独立的应用,确定只有一种日志系统,那么就没有使用SLF4J的必要。
使用方式:
//log4j
import org.apache.log4j.Logger;
private static Logger logger = Logger.getLogger(TestController.class);
//log4j2
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
private static Logger logger = LogManager.getLogger(TestController.class);
//SLF4J
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private static Logger logger = LoggerFactory.getLogger(TestController.class);
4. logback
Logback,一个“可靠、通用、快速而又灵活的Java日志框架”。
logback当前分成三个模块:logback-core,logback- classic和logback-access。
logback-core是其它两个模块的基础模块。
logback-classic是log4j的一个改良版本。此外logback-classic完整实现SLF4J API使你可以很方便地更换成其它日志系统如log4j或JDK Logging。
logback-access访问模块与Servlet容器集成提供通过Http来访问日志的功能。
选择logback的理由:
- logback比log4j要快大约10倍,而且消耗更少的内存。
- logback-classic模块直接实现了SLF4J的接口,所以我们迁移到logback几乎是零开销的。
- logback不仅支持xml格式的配置文件,还支持groovy格式的配置文件。相比之下,Groovy风格的配置文件更加直观,简洁。
- logback-classic能够检测到配置文件的更新,并且自动重新加载配置文件。
- logback能够优雅的从I/O异常中恢复,从而我们不用重新启动应用程序来恢复logger。
- logback能够根据配置文件中设置的上限值,自动删除旧的日志文件。
- logback能够自动压缩日志文件。
- logback能够在配置文件中加入条件判断(if-then-else)。可以避免不同的开发环境(dev、test、uat…)的配置文件的重复。
- logback带来更多的filter。
- logback的stack trace中会包含详细的包信息。
- logback-access和Jetty、Tomcat集成提供了功能强大的HTTP-access日志。
配置文件:需要在项目的src目录下建立一个logback.xml。
(1)logback首先会试着查找logback.groovy文件;
(2)当没有找到时,继续试着查找logback-test.xml文件;
(3)当没有找到时,继续试着查找logback.xml文件;
(4)如果仍然没有找到,则使用默认配置(打印到控制台)。
使用:
spring boot 1.5以后默认已经使用logback作为日志,对应jar包为
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency>
参考链接:https://blog.csdn.net/xudan1010/article/details/52890102