日志接口

Java中实现日志的方式有很多种,常见的有 log4j、logback、jdk logging等,这些都是实现类,可以直接拿过来就能使用,但是每一种实现类的API都不一样,为了统一这些日志类,就产生了日志接口,常见的日志接口有两种,分别是 commongs-logging 和 slf4j(Simple Logging Facade for Java),上述的关系如下图所示:

java 在控制台输出日志 java代码日志输出配置_apache


通过上面的图,可以简单的理解关系:

  • logging和slf4j都是日志的接口,供用户使用,而没有提供实现
  • log4j,logback等等才是日志的真正实现
    所以在使用的时候,一般都是将日志接口和日志实现类结合使用,这样做有个好处,就是如果后面需要切换到其他的日志实现,就可以直接切换依赖,而代码依旧不用修改;
    从上面可以看出,接口+实现的组合是有很多种类的,但是常用的一般就是 commongs-logging + log4j / slf4j + log4j 下面主要讲述一下 commongs-logging + log4j组合

commongs-logging

Apache针对不同的语言平台为做了一系列日志工具包,可应用于java、.net、php、c++,这些日志包都是免费的,使用非常方便,可以极大提高编程效率。并且,Apache为了让众多的日志工具有一个相同操作方式,还实现做了一个通用日志工具包:commons-logging,也称Jakarta Commons Logging (JCL)。commons-logging是为那些需要建立在不同环境下使用不同日志架构的组件或库的开发者创建的,其中包括Apache Log4j以及Java log的日志架构。把日志信息commons-logging的Log接口,并由commons-logging在运行时决定使用哪种日志架构。现在,Apache通用日志工具commons-logging和Log4j已经成为Java日志的标准工具。

信息级别

 确保日志信息在内容上和反应问题的严重程度上的恰当,是非常重要的。log4j主要有如下的信息级别:

  • fatal:非常严重的错误,导致系统中止。期望这类信息能立即显示在状态控制台上。
  • error:其它运行期错误或不是预期的条件。期望这类信息能立即显示在状态控制台上。
  • warn:使用了不赞成使用的API、非常拙劣使用API, '几乎就是'错误, 其它运行时不合需要和不合预期的状态但还没必要称为 "错误"。期望这类信息能立即显示在状态控制台上。
  • info:运行时产生的有意义的事件。期望这类信息能立即显示在状态控制台上。
  • debug:系统流程中的细节信息。期望这类信息仅被写入log文件中。
  • trace:更加细节的信息。期望这类信息仅被写入log文件中。
    优先级从高到低分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关。比如在这里定义了INFO级别,则应用程序中所有DEBUG级别的日志信息将不被打印出来。程序会打印高于或等于所设置级别的日志,设置的日志等级越高,打印出来的日志就越少。如果设置级别为INFO,则优先级高于等于INFO级别(如:INFO、WARN、ERROR)的日志信息将可以被输出,小于该级别的如DEBUG将不会被输出。通常情况下,我们希望将info级别以上的日志信息输出到控制台,而warn级别以上的信息写入到log文件中,而error信息写入到一个单独的文件中去,下面我们的实例将会实现这样的功能。

maven配置日志

1.添加依赖

<dependencies>
    <dependency>
        <groupId>commons-logging</groupId>
        <artifactId>commons-logging</artifactId>
        <version>1.2</version>
    </dependency>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
  </dependency>
</dependencies>

2.添加配置文件log4j.properties

下面给出一个案例,仅供参考

### set log levels ###
log4j.rootLogger = info , info, database

### 输出输出 DEBUG 级别的日志到控制台 ###
log4j.appender.info = org.apache.log4j.ConsoleAppender
log4j.appender.info.Target = System.out
log4j.appender.info.Threshold = INFO
log4j.appender.info.layout = org.apache.log4j.PatternLayout
log4j.appender.info.layout.ConversionPattern = %d{ABSOLUTE} %5p %c{1}:%L - %m%n

# 将日志信息语句保存到数据库
log4j.appender.database = org.apache.log4j.jdbc.JDBCAppender
log4j.appender.database.URL = jdbc:mysql://localhost:3306/person_home_page?useSSL=false&characterEncoding=utf8&serverTimezone=UTC
log4j.appender.database.driver = com.mysql.cj.jdbc.Driver
log4j.appender.database.user=root
log4j.appender.database.password=123456
log4j.appender.database.sql=INSERT INTO tb_log4j (message) VALUES('=[%-5p] %d(%r) --> [%t] %l: %m %x %n')
log4j.appender.database.layout=org.apache.log4j.PatternLayout
log4j.appender.database.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n

3.解析配置文件



首先是第一条:log4j.rootLogger = info, info, database
除了第一个是默认的日志级别,必须按照规定填写之外,后面接续的单词可以随意取名,但一般希望是按照方便理解的单词,如上述的database,就意味着博主将生成的日志存储到数据库中,但到底将什么级别的日志存储到数据库,则需要看下面的配置了,具体可以参考上面博主的文章