一、日志的作用
开发调试:开发过程中,进行逻辑跟踪、结果查看
问题排查:辅助排查和定位线上问题,优化程序运行性能
状态监控:监控系统的运行状态、检测非授权的操作
数据分析:日志中包含大量的用户数据,包含点击行为,兴趣偏好等,对公司下一步战略方向有一定的指导作用
二、Java日志处理的发展史
- 最原始:System.out、System.err
- JUL(Java Util Logging):JDK自带的日志框架,在java.util.logging包下,API不完善、对开发者不友好,很少人使用
- Log4j(Log For Java) :由Apache组织推出。1.x版本于2015年8月5日宣布停止维护
- JCL(Jakarta Commons Logging):由Apache组织推出的日志门面接口,提供一套API来实现不同Logger之间的切换
- SLF4J(Simple Logging Facade For Java):由Log4j作者开发的日志门面接口,比JCL更优秀更好用
- Logback:由Log4j作者开发,比Log4j 1.x性能高很多,实现了SLF4J
- Log4j2:由Apache组织推出的,Log4j 1.x的重大升级改进版,改进了Logback的一些问题,既是门面接口,又是日志实现
三、门面接口和日志实现
- 门面接口:JCL、SLF4J、Log4j2
- 日志实现:JUL、Log4j 1.x、Logback、Log4j2
四、日志的几大实现方式
- Log4j 1.x (实现)
- JCL(门面) + Log4j 1.x(实现)
- SLF4J(门面)
- Log4j 1.x(实现)
- Logback(实现) + SpringBoot
- Log4j 2.x(实现)+ SpingBoot
- Log4j 2.x(门面)+ Log4j 2.x(实现)
1、 Log4j 1.x (实现)
配置如下:
- 配置文件中properties中的配置如下:
# 全局配置 #log4j.rootLogger=TRACE, console # 定义子Logger log4j.logger.com.mj.main=WARN, console log4j.logger.com.mj.test=ERROR, console1 # 子log的会继承父log的,导致结果会打印两遍 log4j.logger.com.mj.test.TestLog4j1_03=ERROR, console # 子log不再继承父log log4j.additivity.com.mj.test.TestLog4j1_03=false # Appender:输出目标(比如控制台、文件) # log4j.appender.名称=Appender的类型 log4j.appender.console=org.apache.log4j.ConsoleAppender # Layout: 输出格式 log4j.appender.console.layout=org.apache.log4j.PatternLayout log4j.appender.console.encoding=UTF-8 log4j.appender.console.layout.conversionPattern=%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5p] [%t]: %m%n # 格式变化 log4j.appender.console1=org.apache.log4j.ConsoleAppender log4j.appender.console1.layout=org.apache.log4j.PatternLayout log4j.appender.console1.layout.conversionPattern=%d{HH:mm:ss.SSS} [%-5p] [%t]: %m%n # Layout: 输出格式 以xml的格式输出 log4j.appender.console2=org.apache.log4j.ConsoleAppender log4j.appender.console2.layout=org.apache.log4j.xml.XMLLayout # Layout: 输出格式 以html的格式输出 log4j.appender.console3=org.apache.log4j.ConsoleAppender log4j.appender.console3.layout=org.apache.log4j.HTMLLayout
测试类如下:
package com.mj; import org.apache.log4j.LogManager; import org.apache.log4j.Logger; public class TestLog4j1 { public static void main(String[] args) { Logger logger = LogManager.getLogger(TestLog4j1.class); logger.fatal("致命_FATAL"); logger.error("致命_ERROR"); logger.warn("致命_WARN"); logger.info("致命_INFO"); logger.debug("致命_DEBUG"); logger.trace("致命_TRACE"); } }
控制台打印如下:
文件输出如下:
# 全局配置 encoding=UTF-8 pattern=%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5p] [%t]: %m%n log4j.rootLogger=TRACE, dailyRollingFile # 输出到滚动文件(DailyRollingFileAppender) log4j.appender.dailyRollingFile=org.apache.log4j.DailyRollingFileAppender log4j.appender.dailyRollingFile.file=log4j.log #每分钟的日志放在一个文件 log4j.appender.dailyRollingFile.datePattern='.'yyyy-MM-dd-HH-mm log4j.appender.dailyRollingFile.layout=org.apache.log4j.PatternLayout log4j.appender.dailyRollingFile.encoding=${encoding} log4j.appender.dailyRollingFile.layout.conversionPattern=${pattern} # 输出到滚动文件(RollingFileAppender) log4j.appender.rollingFile=org.apache.log4j.RollingFileAppender # 最多10个文件 log4j.appender.rollingFile.maxBackupIndex=10 log4j.appender.rollingFile.maxFileSize=5KB log4j.appender.rollingFile.file=log4j.log log4j.appender.rollingFile.layout=org.apache.log4j.PatternLayout log4j.appender.rollingFile.encoding=${encoding} log4j.appender.rollingFile.layout.conversionPattern=${pattern} # 输出文件(FileAppender) log4j.appender.file=org.apache.log4j.FileAppender log4j.appender.file.file=log4j.log log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.encoding=${encoding} log4j.appender.file.layout.conversionPattern=${pattern} # Appender:输出目标(比如控制台、文件) log4j.appender.console=org.apache.log4j.ConsoleAppender log4j.appender.console.layout=org.apache.log4j.PatternLayout log4j.appender.console.encoding=${encoding} log4j.appender.console.layout.conversionPattern=${pattern}
同样这些配置也可以配置在log4.xml中如下:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE log4j:configuration PUBLIC "-//log4j/log4j Configuration//EN" "log4j.dtd"> <log4j:configuration> <!--log4j.appender.console--> <appender name="console" class="org.apache.log4j.ConsoleAppender"> <param name="encoding" value="UTF-8"/> <layout class="org.apache.log4j.PatternLayout"> <param name="conversionPattern" value="%d{HH:mm:ss.SSS} [%-5p] %c: %m%n "/> </layout> </appender> <!--log4j.appender.file--> <appender name="file" class="org.apache.log4j.FileAppender"> <param name="file" value="log4j.log"/> <param name="encoding" value="UTF-8"/> <layout class="org.apache.log4j.PatternLayout"> <param name="conversionPattern" value="%d{HH:mm:ss.SSS} [%-5p] %c: %m%n "/> </layout> </appender> <!--log4j.appender.rollingFile--> <appender name="rollingFile" class="org.apache.log4j.RollingFileAppender"> <param name="maxFileSize" value="10KB"/> <param name="maxBackupIndex" value="10"/> <param name="file" value="log4j.log"/> <param name="encoding" value="UTF-8"/> <layout class="org.apache.log4j.PatternLayout"> <param name="conversionPattern" value="%d{HH:mm:ss.SSS} [%-5p] %c: %m%n "/> </layout> </appender> <!--log4j.appender.dailyRollingFile--> <appender name="dailyRollingFile" class="org.apache.log4j.DailyRollingFileAppender"> <param name="datePattern" value="'.'yyyy-MM-dd-HH-mm-ss"/> <param name="file" value="log4j.log"/> <param name="encoding" value="UTF-8"/> <layout class="org.apache.log4j.PatternLayout"> <param name="conversionPattern" value="%d{HH:mm:ss.SSS} [%-5p] %c: %m%n "/> </layout> </appender> <logger name="com.mj.main" additivity="false"> <level value="INFO"/> <appender-ref ref="dailyRollingFile"/> </logger> <!--logger--> <root> <level value="TRACE"/> <appender-ref ref="console"/> <appender-ref ref="file"/> </root> </log4j:configuration>