• 关于log4j安全漏洞以及版本替换的记录


    目录

    pom依赖

    log4j2配置

    指定外置配置

    SpringBoot

    SpringMVC

    一个标准的startup.sh


    pom依赖

    log4j的安全漏洞是大事件,早几个月项目上的都已经打完补丁,替换了包了。 

    简单记录下日志这块的使用。 目前jdk是java8及以上,要求log4j的版本必须是2.17.1。

    看下pom依赖:

    1. <dependencies>
    2. <dependency>
    3. <groupId>org.springframework.bootgroupId>
    4. <artifactId>spring-boot-starter-webartifactId>
    5. <exclusions>
    6. <exclusion>
    7. <groupId>org.springframework.bootgroupId>
    8. <artifactId>spring-boot-starter-loggingartifactId>
    9. exclusion>
    10. exclusions>
    11. dependency>
    12. <dependency>
    13. <groupId>org.springframework.bootgroupId>
    14. <artifactId>spring-boot-starter-testartifactId>
    15. <scope>testscope>
    16. dependency>
    17. <dependency>
    18. <groupId>org.apache.commonsgroupId>
    19. <artifactId>commons-lang3artifactId>
    20. <version>3.8.1version>
    21. dependency>
    22. <dependency>
    23. <groupId>org.apache.logging.log4jgroupId>
    24. <artifactId>log4j-apiartifactId>
    25. <version>2.17.1version>
    26. dependency>
    27. <dependency>
    28. <groupId>org.apache.logging.log4jgroupId>
    29. <artifactId>log4j-coreartifactId>
    30. <version>2.17.1version>
    31. dependency>
    32. <dependency>
    33. <groupId>org.apache.logging.log4jgroupId>
    34. <artifactId>log4j-julartifactId>
    35. <version>2.17.1version>
    36. dependency>
    37. <dependency>
    38. <groupId>org.apache.logging.log4jgroupId>
    39. <artifactId>log4j-slf4j-implartifactId>
    40. <version>2.17.1version>
    41. dependency>
    42. <dependency>
    43. <groupId>org.apache.logging.log4jgroupId>
    44. <artifactId>log4j-webartifactId>
    45. <version>2.17.1version>
    46. dependency>
    47. dependencies>

    正常SpringBoot集成的时候,先在spring-boot-starter-web依赖中排除掉spring-boot-starter-logging的依赖,然后再引入spring-boot-starter-log4j2就能用了。但是这时候默认的log4j版本太低,我们需要自己引入所需要的版本, 按照如上的方式引入即可。 

    log4j2配置

    在贴一个常用的log4j2的配置,如下:

    1. <configuration status="INFO" monitorInterval="30">
    2. <Properties>
    3. <Property name="APP_NAME">nicc-unicom-file-listenerProperty>
    4. <Property name="LOG_PATTERN">%d{yyyy-MM-dd HH:mm:ss.SSS} |-%-5level [%thread] %c [%L] -| %msg%nProperty>
    5. <Property name="LOG_FILE_PATH">logsProperty>
    6. <property name="rolling_pattern">%d{yyyy-MM-dd}-%i.gzproperty>
    7. <property name="every_file_size">10MBproperty>
    8. Properties>
    9. <Appenders>
    10. <Console name="console" target="SYSTEM_OUT">
    11. <PatternLayout pattern="${LOG_PATTERN}"/>
    12. Console>
    13. <RollingFile name="fileInfoAppender" fileName="${LOG_FILE_PATH}/${APP_NAME}.log"
    14. filePattern="${LOG_FILE_PATH}/${APP_NAME}-%d{yyyy-MM-dd}-%i.log">
    15. <PatternLayout>
    16. <Pattern>${LOG_PATTERN}Pattern>
    17. PatternLayout>
    18. <Filters>
    19. Filters>
    20. <Policies>
    21. <SizeBasedTriggeringPolicy size="10MB" />
    22. <TimeBasedTriggeringPolicy interval="1" />
    23. Policies>
    24. <DefaultRolloverStrategy max="10"/>
    25. RollingFile>
    26. <RollingFile name="fileErrorAppender" fileName="${LOG_FILE_PATH}/${APP_NAME}-error.log"
    27. filePattern="${LOG_FILE_PATH}/${APP_NAME}-error-%d{yyyy-MM-dd}-%i.log">
    28. <PatternLayout>
    29. <Pattern>${LOG_PATTERN}Pattern>
    30. PatternLayout>
    31. <Filters>
    32. <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
    33. Filters>
    34. <Policies>
    35. <SizeBasedTriggeringPolicy size="10MB" />
    36. <TimeBasedTriggeringPolicy interval="1" />
    37. Policies>
    38. <DefaultRolloverStrategy max="10"/>
    39. RollingFile>
    40. Appenders>
    41. <Loggers>
    42. <logger name="com.jgsmart" level="INFO"/>
    43. <Root level="INFO">
    44. <AppenderRef ref="console"/>
    45. <AppenderRef ref="fileInfoAppender"/>
    46. <AppenderRef ref="fileErrorAppender"/>
    47. Root>
    48. Loggers>
    49. configuration>

    指定外置配置

    SpringBoot工程和SpringMVC工程在指定外置log4j的配置项的时候是不同的。 

    SpringBoot

    正常情况下,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

    SpringMVC是需要打成war包在tomcat中运行的,默认情况下我们可以通过在web.xml中配置log4j2.xml的指定位置,可以在web.xml中进行如下方式设置:

    1. <context-param>
    2. <param-name>log4jConfigurationparam-name>
    3. <param-value>classpath:log4j2.xmlparam-value>
    4. context-param>
    5. <context-param>
    6. <param-name>log4jRefreshIntervalparam-name>
    7. <param-value>60000param-value>
    8. context-param>
    9. <listener>
    10. <listener-class>org.apache.logging.log4j.web.Log4jServletContextListenerlistener-class>
    11. 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文件中配置。

    一个标准的startup.sh

    1. #!/bin/bash
    2. pid=`ps -ef |grep cmo-0.0.1-SNAPSHOT.jar |grep -v grep|grep -v startup.sh|awk '{ print $2 }'`
    3. sleep 3
    4. echo "be stoping"
    5. if [ "$pid" = "" ]
    6. then
    7. echo "not running"
    8. else
    9. kill -9 $pid
    10. fi
    11. echo "start running..."
    12. cd /app/ars-api
    13. 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 &
    14. echo "has started!!"

  • 相关阅读:
    KubeSphere 3.3.0 发布:全面拥抱 GitOps
    SAP初始界面无法输入事务代码的解决 -- 显示OK代码字段
    速卖通卖家如何抓住产品搜索权重
    详解Leetcode中关于malloc模拟开辟二维数组问题,涉及二维数组的题目所给函数中的各个参数的解读
    python3.8,torch1.10.2+cu113、torch-geometric 安装
    Java Web 8 HTTP&Tomcat&Servlet 8.3 Servlet
    spring 事务方式和事务传播
    代码随想录61——额外题目【数组】:1365有多少小于当前数字的数字、941有效的山脉数组、1207独一无二的出现次数
    TabLayout使用以及自定义tab标签
    安科瑞余压监控系统
  • 原文地址:https://blog.csdn.net/liangcha007/article/details/126036217