文章目录
日志介绍
日志分类
- 调试日志
- 系统日志
作用
- 格式化日志输出
- 控制输出位置
- 日志优化:异步、归档压缩
- 日志系统维护
- 日志门面
日志框架
日志门面:
- JCL(Jakarta Commons Logging)
- slf4j(Simple Logging Facade for Java)
日志实现:
- JUL(Java Util Logging)
- logback
- log4j
- log4j2
JUL
硬编码
Logger logger = Logger.getLogger("LogTest.test");
// 硬编码
SimpleFormatter simpleFormatter = new SimpleFormatter();
ConsoleHandler consoleHandler = new ConsoleHandler();
consoleHandler.setFormatter(simpleFormatter);
FileHandler fileHandler = new FileHandler("jul.log");
fileHandler.setFormatter(simpleFormatter);
logger.addHandler(consoleHandler);
logger.addHandler(fileHandler);
logger.setLevel(Level.FINE);
logger.severe("severe msg");
logger.warning(":warning msg");
logger.info("info msg");
logger.config("config msg");
logger.fine("fine msg");
Logger对象父子关系
根据包名确定父子关系,顶级Logger为java.util.logging.LogManager$RootLogger
Logger logger = Logger.getLogger("com");
System.out.println(logger.getParent());
配置文件
String fname = System.getProperty("java.util.logging.config.file");
if (fname == null) {
fname = System.getProperty("java.home");
if (fname == null) {
throw new Error("Can't find java.home ??");
}
File f = new File(fname, "lib");
f = new File(f, "logging.properties");
fname = f.getCanonicalPath();
}
执行流程
Log4j
依赖
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
BasicConfigurator.configure();
Logger logger = Logger.getLogger(TestLog4j.class);
logger.fatal("fatal msg");
logger.error("error msg");
logger.warn("warn msg");
logger.info("info msg");
logger.debug("debug msg");
logger.trace("trace msg");
主要组件
- Loggers(控制日志级别)
- Appenders(输出方式)
- Layout(输出格式)
Appenders
- ConsoleAppender
- FileAppender
- DailyRollingFileAppender
- RollingFileAppender
- JDBCAppender
Layout
- HTMLLayot
- SimpleLayout
- PatternLayout
配置文件
log4j.properties
log4j.rootLogger = trace,console
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.layout = org.apache.log4j.SimpleLayout
JCL
依赖
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
Log log = LogFactory.getLog(JCLTest.class);
log.info("hello");
被淘汰:无法兼容新的日志框架
SLF4J
<!--slf4j的日志门面-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.26</version>
</dependency>
<!--slf4j的内置的简单实现-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.21</version>
</dependency>
简单入门
public static final Logger logger = LoggerFactory.getLogger(TestSLF4J.class);
@Test
public void test() {
logger.info("hello");
logger.info("参数:{}", "xxx");
logger.error("错误:", new Exception("error"));
}
日志绑定
桥接器(Briger)
同一个日志实现的适配器和桥接器不能同时出现,不然死循环
LogBack
依赖
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.26</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
Log4j2
依赖
<!--log4j2门面-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.11.1</version>
</dependency>
<!--log4j2实现-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.11.1</version>
</dependency>
Slf4j + Log4j2
<!--slf4j的日志门面-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.26</version>
</dependency>
<!--适配器-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.11.1</version>
</dependency>
<!--log4j2门面-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.11.1</version>
</dependency>
<!--log4j2实现-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.11.1</version>
</dependency>