Spring Boot配置log4j记录日志

Spring Boot配置log4j记录日志转载请注明出处 SpringBoot 配置 log4j 记录日志我们在老的项目框架 ssh springMVC 中都使用过 log4j 日志模块 例如 java 日志功能 log4j 模块的使用方法 SpringBoot 框架也能很好的快速集成 log4j 本篇文章记录如何在 SpringBoot 框架中使用 log4j 引入 log4j 依赖在创建 SpringBoot 工程时 我们引入了 spring boot st

转载请注明出处:Spring Boot配置log4j记录日志

我们在老的项目框架ssh,springMVC中都使用过log4j日志模块。

例如:java日志功能log4j模块的使用方法

Spring Boot框架也能很好的快速集成log4j,本篇文章记录如何在Spring Boot框架中使用log4j。

引入log4j依赖

在创建Spring Boot工程时,我们引入了spring-boot-starter,其中包含了spring-boot-starter-logging,该依赖内容就是Spring Boot默认的日志框架Logback,所以我们在引入log4j之前,需要先排除该包的依赖,再引入log4j的依赖。

区别在于需要引入的包

<artifactId>spring-boot-starter-log4j</artifactId> 

<artifactId>spring-boot-starter-log4j2</artifactId> 

Spring Boot 1.3.x和1.3.x以下版本的pom文件如下:

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j</artifactId> </dependency> 

Spring Boot 1.3.x以上版本的pom文件如下:

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency> 

如果找不到

 <artifactId>spring-boot-starter</artifactId> 

则查找

<artifactId>spring-boot-starter-web</artifactId> 

因为log4j2对于log4j来说有很多变动,如果不喜欢用log4j2,1.3.x版本以上的spring boot框架也可以引入以下两个包使用log4j。

<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> 

本文以Spring Boot1.5 和 log4j2的版本为例。

代码中打印日志

使用方式非常简单

log4j2静态加载配置文件

如下:

package com.biologic.api.service.impl; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.core.config.ConfigurationSource; import org.apache.logging.log4j.core.config.Configurator; import org.springframework.stereotype.Service; import com.biologic.api.service.LogService; @Service public class LogServiceImpl implements LogService { public static void main(String[] args) throws IOException { File file = new File("F:/eclipseworkspace/platform/report-api/src/main/resources/log4j.xml"); BufferedInputStream in = new BufferedInputStream(new FileInputStream(file)); final ConfigurationSource source = new ConfigurationSource(in); Configurator.initialize(null, source); Logger logger = LogManager.getLogger(LogManager.ROOT_LOGGER_NAME); logger.debug("统计异常池数量异常,异常信息如下:e.getStackTrace().toString()"); logger.error("统计异常池数量异常,异常信息如下:e.getStackTrace().toString()"); logger.info("统计异常池数量异常,异常信息如下:e.getStackTrace().toString()"); } } 

静态加载多用于测试环境调整输出的格式。

Spring Boot框架中使用log4j2

import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @RestController public class SampleController { Logger logger = LogManager.getLogger(LogManager.ROOT_LOGGER_NAME); @GetMapping(value = "/sample/testlog") @ResponseBody Object testlog() { logger.info("统计异常池数量异常,异常信息如下:e.getStackTrace().toString()"); return "ok"; } } 

至于日志输出到什么地方,则需要看我们的配置。

配置log4j2.xml

在引入了log4j依赖之后,只需要在src/main/resources目录下加入log4j-spring.properties配置文件,就可以开始对应用的日志进行配置使用。

注意:Spring Boot官方推荐优先使用带有-spring的文件名作为你的日志配置(如使用log4j-spring.properties,而不是log4j.properties,不过取名为log4j.properties也是没有问题的)

但是 log4j2版本则需要注意,只能使用非properties文件进行配置,xml或者yml,或者Json。

更多配置文件格式相关参考:https://logging.apache.org/log4j/2.x/manual/configuration.html

在application.properties中指定特定配置文件

logging.config=classpath:log4j2.xml 

配置输出日志到控制台

通过如下配置,设定root日志的输出级别为INFO,appender为控制台输出stdout

LOG4J根配置

log4j.rootCategory=INFO, stdout 

其中INFO是日志输出级别,共有5级:

FATAL 0 ERROR 3 WARN 4 INFO 6 DEBUG 7 

控制台输出log4j-spring.properties格式配置

log4j.appender.stdout = org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target = System.out log4j.appender.stdout.layout = org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L - %m%n 

对应的xml格式如下:

<?xml version="1.0" encoding="UTF-8"?> <Configuration status="INFO"> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L - %m%n"/> </Console> </Appenders> <Loggers> <Root level="info"> <AppenderRef ref="Console"/> </Root> </Loggers> </Configuration> 

更多配置文件格式相关参考:https://logging.apache.org/log4j/2.x/manual/configuration.html

Layout:日志输出格式,Log4j提供的layout有以下几种:

