目录
log4j的安全漏洞是大事件,早几个月项目上的都已经打完补丁,替换了包了。
简单记录下日志这块的使用。 目前jdk是java8及以上,要求log4j的版本必须是2.17.1。
看下pom依赖:
- <dependencies>
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-webartifactId>
- <exclusions>
- <exclusion>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-loggingartifactId>
- exclusion>
- exclusions>
- dependency>
-
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-testartifactId>
- <scope>testscope>
- dependency>
-
- <dependency>
- <groupId>org.apache.commonsgroupId>
- <artifactId>commons-lang3artifactId>
- <version>3.8.1version>
- dependency>
-
-
-
- <dependency>
- <groupId>org.apache.logging.log4jgroupId>
- <artifactId>log4j-apiartifactId>
- <version>2.17.1version>
- dependency>
- <dependency>
- <groupId>org.apache.logging.log4jgroupId>
- <artifactId>log4j-coreartifactId>
- <version>2.17.1version>
- dependency>
- <dependency>
- <groupId>org.apache.logging.log4jgroupId>
- <artifactId>log4j-julartifactId>
- <version>2.17.1version>
- dependency>
- <dependency>
- <groupId>org.apache.logging.log4jgroupId>
- <artifactId>log4j-slf4j-implartifactId>
- <version>2.17.1version>
- dependency>
- <dependency>
- <groupId>org.apache.logging.log4jgroupId>
- <artifactId>log4j-webartifactId>
- <version>2.17.1version>
- dependency>
- dependencies>
正常SpringBoot集成的时候,先在spring-boot-starter-web依赖中排除掉spring-boot-starter-logging的依赖,然后再引入spring-boot-starter-log4j2就能用了。但是这时候默认的log4j版本太低,我们需要自己引入所需要的版本, 按照如上的方式引入即可。
在贴一个常用的log4j2的配置,如下:
- <configuration status="INFO" monitorInterval="30">
- <Properties>
- <Property name="APP_NAME">nicc-unicom-file-listenerProperty>
- <Property name="LOG_PATTERN">%d{yyyy-MM-dd HH:mm:ss.SSS} |-%-5level [%thread] %c [%L] -| %msg%nProperty>
- <Property name="LOG_FILE_PATH">logsProperty>
- <property name="rolling_pattern">%d{yyyy-MM-dd}-%i.gzproperty>
- <property name="every_file_size">10MBproperty>
- Properties>
- <Appenders>
-
- <Console name="console" target="SYSTEM_OUT">
-
- <PatternLayout pattern="${LOG_PATTERN}"/>
- Console>
-
-
- <RollingFile name="fileInfoAppender" fileName="${LOG_FILE_PATH}/${APP_NAME}.log"
- filePattern="${LOG_FILE_PATH}/${APP_NAME}-%d{yyyy-MM-dd}-%i.log">
- <PatternLayout>
- <Pattern>${LOG_PATTERN}Pattern>
- PatternLayout>
- <Filters>
- Filters>
- <Policies>
- <SizeBasedTriggeringPolicy size="10MB" />
-
- <TimeBasedTriggeringPolicy interval="1" />
- Policies>
- <DefaultRolloverStrategy max="10"/>
- RollingFile>
-
-
- <RollingFile name="fileErrorAppender" fileName="${LOG_FILE_PATH}/${APP_NAME}-error.log"
- filePattern="${LOG_FILE_PATH}/${APP_NAME}-error-%d{yyyy-MM-dd}-%i.log">
- <PatternLayout>
- <Pattern>${LOG_PATTERN}Pattern>
- PatternLayout>
- <Filters>
- <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
- Filters>
- <Policies>
- <SizeBasedTriggeringPolicy size="10MB" />
-
- <TimeBasedTriggeringPolicy interval="1" />
- Policies>
- <DefaultRolloverStrategy max="10"/>
- RollingFile>
- Appenders>
-
- <Loggers>
- <logger name="com.jgsmart" level="INFO"/>
- <Root level="INFO">
- <AppenderRef ref="console"/>
- <AppenderRef ref="fileInfoAppender"/>
- <AppenderRef ref="fileErrorAppender"/>
- Root>
- Loggers>
- configuration>
SpringBoot工程和SpringMVC工程在指定外置log4j的配置项的时候是不同的。
正常情况下,log4j2.xml都是在resource目录下,打包成jar之后,不管jar对应的同级目录有没有log4j2.xml文件,他都是以jar包内的配置文件为主进行生效。SpringBoot类的项目可以在启动jar包的时候通过指定logging.file的方式来指定配置文件的位置。例如:
nohup java -Xms100m -Xmx100m -jar ../${name}-0.0.1-SNAPSHOT.jar -Dlogging.config=../config/log4j2.xml > ../logs/${name}.log & tail -f ../logs/${name}.log
或者
nohup java -Xms100m -Xmx100m -jar ../${name}-0.0.1-SNAPSHOT.jar --logging.config=../config/log4j2.xml > ../logs/${name}.log & tail -f ../logs/${name}.log
--】和【-D】的区别在于,前者其实等价于往Springboot的application.properties配置文件中添加了一个配置,后者是往系统变量中添加了一个值。 参考:Springboot 命令注入属性[--]&[-D] - 无心水 - 博客园
如果我们可以通过指定外置配置文件的话,其实可以直接通过 修改外置配置文件中的logging.config来指定绝对路径的日志配置文件
配置文件同理,可以通过指定-Dconfig.path来指定,如下:
nohup java -Xms100m -Xmx100m -jar nicc-0.0.1-SNAPSHOT.jar -Dlogging.config=../config/log4j2.xml -Dconfig.path=/../config/application.properties > ../logs/${name}.log & tail -f ../logs/${name}.log
SpringMVC是需要打成war包在tomcat中运行的,默认情况下我们可以通过在web.xml中配置log4j2.xml的指定位置,可以在web.xml中进行如下方式设置:
- <context-param>
- <param-name>log4jConfigurationparam-name>
- <param-value>classpath:log4j2.xmlparam-value>
- context-param>
- <context-param>
- <param-name>log4jRefreshIntervalparam-name>
- <param-value>60000param-value>
- context-param>
- <listener>
- <listener-class>org.apache.logging.log4j.web.Log4jServletContextListenerlistener-class>
- listener>
其中log4jConfiguration就是指定配置文件的路径,可以写成绝对路径,也可以写成classpath下的某个路径。
这种方式有一定弊端,那就是web.xml最终还是会被打到war包中,我们无法动态的在war启动之前就指定log4j2.xml配置文件的位置。
如何动态指定呢? SpringMVC使用maven配置SLF4J和Log4J2_newcih的博客-CSDN博客
可以通过设置一个系统变量来直接指定,可以修改tomcat的catalin.sh文件,添加一行注入系统变量的命令,如下:
declare -x CATALINA_OPTS="-Dlog4j.configurationFile=D:\vm\log4j2.xml"
也可以指定多个配置项,如下:
declare -x CATALINA_OPTS="-Dconfig.path='/app/api-gateway/config/default.properties' -Dlog4j.configurationFile=/app/api-gateway/config/log4j2.xml"
重点就是:log4j.configurationFile的指定,注意如果在web.xml里进行如上的配置,再通过-Dlog4j.configurationFile指定,后者不会生效。所以如果使用-Dlog4j.configurationFile方式动态指定,就不要再web.xml文件中配置。
- #!/bin/bash
- pid=`ps -ef |grep cmo-0.0.1-SNAPSHOT.jar |grep -v grep|grep -v startup.sh|awk '{ print $2 }'`
- sleep 3
- echo "be stoping"
- if [ "$pid" = "" ]
- then
- echo "not running"
- else
- kill -9 $pid
- fi
- echo "start running..."
- cd /app/ars-api
- nohup java -Dlogging.config=/app/ars-api/config/log4j2.xml -Dconfig.path=/app/ars-api/config/application.properties -jar cmo-asr.jar > /dev/null 2>&1 &
-
-
- echo "has started!!"