在SpringBoot + Log4j2 + Maven中方便地记录日志

您好,亲爱的哈布罗维特。


本文中介绍的材料是供初学者使用的,可能会为我节省一些在StackOverFlow和其他站点上进行搜索的时间,以便获得一个方便的日志记录系统,该系统本身将了解在哪里进行日志记录-到控制台,文件或logstash。


在项目开始时,总是需要正确配置日志记录,而在本地环境中,为了方便调试,日志应该显示在控制台和文件中,以方便调试,并且非常不希望将日志输出到远程服务器上的控制台,而应该将日志写入文件中, logstash或数据库中。 而且,如果您在本地和远程Linux机器上都装有Windows,则此日志文件的位置地址也不同。


因此,在许多情况下,您需要根据外部情况不断用手校正日志系统的配置。


我已经厌倦了不断地对附加程序进行记忆和评论,并开发了一种配置Log4j2的方法,以便根据所选的Maven配置文件,仅自动打开正确的附加程序。


以下是使用Spring Boot + Maven + Log4j2设置项目的说明,其结果将是配置的日志记录系统和两个附加程序:CONSOLE和SOCKET。


首先,我们将对Maven配置(pom.xml)进行更改:
在整个pom.xml级别的变量中,添加logstash-appender的主机地址:


<properties> <logstash.host>logstashcsm.example.ru</logstash.host> </properties> 

添加工作所需的依赖项:


 <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</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> </dependencies> 

请注意,我们从spring-boot-starter-web中排除了spring-boot-starter-logging依赖项。


设置Maven配置文件以动态管理连接的附加程序。 在每个概要文件的级别,我们设置变量logstash.port, logger.console.tresholdFilter, logger.socket.tresholdFilter


 <profiles> <profile> <id>local</id> <properties> <logstash.port>10000</logstash.port> <logger.console.tresholdFilter>ALL</logger.console.tresholdFilter> <logger.socket.tresholdFilter>OFF</logger.socket.tresholdFilter> </properties> </profile> <profile> <id>dev</id> <properties> <logstash.port>10001</logstash.port> <logger.console.tresholdFilter>OFF</logger.console.tresholdFilter> <logger.socket.tresholdFilter>ALL</logger.socket.tresholdFilter> </properties> </profile> </profiles> 

logstash.port-日志应发送到的端口。
logger.console.tresholdFilter-该值设置控制台上显示的日志的过滤级别。 在我们的例子中,ALL表示所有级别的日志记录都将显示在控制台附加程序中。
logger.socket.tresholdFilter-该值设置发送到logstash的日志的过滤级别。 OFF(关闭)-表示没有发送到该附加程序的记录通过。


现在,我们需要更改application.properties,以便从Log4j2.xml文件中可以访问pom.xml中指定的变量的值:


logstash.host=@logstash.host@
logstash.port=@logstash.port@
logger.console.tresholdFilter=@logger.console.tresholdFilter@
logger.socket.tresholdFilter=@logger.socket.tresholdFilter@


最后,我们在log4j2.xml文件中配置Log4j2本身的配置:


 <?xml version="1.0" encoding="UTF-8"?> <Configuration> <Properties> <Property name="socket.host">${bundle:application:logstash.host}</Property> <Property name="socket.port">${bundle:application:logstash.port}</Property> <Property name="console.thresholdFilter">${bundle:application:logger.console.tresholdFilter}</Property> <Property name="socket.thresholdFilter">${bundle:application:logger.socket.tresholdFilter}</Property> </Properties> <Appenders> <Console name="CONSOLE" target="SYSTEM_OUT"> <ThresholdFilter level="${console.thresholdFilter}"/> <PatternLayout pattern="%d %-5p [%t] %c{10} - %m%n"/> </Console> <Socket name="SOCKET" host="${socket.host}" port="${socket.port}" immediateFlush="true"> <ThresholdFilter level="${socket.thresholdFilter}"/> <JSONLayout eventEol="true" compact="true"/> </Socket> <Async name="ASYNC"> <AppenderRef ref="CONSOLE"/> <AppenderRef ref="SOCKET"/> </Async> </Appenders> <Loggers> <Logger name="ru.example" level="debug" additivity="false"> <AppenderRef ref="ASYNC"/> </Logger> <Root level="error"> <AppenderRef ref="ASYNC"/> </Root> </Loggers> </Configuration> 

现在,要在您的班级中调用记录器,您需要创建一个实例:


 private static Logger logger = LoggerFactory.getLogger(YourClass.class); 

然后转向他:


 logger.info("   "); 

仅此而已。 现在,考虑到项目中处于活动状态的Maven概要文件,将可以进行日志记录。
请注意,在log4j2.xml文件的清单中, ru.example两个记录器ru.exampleroot ,它们具有不同级别的事件记录。 第一个将处理ru.example.*的类所生成的所有事件ru.example.*打包并ru.example.* DEBUG级别中的所有内容,并且root记录器将记录绝对所有类的事件,但会记录ERROR级别的事件。
在这种情况下,为防止条目在日志中重复,将使用additivity="false"设置。

Source: https://habr.com/ru/post/zh-CN413091/


All Articles