org.apache.log4j.HTMLLayout(以HTML表格形式布局), org.apache.log4j.PatternLayout(可以灵活地指定布局模式), org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串), org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息) 

打印参数: Log4J采用类似C语言中的printf函数的打印格式格式化日志信息,如下:

   %m   输出代码中指定的消息   %p   输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL    %r   输出自应用启动到输出该log信息耗费的毫秒数    %c   输出所属的类目,通常就是所在类的全名    %t   输出产生该日志事件的线程名    %n   输出一个回车换行符,Windows平台为“/r/n”,Unix平台为“/n”    %d   输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss ,SSS},输出类似:2002年10月18日  22 : 10 : 28 , 921     %l   输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java: 10 )  

log4j.appender.A1.layout.ConversionPattern=%-4r %-5p %d{yyyy-MM-dd HH:mm:ssS} %c %m%n

日志信息格式中几个符号所代表的含义:

 -X号: X信息输出时左对齐;  %p: 输出日志信息优先级,即DEBUG,INFO,WARN,ERROR,FATAL,  %d: 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921  %r: 输出自应用启动到输出该log信息耗费的毫秒数  %c: 输出日志信息所属的类目,通常就是所在类的全名  %t: 输出产生该日志事件的线程名  %l: 输出日志事件的发生位置,相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main (TestLog4.java:10)  %x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。  %%: 输出一个"%"字符  %F: 输出日志消息产生时所在的文件名称  %L: 输出代码中的行号  %m: 输出代码中指定的消息,产生的日志具体信息  %n: 输出一个回车换行符,Windows平台为"/r/n",Unix平台为"/n"输出日志信息换行  可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。如:  1)%20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,默认的情况下右对齐。  2)%-20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,"-"号指定左对齐。  3)%.30c:指定输出category的名称,最大的宽度是30,如果category的名称大于30的话,就会将左边多出的字符截掉,但小于30的话也不会有空格。  4)%20.30c:如果category的名称小于20就补空格,并且右对齐,如果其名称长于30字符,就从左边较远输出的字符截掉。 

配置输出日志到文件log4j-spring.properties格式配置

在开发环境,我们只是输出到控制台没有问题,但是到了生产或测试环境,或许持久化日志内容,方便追溯问题原因。可以通过添加如下的appender内容,按天输出到不同的文件中去,同时还需要为log4j.rootCategory添加名为file的appender,这样root日志就可以输出到logs/all.log文件中了。

LOG4J配置

log4j.rootCategory=INFO, stdout, file 

输出到文件

log4j.appender.file=org.apache.log4j.DailyRollingFileAppender log4j.appender.file.file=logs/all.log log4j.appender.file.DatePattern='.'yyyy-MM-dd log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L - %m%n 

Appender 为日志输出目的地,Log4j提供的appender有以下几种:

org.apache.log4j.ConsoleAppender(控制台), org.apache.log4j.FileAppender(文件), org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件), org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件), org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方) 

配置日志分类输出log4j-spring.properties格式配置

当我们日志量较多的时候,查找问题会非常困难,常用的手段就是对日志进行分类,比如:

例子一:

可以按不同package进行输出。通过定义输出到logs/my.log的appender,并对com.test包下的日志级别设定为DEBUG级别、appender设置为输出到logs/my.log的名为test的appender。

# com.test包下的日志配置 log4j.category.com.test=DEBUG, testfile # com.test下的日志输出 log4j.appender.testfile=org.apache.log4j.DailyRollingFileAppender log4j.appender.testfile.file=logs/my.log log4j.appender.testfile.DatePattern='.'yyyy-MM-dd log4j.appender.testfile.layout=org.apache.log4j.PatternLayout log4j.appender.testfile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L ---- %m%n 可以对不同级别进行分类,比如对ERROR级别输出到特定的日志文件中,具体配置可以如下。 log4j.logger.error=errorfile # error日志输出 log4j.appender.errorfile=org.apache.log4j.DailyRollingFileAppender log4j.appender.errorfile.file=logs/error.log log4j.appender.errorfile.DatePattern='.'yyyy-MM-dd log4j.appender.errorfile.Threshold = ERROR log4j.appender.errorfile.layout=org.apache.log4j.PatternLayout log4j.appender.errorfile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L - %m%n 

例子二:

  set log levels  log4j.rootLogger = debug ,  stdout ,  D ,  E  输出到控制台  log4j.appender.stdout = org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target = System.out log4j.appender.stdout.layout = org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern =  %d{ABSOLUTE} %5p %c{ 1 }:%L - %m%n  输出到日志文件  log4j.appender.D = org.apache.log4j.DailyRollingFileAppender log4j.appender.D.File = logs/log.log log4j.appender.D.Append = true log4j.appender.D.Threshold = DEBUG  输出DEBUG级别以上的日志 log4j.appender.D.layout = org.apache.log4j.PatternLayout log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n  保存异常信息到单独文件  log4j.appender.E = org.apache.log4j.DailyRollingFileAppender log4j.appender.E.File = logs/error.log  异常日志文件名 log4j.appender.E.Append = true log4j.appender.E.Threshold = ERROR  只输出ERROR级别以上的日志!!! log4j.appender.E.layout = org.apache.log4j.PatternLayout log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n 

