现有的日志框架

JUL(java util logging)、logback、log4j、log4j2
JCL(Jakarta Commons Logging)、slf4j( Simple Logging Facade for Java)

日志门面

JCL、slf4j

日志实现

JUL、logback、log4j、log4j2

JUL

JUL全称Java util Logging是java原生的日志框架,使用时不需要另外引用第三方类库,相对其他日志框 架使用方便,学习简单,能够在小型应用中灵活使用。

jul中定义的日志级别

  1. * java.util.logging.Level中定义了日志的级别:
  2. SEVERE(最高值)
  3. WARNING
  4. INFO (默认级别)
  5. CONFIG
  6. FINE
  7. FINER
  8. FINEST(最低值)
  9. * 还有两个特殊的级别:
  10. OFF,可用来关闭日志记录。
  11. ALL,启用所有消息的日志记录。

log4j

1 maven 依赖

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.slf4j</groupId>
  4. <artifactId>slf4j-log4j12</artifactId>
  5. <version>1.7.36</version>
  6. </dependency>
  7. </dependencies>

简单Demo使用

给类创建一个静态属性,然后使用。

  1. public class TopK {
  2. static Logger logger = Logger.getLogger(TopK.class.getName());
  3. public static void main(String[] args) throws IOException, InterruptedException {
  4. logger.fatal("fatal"); // 严重错误,一般会造成系统崩溃和终止运行
  5. logger.error("error"); // 错误信息,但不会影响系统运行
  6. logger.warn("warn"); // 警告信息,可能会发生问题
  7. logger.info("info"); // 程序运行信息,数据库的连接、网络、IO操作等
  8. logger.debug("debug"); // 调试信息,一般在开发阶段使用,记录程序的变量、参数等
  9. logger.trace("trace"); // 追踪信息,记录程序的所有流程信息
  10. }
  11. }

一个简单配置文件 log4j.properties

  1. # 指定日志的输出级别 与输出端
  2. log4j.rootLogger = DEBUG,stdout,D,E
  3. # 控制台输出配置
  4. log4j.appender.stdout = org.apache.log4j.ConsoleAppender
  5. log4j.appender.stdout.Target = System.out
  6. log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
  7. log4j.appender.stdout.layout.ConversionPattern = %m%n
  8. # 文件输出配置
  9. log4j.appender.D = org.apache.log4j.FileAppender
  10. log4j.appender.D.File = src/main/java/log/output.log # 输出文件路径
  11. log4j.appender.D.Append = true # true 追加模式 false 覆盖模式
  12. log4j.appender.D.Threshold = INFO # 输出级别
  13. log4j.appender.D.layout = org.apache.log4j.PatternLayout
  14. log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
  15. # 每天一个日志文件输出
  16. log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
  17. log4j.appender.E.File =src/main/java/log/testInfo.log # 输出文件路径
  18. log4j.appender.E.Append = true # true 追加模式 false 覆盖模式
  19. log4j.appender.E.Threshold = ERROR # 输出级别
  20. log4j.appender.E.layout = org.apache.log4j.PatternLayout
  21. log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n

日志级别

logger.fatal(“fatal”); // 严重错误,一般会造成系统崩溃和终止运行
logger.error(“error”); // 错误信息,但不会影响系统运行
logger.warn(“warn”); // 警告信息,可能会发生问题
logger.info(“info”); // 程序运行信息,数据库的连接、网络、IO操作等
logger.debug(“debug”); // 调试信息,一般在开发阶段使用,记录程序的变量、参数等
logger.trace(“trace”); // 追踪信息,记录程序的所有流程信息
注:一般只使用4个级别,优先级从高到低为 ERROR > WARN > INFO > DEBUG

Log4j组件

Log4J 主要由 Loggers (日志记录器)、Appenders(输出端)和 Layout(日志格式化器)组成。
其中 Loggers 控制日志的输出级别与日志是否输出;Appenders 指定日志的输出方式(输出到控制台、文件 等);Layout 控制日志信息的输出格式。

Appenders

输出端类型 作用
ConsoleAppender 将日志输出到控制台
FileAppender 将日志输出到文件中
DailyRollingFileAppender 将日志输出到一个日志文件,并且每天输出到一个新的文件
RollingFileAppender 将日志信息输出到一个日志文件,并且指定文件的尺寸,当文件大 小达到指定尺寸时,会自动把文件改名,同时产生一个新的文件
JDBCAppender 把日志信息保存到数据库中

Layouts

布局器 Layouts用于控制日志输出内容的格式,让我们可以使用各种需要的格式输出日志。Log4j常用 的Layouts:

格式化器类型 作用
HTMLLayout 格式化日志输出为HTML表格形式
SimpleLayout 简单的日志输出格式化,打印的日志格式为(info - message)
PatternLayout 最强大的格式化期,可以根据自定义格式输出日志,如果没有指定转换格式, 就是用默认的转换格式

Layout的格式

在 log4j.properties 配置文件中,我们定义了日志输出级别与输出端,在输出端中分别配置日志的输出格式。

  1. * log4j 采用类似 C 语言的 printf 函数的打印格式格式化日志信息,具体的占位符及其含义如下:
  2. %m 输出代码中指定的日志信息
  3. %p 输出优先级,及 DEBUGINFO
  4. %n 换行符(Windows平台的换行符为 "\n"Unix 平台为 "\n"
  5. %r 输出自应用启动到输出该 log 信息耗费的毫秒数
  6. %c 输出打印语句所属的类的全名
  7. %t 输出产生该日志的线程全名
  8. %d 输出服务器当前时间,默认为 ISO8601,也可以指定格式,如:%d{yyyyMMdd HH:mm:ss}
  9. %l 输出日志时间发生的位置,包括类名、线程、及在代码中的行数。如:Test.main(Test.java:10)
  10. %F 输出日志消息产生时所在的文件名称
  11. %L 输出代码中的行号
  12. %% 输出一个 "%" 字符
  13. * 可以在 % 与字符之间加上修饰符来控制最小宽度、最大宽度和文本的对其方式。如:
  14. %5c 输出category名称,最小宽度是5category<5,默认的情况下右对齐
  15. %-5c 输出category名称,最小宽度是5category<5"-"号指定左对齐,会有空格
  16. %.5c 输出category名称,最大宽度是5category>5,就会将左边多出的字符截掉,<5不会有空格
  17. %20.30c category名称<20补空格,并且右对齐,>30字符,就从左边交远销出的字符截掉

Appender的输出

  1. #指定日志的输出级别与输出端
  2. log4j.rootLogger=INFO,Console
  3. # 控制台输出配置
  4. log4j.appender.Console=org.apache.log4j.ConsoleAppender
  5. log4j.appender.Console.layout=org.apache.log4j.PatternLayout
  6. log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
  7. # 文件输出配置
  8. log4j.appender.A = org.apache.log4j.DailyRollingFileAppender
  9. #指定日志的输出路径
  10. log4j.appender.A.File = D:/log.txt
  11. log4j.appender.A.Append = true
  12. #使用自定义日志格式化器
  13. log4j.appender.A.layout = org.apache.log4j.PatternLayout
  14. #指定日志的输出格式
  15. log4j.appender.A.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [%t:%r] -
  16. [%p] %m%n
  17. #指定日志的文件编码
  18. log4j.appender.A.encoding=UTF-8
  19. #mysql
  20. log4j.appender.logDB=org.apache.log4j.jdbc.JDBCAppender
  21. log4j.appender.logDB.layout=org.apache.log4j.PatternLayout
  22. log4j.appender.logDB.Driver=com.mysql.jdbc.Driver
  23. log4j.appender.logDB.URL=jdbc:mysql://localhost:3306/test
  24. log4j.appender.logDB.User=root
  25. log4j.appender.logDB.Password=root
  26. log4j.appender.logDB.Sql=INSERT INTO
  27. log(project_name,create_date,level,category,file_name,thread_name,line,all_categ
  28. ory,message) values('itcast','%d{yyyy-MM-dd
  29. HH:mm:ss}','%p','%c','%F','%t','%L','%l','%m')
  1. CREATE TABLE `log` (
  2. `log_id` int(11) NOT NULL AUTO_INCREMENT,
  3. `project_name` varchar(255) DEFAULT NULL COMMENT '目项名',
  4. `create_date` varchar(255) DEFAULT NULL COMMENT '创建时间',
  5. `level` varchar(255) DEFAULT NULL COMMENT '优先级',
  6. `category` varchar(255) DEFAULT NULL COMMENT '所在类的全名',
  7. `file_name` varchar(255) DEFAULT NULL COMMENT '输出日志消息产生时所在的文件名称 ',
  8. `thread_name` varchar(255) DEFAULT NULL COMMENT '日志事件的线程名',
  9. `line` varchar(255) DEFAULT NULL COMMENT '号行',
  10. `all_category` varchar(255) DEFAULT NULL COMMENT '日志事件的发生位置',
  11. `message` varchar(4000) DEFAULT NULL COMMENT '输出代码中指定的消息',
  12. PRIMARY KEY (`log_id`)
  13. );