配置日志输出到数据库log4j-spring.properties格式配置

将日志文件输出到数据库配置:

LOG4J配置

log4j.rootCategory=INFO,stdout,jdbc 

数据库输出

log4j.appender.jdbc=org.apache.log4j.jdbc.JDBCAppender log4j.appender.jdbc.driver=com.mysql.jdbc.Driver log4j.appender.jdbc.URL=jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=true log4j.appender.jdbc.user=root log4j.appender.jdbc.password=root log4j.appender.jdbc.sql=insert into log_icecoldmonitor(level,category,thread,time,location,note) values('%p','%c','%t','%d{yyyy-MM-dd HH:mm:ss:SSS}','%l','%m') 

引入数据库驱动:

<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> 

创建表:

CREATE TABLE `log_icecoldmonitor` ( `Id` int(11) NOT NULL AUTO_INCREMENT, `level` varchar(255) NOT NULL DEFAULT '' COMMENT '优先级', `category` varchar(255) NOT NULL DEFAULT '' COMMENT '类目', `thread` varchar(255) NOT NULL DEFAULT '' COMMENT '进程', `time` varchar(30) NOT NULL DEFAULT '' COMMENT '时间', `location` varchar(255) NOT NULL DEFAULT '' COMMENT '位置', `note` text COMMENT '日志信息', PRIMARY KEY (`Id`) ) 
url=jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=true 

配置日志输出到邮件log4j-spring.properties格式配置

<!-- https://mvnrepository.com/artifact/com.sun.mail/javax.mail --> <dependency> <groupId>com.sun.mail</groupId> <artifactId>javax.mail</artifactId> <version>1.6.1</version> </dependency> <!-- https://mvnrepository.com/artifact/javax.activation/activation --> <dependency> <groupId>javax.activation</groupId> <artifactId>activation</artifactId> <version>1.1.1</version> </dependency> 

或者

<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-mail --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> <version>2.1.1.RELEASE</version> </dependency> 

写配置文件

 # 将日志发送到email  log4j.logger.MailLog=WARN,A5  #  APPENDER A5  log4j.appender.A5=org.apache.log4j.net.SMTPAppender  log4j.appender.A5.BufferSize=5  log4j.appender.A5.To=  log4j.appender.A5.From=  log4j.appender.A5.Subject=ErrorLog  log4j.appender.A5.SMTPHost=smtp.263.net  log4j.appender.A5.layout=org.apache.log4j.PatternLayout  log4j.appender.A5.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n 

调用代码:

 //把日志发送到mail  Logger logger3 = Logger.getLogger("MailLog");  logger3.warn("warn!!!");  logger3.error("error!!!");  logger3.fatal("fatal!!!"); 

本文主要介绍如何在spring boot中引入log4j,以及一些基础用法,对于更多log4j的用法,参考log4j官方网站

可能遇到的问题–SLF4J: Class path contains multiple SLF4J bindings.

报错如下:

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/F:/maven/repository/ch/qos/logback/logback-classic/1.1.11/logback-classic-1.1.11.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/F:/maven/repository/org/apache/logging/log4j/log4j-slf4j-impl/2.7/log4j-slf4j-impl-2.7.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [ch.qos.logback.classic.util.ContextSelectorStaticBinder]

表现为配置的日志格式不生效。

 <!-- JPA Data (We are going to use Repositories, Entities, Hibernate, etc...) --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> 

可能遇到的问题 —[Fatal Error] :1:1: 前言中不允许有内容,ERROR StatusLogger Error parsing null

报错如下:

[Fatal Error] :1:1: 前言中不允许有内容。 ERROR StatusLogger Error parsing null org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; 前言中不允许有内容。 at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:257) at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:339) at org.apache.logging.log4j.core.config.xml.XmlConfiguration.<init>(XmlConfiguration.java:96) at org.apache.logging.log4j.core.config.xml.XmlConfigurationFactory.getConfiguration(XmlConfigurationFactory.java:46) at org.apache.logging.log4j.core.config.ConfigurationFactory$Factory.getConfiguration(ConfigurationFactory.java:540) at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:176) at org.apache.logging.log4j.core.config.Configurator.initialize(Configurator.java:85) at org.apache.logging.log4j.core.config.Configurator.initialize(Configurator.java:67) at com.biologic.api.service.impl.LogServiceImpl.main(LogServiceImpl.java:46) ERROR StatusLogger No logging configuration 

原因:log4j2里一般不建议使用properties文件,而是使用xml文件。

解决方法:把properties文件修改成xml文件格式。

转载请注明出处:Spring Boot配置log4j记录日志

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/231196.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号