精华内容
下载资源
问答
  • log4j2
    千次阅读
    2021-12-17 16:42:43

    一、影响范围:

    Apache Log4j 2.x <= 2.15.0-rc1

    二、可能受影响的应用不限于以下内容:

    Spring-Boot-strater-log4j2

    Apache Struts2

    Apache Solr

    Apache Druid

    Apache Flink

    ElasticSearch

    Flume

    Dubbo

    Jedis

    Logstash

    Kafka

    Apache Storm

    三、解决办法:

    1、等待官方升级 log4j2 版本。

    2、自己升级 log4j2 版本至 >= 2.15.0,目前最新 2.16.0

    四、部分组件实施步骤:

    1、logstash

    1.1、从 官网 下载新版 6.8.21 or 7.16.1,修复此问题。

    1.2、自己升级  log4j2 版本

    查找漏洞包

    find / -name "log4j-api*.jar"
    find / -name "log4j-api*.jar"

    根据包名替换为下载的新包

    [logstash核心类库更新]
    mv /opt/logstash/logstash-core/lib/jars/log4j-api-2.9.1.jar /opt/logstash/logstash-core/lib/jars/log4j-api-2.9.1.jar.bak
    mv /opt/logstash/logstash-core/lib/jars/log4j-core-2.9.1.jar /opt/logstash/logstash-core/lib/jars/log4j-core-2.9.1.jar.bak
    mv /opt/logstash/logstash-core/lib/jars/log4j-slf4j-impl-2.9.1.jar /opt/logstash/logstash-core/lib/jars/log4j-slf4j-impl-2.9.1.jar.bak
    cp /home/log4j/log4j-api-2.15.0.jar /opt/logstash/logstash-core/lib/jars/
    cp /home/log4j/log4j-core-2.15.0.jar /opt/logstash/logstash-core/lib/jars/
    cp /home/log4j/log4j-slf4j-impl-2.15.0.jar /opt/logstash/logstash-core/lib/jars/


    [logstash插件更新]
    -- logstash-input-kafka-8.0.6 修改运行类库
    mv /opt/logstash/vendor/bundle/jruby/2.3.0/gems/logstash-input-kafka-8.0.6/vendor/jar-dependencies/runtime-jars/log4j-api-2.8.2.jar /opt/logstash/vendor/bundle/jruby/2.3.0/gems/logstash-input-kafka-8.0.6/vendor/jar-dependencies/runtime-jars/log4j-api-2.8.2.jar.bak
    mv /opt/logstash/vendor/bundle/jruby/2.3.0/gems/logstash-input-kafka-8.0.6/vendor/jar-dependencies/runtime-jars/log4j-slf4j-impl-2.8.2.jar /opt/logstash/vendor/bundle/jruby/2.3.0/gems/logstash-input-kafka-8.0.6/vendor/jar-dependencies/runtime-jars/log4j-slf4j-impl-2.8.2.jar.bak
    cp /home/log4j/log4j-api-2.15.0.jar /opt/logstash/vendor/bundle/jruby/2.3.0/gems/logstash-input-kafka-8.0.6/vendor/jar-dependencies/runtime-jars/
    cp /home/log4j/log4j-slf4j-impl-2.15.0.jar /opt/logstash/vendor/bundle/jruby/2.3.0/gems/logstash-input-kafka-8.0.6/vendor/jar-dependencies/runtime-jars/

    -- logstash-input-kafka-8.0.6 修改依赖
    mv /opt/logstash/vendor/bundle/jruby/2.3.0/gems/logstash-input-kafka-8.0.6/lib/org/apache/logging/log4j/log4j-api/2.8.2/log4j-api-2.8.2.jar /opt/logstash/vendor/bundle/jruby/2.3.0/gems/logstash-input-kafka-8.0.6/lib/org/apache/logging/log4j/log4j-api/2.8.2/log4j-api-2.8.2.jar.bak

    -- logstash-input-beats-5.0.13-java 修改依赖(需要修改rb)
    mv /opt/logstash/vendor/bundle/jruby/2.3.0/gems/logstash-input-beats-5.0.13-java/vendor/jar-dependencies/org/apache/logging/log4j/log4j-api/2.6.2/log4j-api-2.6.2.jar /opt/logstash/vendor/bundle/jruby/2.3.0/gems/logstash-input-beats-5.0.13-java/vendor/jar-dependencies/org/apache/logging/log4j/log4j-api/2.6.2/log4j-api-2.6.2.jar.bak
    mkdir -p /opt/logstash/vendor/bundle/jruby/2.3.0/gems/logstash-input-beats-5.0.13-java/vendor/jar-dependencies/org/apache/logging/log4j/log4j-api/2.15.0/
    cp /home/log4j/log4j-api-2.15.0.jar /opt/logstash/vendor/bundle/jruby/2.3.0/gems/logstash-input-beats-5.0.13-java/vendor/jar-dependencies/org/apache/logging/log4j/log4j-api/2.15.0/
    vim /opt/logstash/vendor/bundle/jruby/2.3.0/gems/logstash-input-beats-5.0.13-java/lib/logstash-input-beats_jars.rb
    [log4j-api 2.6.2 版本改为 2.15.0]

    -- logstash-output-kafka-7.0.10 修改运行类库
    mv /opt/logstash/vendor/bundle/jruby/2.3.0/gems/logstash-output-kafka-7.0.10/vendor/jar-dependencies/runtime-jars/log4j-1.2-api-2.6.2.jar /opt/logstash/vendor/bundle/jruby/2.3.0/gems/logstash-output-kafka-7.0.10/vendor/jar-dependencies/runtime-jars/log4j-1.2-api-2.6.2.jar.bak
    mv /opt/logstash/vendor/bundle/jruby/2.3.0/gems/logstash-output-kafka-7.0.10/vendor/jar-dependencies/runtime-jars/log4j-api-2.6.2.jar /opt/logstash/vendor/bundle/jruby/2.3.0/gems/logstash-output-kafka-7.0.10/vendor/jar-dependencies/runtime-jars/log4j-api-2.6.2.jar.bak
    mv /opt/logstash/vendor/bundle/jruby/2.3.0/gems/logstash-output-kafka-7.0.10/vendor/jar-dependencies/runtime-jars/log4j-core-2.6.2.jar /opt/logstash/vendor/bundle/jruby/2.3.0/gems/logstash-output-kafka-7.0.10/vendor/jar-dependencies/runtime-jars/log4j-core-2.6.2.jar.bak
    cp /home/log4j/log4j-1.2-api-2.15.0.jar /opt/logstash/vendor/bundle/jruby/2.3.0/gems/logstash-output-kafka-7.0.10/vendor/jar-dependencies/runtime-jars/
    cp /home/log4j/log4j-api-2.15.0.jar /opt/logstash/vendor/bundle/jruby/2.3.0/gems/logstash-output-kafka-7.0.10/vendor/jar-dependencies/runtime-jars/
    cp /home/log4j/log4j-core-2.15.0.jar /opt/logstash/vendor/bundle/jruby/2.3.0/gems/logstash-output-kafka-7.0.10/vendor/jar-dependencies/runtime-jars/

    -- logstash-output-kafka-7.0.10 修改依赖
    mv /opt/logstash/vendor/bundle/jruby/2.3.0/gems/logstash-output-kafka-7.0.10/lib/org/apache/logging/log4j/log4j-api/2.6.2/log4j-api-2.6.2.jar /opt/logstash/vendor/bundle/jruby/2.3.0/gems/logstash-output-kafka-7.0.10/lib/org/apache/logging/log4j/log4j-api/2.6.2/log4j-api-2.6.2.jar.bak
    mv /opt/logstash/vendor/bundle/jruby/2.3.0/gems/logstash-output-kafka-7.0.10/lib/org/apache/logging/log4j/log4j-core/2.6.2/log4j-core-2.6.2.jar /opt/logstash/vendor/bundle/jruby/2.3.0/gems/logstash-output-kafka-7.0.10/lib/org/apache/logging/log4j/log4j-core/2.6.2/log4j-core-2.6.2.jar.bak

    说明:

    (1) 对于依赖类库,如果类库文件有被插件使用,则需要修改 [plugin-name]/lib/*.rb 文件,只需查看 rb 文件则可知道是否有被使用。

     (2)修改时,出了需要查找 log4j-core、log4j-api 文件,还需关注目录下是否存在相关版本的其他 log4j 包,如 log4j-slf4j-impl、log4j-1.2-api 等,如果版本号相同,也都要替换。

    2、storm

    [停止 storm Topology]

    mv $storm/lib/log4j-api-2.8.2.jar $storm/lib/log4j-api-2.8.2.jar.bak

    mv $storm/lib/log4j-core-2.8.2.jar $storm/lib/log4j-core-2.8.2.jar.bak

    mv $storm/lib/log4j-slf4j-impl-2.8.2.jar $storm/lib/log4j-slf4j-impl-2.8.2.jar.bak

    cp /home/log4j/log4j-api-2.15.0.jar $storm/lib/

    cp /home/log4j/log4j-core-2.15.0.jar $storm/lib/

    cp /home/log4j/log4j-slf4j-impl-2.15.0.jar $storm/lib/

    重启 storm server

    [提交 storm Topology]

    说明:

    (1)对于低版本 storm,如 v1.1.1,启动 nibus 时,会出现如下异常:

    Exception in thread "main" java.lang.NoSuchMethodError: com.lmax.disruptor.dsl.Disruptor.<init>(Lcom/lmax/disruptor/EventFactory;ILjava/util/concurrent/ThreadFactory;Lcom/lmax/disruptor/dsl/ProducerType;Lcom/lmax/disruptor/WaitStrategy;)V
     at org.apache.logging.log4j.core.async.AsyncLoggerDisruptor.start(AsyncLoggerDisruptor.java:108)
     at org.apache.logging.log4j.core.async.AsyncLoggerContext.start(AsyncLoggerContext.java:75)
     at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:155)
     at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:47)
     at org.apache.logging.log4j.LogManager.getContext(LogManager.java:196)

    对于这种问题,还需升级 disruptor 包

    mv $storm/lib/disruptor-3.3.2.jar $storm/lib/disruptor-3.3.2.jar.bak

    cp /home/logstash $storm/lib/

    3、elasticsearch

    mv $elasticsearch_home/lib/log4j-api-2.11.1.jar $elasticsearch_home/lib/log4j-api-2.11.1.jar.bak
    mv $elasticsearch_home/lib/log4j-core-2.11.1.jar $elasticsearch_home/lib/log4j-core-2.11.1.jar.bak
    cp /home/log4j/log4j-api-2.15.0.jar $elasticsearch_home/lib/
    cp /home/log4j/log4j-core-2.15.0.jar $elasticsearch_home/lib/

    mv $elasticsearch_home/modules/x-pack-core/log4j-1.2-api-2.11.1.jar $elasticsearch_home/modules/x-pack-core/log4j-1.2-api-2.11.1.jar.bak

    mv $elasticsearch_home/modules/x-pack-security/log4j-slf4j-impl-2.11.1.jar $elasticsearch_home/modules/x-pack-security/log4j-slf4j-impl-2.11.1.jar.bak

    cp /home/log4j/log4j-1.2-api-2.15.0.jar $elasticsearch_home/modules/x-pack-core/

    cp /home/log4j/log4j-slf4j-impl-2.15.0.jar $elasticsearch_home/modules/x-pack-security/

    [停止 sink es 业务]

    [重启 es server]

    [启动 sink es 业务]

    其他组件升级,后续更新...

    更多相关内容
  • log4j2相关jar包

    2016-09-20 15:02:13
    log4j2相关核心jar包,用于日志文件。大家有需要的可以下载。对于打印日志有需要的人,可以放心下载
  • springboot配置log4j2

    千次阅读 2022-02-15 15:53:59
    配置相应的log4j2.yml及application.yml文件3.编写相应的测试接口4.在postman中进行测试即可 部分内容参考: log4j2.yml配置的文章,很具体,可参考 一个log4j.xml配置的文章(可以参考) 1.引入相关的依赖 <...


    部分内容参考:
    log4j2.yml配置的文章,很具体,可参考
    一个log4j.xml配置的文章(可以参考)

    1.引入相关的依赖

    <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>
    
    
    <!-- 包含 mvc,aop 等jar资源 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <exclusions>
            <!-- 切换log4j2日志读取 -->
            <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-test</artifactId>
        <scope>test</scope>
    </dependency>
    
    <!-- 配置 log4j2 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-log4j2</artifactId>
    </dependency>
    <!-- 加上这个才能辨认到log4j2.yml文件 -->
    <dependency>
        <groupId>com.fasterxml.jackson.dataformat</groupId>
        <artifactId>jackson-dataformat-yaml</artifactId>
    </dependency>
    

    注意
    一定要注意项目中原本的依赖,可能会有冲突,因为使用log4j2依赖一定要排除原本项目中的log4j、logback相关依赖
    我就在此处一直报错,但是最后也不知道哪里错了。。

    如果一直报错,如下代码所示。就在右侧maven框中,将项目clean再install一下。

    SLF4J: Class path contains multiple SLF4J bindings.
    SLF4J: Found binding in [jar:file:/C:/Users/Zll/.m2/repository/ch/qos/logback/logback-classic/1.2.6/logback-classic-1.2.6.jar!/org/slf4j/impl/StaticLoggerBinder.class]
    SLF4J: Found binding in [jar:file:/C:/Users/Zll/.m2/repository/org/apache/logging/log4j/log4j-slf4j-impl/2.14.1/log4j-slf4j-impl-2.14.1.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]
    

    2.配置相应的log4j2.yml及application.yml文件

    log4j2.yml:
    注意log4j2的配置文件中的文件存储地址是由log.path的value值决定的。如果value值没有写具体哪个盘,就默认在当前项目路径中创建
    配置日志路径
    测试后在项目中生成对应的日志

    # 共有8个级别,按照从低到高为:ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF。
    
    Configuration:
      status: warn
      monitorInterval: 30
    
      Properties: # 定义全局变量
        Property: # 缺省配置(用于开发环境)。其他环境需要在VM参数中指定,如下:
          #测试:-Dlog.level.console=warn -Dlog.level.xjj=trace
          #生产:-Dlog.level.console=warn -Dlog.level.xjj=info
          - name: log.level.console
            value: info
          - name: log.path
            value: logs/${project.name}_log
          - name: project.name
            value: opendoc
          - name: log.pattern
            value: "%d{yyyy-MM-dd HH:mm:ss.SSS} -%5p ${PID:-} [%15.15t] %-30.30C{1.} : %m%n"
    
      Appenders:
        Console:  #输出到控制台
          name: CONSOLE
          target: SYSTEM_OUT
          PatternLayout:
            pattern: ${log.pattern}
        #   启动日志
        RollingFile:
          - name: ROLLING_FILE
            fileName: ${log.path}/${project.name}.log
            filePattern: "${log.path}/historyRunLog/$${date:yyyy-MM}/${project.name}-%d{yyyy-MM-dd}-%i.log.gz"
            PatternLayout:
              pattern: ${log.pattern}
            Filters:
              #        一定要先去除不接受的日志级别,然后获取需要接受的日志级别
              ThresholdFilter:
                - level: error
                  onMatch: DENY
                  onMismatch: NEUTRAL
                - level: info
                  onMatch: ACCEPT
                  onMismatch: DENY
            Policies:
              TimeBasedTriggeringPolicy:  # 按天分类
                modulate: true
                interval: 1
            DefaultRolloverStrategy:     # 文件最多100个
              max: 100
          #   平台日志
          - name: PLATFORM_ROLLING_FILE
            ignoreExceptions: false
            fileName: ${log.path}/platform/${project.name}_platform.log
            filePattern: "${log.path}/platform/$${date:yyyy-MM}/${project.name}-%d{yyyy-MM-dd}-%i.log.gz"
            PatternLayout:
              pattern: ${log.pattern}
            Policies:
              TimeBasedTriggeringPolicy:  # 按天分类
                modulate: true
                interval: 1
            DefaultRolloverStrategy:     # 文件最多100个
              max: 100
          #   业务日志
          - name: BUSSINESS_ROLLING_FILE
            ignoreExceptions: false
            fileName: ${log.path}/bussiness/${project.name}_bussiness.log
            filePattern: "${log.path}/bussiness/$${date:yyyy-MM}/${project.name}-%d{yyyy-MM-dd}-%i.log.gz"
            PatternLayout:
              pattern: ${log.pattern}
            Policies:
              TimeBasedTriggeringPolicy:  # 按天分类
                modulate: true
                interval: 1
            DefaultRolloverStrategy:     # 文件最多100个
              max: 100
          #   错误日志
          - name: EXCEPTION_ROLLING_FILE
            ignoreExceptions: false
            fileName: ${log.path}/exception/${project.name}_exception.log
            filePattern: "${log.path}/exception/$${date:yyyy-MM}/${project.name}-%d{yyyy-MM-dd}-%i.log.gz"
            ThresholdFilter:
              level: error
              onMatch: ACCEPT
              onMismatch: DENY
            PatternLayout:
              pattern: ${log.pattern}
            Policies:
              TimeBasedTriggeringPolicy:  # 按天分类
                modulate: true
                interval: 1
            DefaultRolloverStrategy:     # 文件最多100个
              max: 100
          #   DB 日志
          - name: DB_ROLLING_FILE
            ignoreExceptions: false
            fileName: ${log.path}/db/${project.name}_db.log
            filePattern: "${log.path}/db/$${date:yyyy-MM}/${project.name}-%d{yyyy-MM-dd}-%i.log.gz"
            PatternLayout:
              pattern: ${log.pattern}
            Policies:
              TimeBasedTriggeringPolicy:  # 按天分类
                modulate: true
                interval: 1
            DefaultRolloverStrategy:     # 文件最多100个
              max: 100
    
    
      Loggers:
        Root:
          level: info
          AppenderRef:
            - ref: CONSOLE
            - ref: ROLLING_FILE
            - ref: EXCEPTION_ROLLING_FILE
        Logger:
          - name: platform
            level: info
            additivity: false
            AppenderRef:
              - ref: CONSOLE
              - ref: PLATFORM_ROLLING_FILE
    
          - name: bussiness
            level: info
            additivity: false
            AppenderRef:
              - ref: BUSSINESS_ROLLING_FILE
    
          - name: exception
            level: debug
            additivity: true
            AppenderRef:
              - ref: EXCEPTION_ROLLING_FILE
    
          - name: db
            level: info
            additivity: false
            AppenderRef:
              - ref: DB_ROLLING_FILE
    
    
      #    监听具体包下面的日志
      #    Logger: # 为com.xjj包配置特殊的Log级别,方便调试
      #      - name: com.xjj
      #        additivity: false
      #        level: ${sys:log.level.xjj}
      #        AppenderRef:
      #          - ref: CONSOLE
      #          - ref: ROLLING_FILE
    

    application.xml:(注意将原本springboot文件中内置日志的相关配置清除)项目原本配置
    application.xml:

    logging:
      config: classpath:log4j2.yml
    

    3.编写相应的测试接口

    引入相应包:

    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    //定义logger:
    protected final Logger logger = LoggerFactory.getLogger(this.getClass());
    
    //在Controller中随便写个测试接口,使用第一种第二种都可
    //第一种,没有定义相应的配置工具类,简单使用
    @GetMapping(value="/test")
    	public String test(){
    		logger.debug("debug ****************************");
    		logger.info("info ****************************");
    		logger.warn("warn ****************************");
    		logger.error("error ****************************");
    		return "success";
    	}
    	
    	//第二种,定义了相应的log枚举类、工具类,具体可参见引用的文章,很具体。
    	@GetMapping("/helloworld")
    	public String helloworld() throws Exception{
    		Logger log = LogUtils.getExceptionLogger();
    		Logger log1 = LogUtils.getBussinessLogger();
    		Logger log2 = LogUtils.getDBLogger();
    		userService.findUsers(0,10,"");
    		log.error("getExceptionLogger===日志测试");
    		log1.info("getBussinessLogger===日志测试");
    		log2.debug("getDBLogger===日志测试");
    		return "helloworld";
    	}
    

    4.在postman中进行测试即可

    postman
    显示日志
    如图示即可。
    如果觉得代码不完整,参考相应的参考文章(更为具体)

    最后,感觉log4j2配置完以后看不到数据库表调用的SQL语句。(也可能我还没配置到)没有springboot内置的日志好,那个直接改为debug级别就可以显示sql及库表调用的情况。

    # 调试时使用
      Loggers:
        Root:
          level: info
          AppenderRef:
            - ref: CONSOLE
        Logger: #单独设置某些包的输出级别
          - name: com.thzh #复数加上-
            additivity: false #去除重复的log
            level: debug
            AppenderRef:
              - ref: CONSOLE #复数加上-
              - ref: ROLLING_FILE #复数加上-
    

    具体为什么这么配置不太清楚,慢慢学习。

    展开全文
  • log4j与log4j2性能对比及log4j升级至log4j2方案

    万次阅读 多人点赞 2019-06-16 11:03:53
    1.前言 之前某个服务在压测环境中出现了问题,分析之后得知是log4jLogger对象争用厉害,很多线程阻塞在此。...关于log4j与log4j2的性能对比文章有很多,本文不过多描述,给出几张结论图及原文链接,作为参考...

    1.前言

    • 之前某个服务在压测环境中出现了问题,分析之后得知是log4jLogger对象争用厉害,很多线程阻塞在此。

    • 以上问题证明log4j在高并发高QPS情况下,是存在性能问题的。

    • 之后把log4j升级成了log4j2,并采取异步日志模式,解决了因日志造成的性能问题。

    2.性能对比

    关于log4j与log4j2的性能对比文章有很多,本文不过多描述,给出几张结论图及原文链接,作为参考。

    1. Log4j1、Logback 以及 Log4j2 性能测试对

      在这里插入图片描述
      上述图片由原文作者【ksfzhaohui】提供,特此感谢!

    2. logback log4j log4j2 性能实测

      在这里插入图片描述
      上述图片由原文作者【专注服务端】提供,特此感谢!

    3. 高性能队列——Disruptor

      在这里插入图片描述
      上述图片由原文作者【宫铭】提供,特此感谢!

    3.相关知识

    • 和日志相关的概念有:log4j、log4j2、logback、commons-logging、slf4j
    • 其中,log4j、log4j2、logback、commons-logging都是日志的具体实现包。
    • 其中,slf4j是一个门面,一个适配器,所有的日志代码都可以用slf4j来写,它会根据项目具体依赖的日志实现包进行日志操作。
    • 通过slf4j写日志的好处是,当更换日志的实现方案时,无需修改日志代码,只需修改pom.xml即可。
    • 推荐:通过slf4j写日志。
    • 推荐:通过lombok的@Slf4j注解写日志。

    4.log4j升级至log4j2

    4.1.排除旧的日志实现包

    • 因为每个项目的pom.xml多种多样,所以无法总结统一的排除方案,这里只汇总需要排除的包。

    • 也就是说,如果你的项目里有以下包,应该排除。

    <exclusions>
        <!-- log4j 相关包 -->
        <exclusion>
            <artifactId>log4j</artifactId>
            <groupId>log4j</groupId>
        </exclusion>
        <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>log4j</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
        </exclusion>
        <!-- log4j 的springboot starter -->
        <exclusion>
            <artifactId>spring-boot-starter-log4j</artifactId>
            <groupId>org.springframework.boot</groupId>
        </exclusion>
     
        <!-- logback 相关包 -->
        <exclusion>
            <artifactId>logback-classic</artifactId>
            <groupId>ch.qos.logback</groupId>
        </exclusion>
        <exclusion>
            <artifactId>logback-core</artifactId>
            <groupId>ch.qos.logback</groupId>
        </exclusion>
     
        <!-- slf4j 相关包 -->
        <exclusion>
            <artifactId>slf4j-log4j12</artifactId>
            <groupId>org.slf4j</groupId>
        </exclusion>
         <exclusion>
            <artifactId>log4j-to-slf4j</artifactId>
            <groupId>org.apache.logging.log4j</groupId>
        </exclusion>
        <exclusion>
            <artifactId>slf4j-api</artifactId>
            <groupId>org.slf4j</groupId>
        </exclusion>
    </exclusions>
    

    4.2.增加log4j2的依赖包

    <!-- log4j2的api、core和web包 -->
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-api</artifactId>
        <version>2.11.1</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>2.11.1</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-web</artifactId>
        <version>2.11.1</version>
    </dependency>
    <!-- slf4j与log4j2的连接包 -->
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-slf4j-impl</artifactId>
        <version>2.11.1</version>
    </dependency>
    <!-- log4j与log4j2的连接包 -->
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-1.2-api</artifactId>
        <version>2.11.1</version>
    </dependency>
    <!-- log4j2支撑完全异步模式的关键api -->
    <dependency>
        <groupId>com.lmax</groupId>
        <artifactId>disruptor</artifactId>
        <version>3.4.2</version>
    </dependency>
    <!-- slf4j本身的api -->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
    </dependency>
    

    4.3.修复编译报错

    • 如果之前代码中日志都是直接通过log4j编写的,则可能需要修改import路径。
    • 在log4j版本,Logger的包路径是org.apache.log4j
    • 在log4j2版本,Logger的包路径是org.apache.logging.log4j

    4.4.替换日志配置文件

    • 在log4j版本,配置文件为log4j.xml或者log4j.properties。

    • 在log4j2版本,配置文件为log4j2.xml。

    • 在log4j2版本,支持三种异步方式:Sync(同步)、Async Appender(混合异步)和Loggers All Async(全异步),其性能优势依次递增。

    • 下面给出一份全异步的参考配置。

      <?xml version="1.0" encoding="UTF-8"?>
      <configuration status="error" monitorInterval="30">
          <Properties>
              <Property name="baseDir">log</Property>
          </Properties>
          <!--先定义所有的appender-->
          <appenders>
              <!--这个输出控制台的配置-->
              <Console name="Console" target="SYSTEM_OUT">
                  <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
                  <ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
                  <PatternLayout pattern="%d %5p %c:%L - %m %throwable{}%n"/>
              </Console>
              <!--异步日志配置,指向配置引用AppenderRef-->
              <Async name="ASYNC" bufferSize="262144" includeLocation="true">
                  <AppenderRef ref="RollingFile"/>
              </Async>
              <!--日志文件配置,filePattern为日志文件名称的格式-->
              <RollingFile name="RollingFile" fileName="${baseDir}/info.log" filePattern="${baseDir}/info.log.%d{yyyy-MM-dd}">
                  <!--日志内容格式-->
                  <PatternLayout pattern="%d %5p %c:%L - %m %throwable{separator( --> )}%n"/>
                  <!--依据时间创建新的日志文件:1d-->
                  <TimeBasedTriggeringPolicy interval="1"/>
                  <DefaultRolloverStrategy>
                      <!-- 在轮转时,删除7天之前的,命名符合规则的文件 -->
                      <Delete basePath="${baseDir}">
                          <IfFileName glob="info.log.*"/>
                          <IfLastModified age="7d"/>
                      </Delete>
                  </DefaultRolloverStrategy>
              </RollingFile>
          </appenders>
          <!--然后定义logger,只有定义了logger并引入的appender,appender才会生效-->
          <loggers>
              <root level="INFO">
                  <appender-ref ref="Console"/>
                  <appender-ref ref="RollingFile"/>
              </root>
              <!--这里配置 过滤日志 -->
              <logger name="org.hibernate.validator" level="ERROR"/>
          </loggers>
      </configuration>
      
    展开全文
  • ###一句话总结issue###如果你使用的是 Log4j 1.x、Logback 或者其他日志框架,这次就可以幸免于难。如果你使用Spring Boot`默认日志`,也是没有问题的,...如果单独依赖了log4j2日志,请强制使用最新版本`v2.17.1`。

    前言

    一句话总结issue:如果你使用的是 Log4j 1.x、Logback 或者其他日志框架,这次就可以幸免于难。如果你使用Spring Boot默认日志,也是没有问题的,因为默认是Commons Logging
    一句话修复solution:升级springboot到最新v2.5.8v2.6.2以及后续版本,确保安全;如果单独依赖了log4j2日志,请强制使用最新版本v2.17.1换切换其他日志系统或者追加参数-Dlog4j2.formatMsgNoLookups=true

    UPDATE:

    • 2021/12/14 09:30 新增RCA
    • 2021/12/14 22:00 加更:log4j2官方已推送中央仓库2.16.0版本
    • 2021/12/15 07:30 加更:ESET NOD32发布Apache Log4j漏洞解决方案,列举部分受影响的框架/平台
    • 2021/01/08 23:00 加更:APPDynamic的MachineAgent更新21.12.5,更新到log4j 2.17.1

    Reference:

    背调

    正如您在新闻中所看到的,针对流行的 Log4J2 库的新零日漏洞利用已被报道,该库可允许攻击者远程执行代码。 该漏洞已通过针对 log4j-core jar 的 CVE-2021-44228 报告,并已在 Log4J v2.15.0 中修复。
    在这里插入图片描述

    此漏洞由Lookup功能引发,Log4j在默认情况下会开启Lookup功能,提供给客户一种添加特殊值到日志中的方式。此功能中也包含了对JNDI的Lookup,但由于Lookup对加载的JNDI内容未做任何限制,使得攻击者可以通过JNDI注入实现远程加载恶意类到应用中,从而造成RCE
    在这里插入图片描述

    漏洞定位: log4j的真正漏洞代码出现在log4j-core的子组件。修复其他组件不一定能有效消除漏洞。很多产品都产生了误报的行为,但是为了安全起见,建议使用专业的分析平台或者强制升级比较稳妥,以绝后患

    在这里插入图片描述
    部分受影响框架

    目前受影响的Apache Log4j2版本:2.0 ≤ Apache Log4j <= 2.14.1

    可能的受影响应用包括但不限于如下:

    • Spring-Boot-strater-log4j2
    • Apache Struts2
    • Apache Solr
    • Apache Flink
    • Apache Druid
    • ElasticSearch
    • flume
    • dubbo
    • Redis
    • logstash
    • kafka

    Spring Boot 用户如何处理

    Spring Boot 用户只有在将默认日志系统切换到 Log4J2 时才会受到此漏洞的影响。 我们包含在 spring-boot-starter-logging 中的 log4j-to-slf4j 和 log4j-api jar 不能被单独利用。 只有使用 log4j-core 并在日志消息中包含用户输入的应用程序容易受到攻击。

    Spring Boot 即将发布的 v2.5.8 和 v2.6.2 版本(2021 年 12 月 23 日到期)将采用 Log4J v2.15.0,但由于这是一个如此严重的漏洞,您可能希望覆盖我们的依赖项管理并尽快升级您的 Log4J2 依赖项。

    Maven 处理log4j2指南

    对于 Maven 用户,您可以按照这些说明进行设置 log4j2.version 属性.

    <properties>
        <log4j2.version>2.17.1</log4j2.version>
    </properties>
    

    如何确认是否成功修复?运行 ./mvnw dependency:list | grep log4j检测版本是否为2.15.0.

    通过JVM参数处理漏洞

    如果程序/系统很难升级,则可以选择追加参数避免该漏洞。
    设置log4j2.formatMsgNoLookups系统参数为true即可
    例如

    java -Dlog4j2.formatMsgNoLookups=true -jar myapp.jar.

    设置系统环境变量解决

    将系统变量“LOG4J_FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS” 设置为 “true

    powered by zhengkai.blog.csdn.net

    设置log4j2.component.properties解决

    在项目 classpath 目录下添加 log4j2.component.properties 配置文件,设置 log4j2.formatMsgNoLookups=true

    如何查看框架的log4j版本

    可以通过maven仓库分解对应的log4j版本
    https://mvnrepository.com

    Jfinal与log4j漏洞有关吗

    例如Jfinal,可以通过maven仓库分解对应的log4j版本
    https://mvnrepository.com/artifact/com.jfinal/jfinal/4.1
    在这里插入图片描述
    拆解得知是1.2.16,安全!

    如果你使用最新版本4.9.7,也是安全的,因为用的还是1.2.x
    https://mvnrepository.com/artifact/com.jfinal/jfinal/4.9.17
    在这里插入图片描述

    spring-boot-starter-logging

    可以到 https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-logging/2.5.7

    例如你使用了spring-boot-starter-logging 2.5.7 ,包含了log4j的2.14.1版本,还是相当危险,最好等待官方发最新 2.5.8

    Spring-Boot-strater-log4j2更是绝对的危险,等候官方推送新版解决。

    在这里插入图片描述

    使用Scantist SCA检测及分析

    Scantist SCA平台 https://scantist.io , 来源

    为了解决开源软件的漏洞检测和管理的问题,Scantist SCA产品是一套完整的解决方案,同时支持源码和二进制扫描,通过提供对应用程序软件供应链的更大可视性,主动帮助企业管理开源库的安全性和合规性风险。Scantist SCA通过分析软件应用程序中已知的第三方库和组件的特殊签名,并与漏洞和许可证数据库进行交叉对比,以识别软件开发和部署阶段中的安全隐患。
    在这里插入图片描述
    分析报告
    在这里插入图片描述

    加更:Log4J 2.16.0修复版发布

    修复Log4J2 Vulnerability问题

    log4j 2.16.0 MVNREPOSITORY

    更新内容:

    • 删除了消息Lookups。目的是采取强化措施以防止 CVE-2021-44228,此举措不是修复 CVE-2021-44228所必须的。

    • 虽然版本 2.15.0 删除了处理Lookups和利用JNDI从日志消息和地址访问的问题,Log4j团队认为默认启用 JNDI 会引入未知的风险。从版本 2.16.0 开始,JNDI 功能是默认情况下禁用,可以通过 log4j2.enableJndi重新启用系统属性。在不受保护的上下文中使用 JNDI 是一个很大的问题 安全风险,应该在这个库和 所有其他使用 JNDI 的 Java 库。

    • 在 2.15.0 版本之前,Log4j 会在模式布局(Pattern Layout)中包含的消息或参数中自动解析 Lookups。这行为不再是默认值,必须通过指定启用%msg{lookup}。:

    修正错误

    • LOG4J2-3208:默认禁用 JNDI。需要 log4j2.enableJndi设置为 true 以允许 JNDI。 LOG4J2-3211:完全删除对消息查找的支持。

    • Apache Log4j 2.16.0 至少需要 Java 8 才能构建和运行。Log4j 2.12.1 是最后一个支持 Java 7 的版本。Java 7 不是Log4j 团队的长期支持版本。

    • 有关 Apache Log4j 2 的完整信息,包括有关如何提交错误报告、补丁或改进建议,请参阅 Apache Apache Log4j 2 网站:

    https://issues.apache.org/jira/browse/LOG4J2-2975

    https://logging.apache.org/log4j/2.x/download.html

    ESET快速响应模块检测拦截此漏洞:JAVA/Exploit.CVE-2021-44228

    ESET已经在全球范围内推动了组件更新,请确保“快速响应模块”已经更新到版本19417以上

    在这里插入图片描述
    在这里插入图片描述
    加更:AppDynamics报告与更新

    Security Advisory: Apache Log4j Vulnerability报告 https://docs.appdynamics.com/display/PAA/Security+Advisory%3A+Apache+Log4j+Vulnerability

    关于releasenote可以在这里看到https://docs.appdynamics.com/21.12/en/product-and-release-announcements/release-notes
    在这里插入图片描述

    其他情况

    欢迎讨论和补充!

    展开全文
  • log4j2 的使用【超详细图文】

    万次阅读 多人点赞 2020-12-06 16:11:03
    log4j2 的使用 Apache Log4j2 是对Log4j 的升级版本,参考了logback 的一些优秀的设计,并且修复了一些问题,因此带来了一些重大的提升,主要有: 异常处理,在logback中,Appender中的异常不会被应用感知到,但是...
  • springboot升级log4j2,解决漏洞问题

    千次阅读 2021-12-17 11:06:38
    最近log4j2爆出有重大漏洞问题,公司也紧急要求各个项目自己查验,要求将log4j的版本升到安全版本
  • 老生常谈Log4j和Log4j2的区别(推荐)

    千次阅读 2021-02-26 15:06:43
    相信很多程序猿朋友对log4j都很熟悉,log4j可以说是陪伴了绝大多数的朋友开启的编程。我不知道log4j之前是用什么,至少在我的生涯中,是log4j带我开启的日志时代。log4j是Apache的一个开源项目,我们不去考究它的...
  • log4j2的使用及配置详解

    千次阅读 2022-02-17 11:11:31
    众所周知,最近log4j被测出了漏洞,先是log4j2被测出了漏洞,漏洞影响范围为Log4j2.x <= 2.14.1;后来又被测出log4j1.X也有漏洞,范围为整个1.X版本。我们项目中,用的是log4j1.x。所以,结合以上两个漏洞,我们...
  • log4j2 pom中引入以下依赖 <dependency> <groupId>org.apache.skywalking</groupId> <artifactId>apm-toolkit-log4j-2.x</artifactId> <version>6.4.0</version> <...
  • Log4j2漏洞复现

    千次阅读 2022-08-12 15:24:19
    Apache Log4j2是 Apache软件基金会下的一个开源的基于 Java 的日志记录工具。Log4j2 是一个 Log4j 1.x 的重写,并且引入了大量丰富的特性。该日志框架被大量用于业务系统开发,用来记录日志信息。由于其优异的性能而...
  • spring引入log4j2日志框架

    千次阅读 2020-08-04 08:46:48
    log4j、slf4j、log4j2、logback之间的关系 相关配置说明 配置文件优先级 代码下载:https://gitee.com/hong99/spring/issues/I1N1DF 代码实现 项目代码结构(非spring纯log4j2) 简单配置文件(基于xml的简单...
  • 一直对Log4j2的配置文件没有一个全局的清晰认识,于是去查看了官网文档,对常用配置做了一些官网的翻译和理解,整体配置文档议自官网:http://logging.apache.org/log4j/2.x/manual/configuration.html。 目录 一...
  • Log4j2 重大漏洞与解决方案

    万次阅读 多人点赞 2021-12-13 15:31:33
    从12月10日(上周五)开始,朋友圈,各种论坛、公众号和群,都在讨论一个Log4j的漏洞,多少程序员半夜爬起来改代码,甚至威胁到了全球网络安全。为什么这个漏洞反应这么强烈呢?
  • Log4j2远程执行代码漏洞如何攻击? 又如何修复
  • 关于Log4j 1.x 升级Log4j 2.x 那些事

    千次阅读 2019-09-20 12:35:37
    log4j 1.x 升级log4j 2.x 踩坑攻略
  • 最新最全的Log4j2漏洞原理和最新解决方案 2021年12月9日,国内多家机构监测到Apache Log4j2存在任意代码执行漏洞,并紧急通报相关情况。由于Apache Log4j存在递归解析功能,未取得身份认证的用户,可以从远程...
  • Log4j2漏洞复现(CVE-2021-44228)

    万次阅读 2021-12-15 14:19:14
    Apache Log4j2存在远程代码执行漏洞,攻击者可利用该漏洞向目标服务器发送精心构造的恶意数据,触发Log4j2组件解析缺陷,实现目标服务器的任意代码执行,获得目标服务器权限。影响范围:Apache Log4j 2.x<=2.14.1...
  • log4j的项目升级到log4j2

    千次阅读 2020-10-15 19:35:25
    0.背景 虽然大部分的java项目使用的都是logback,但是仍然有很多...但是log4j已经于2012年停止更新,并且log4j扫出如下安全漏洞: https://rnd-vulncenter.huawei.com/vuln/toViewOfficialDetail?cveId=CVE-2020-9488 ...
  • 从0到1带你深入理解log4j2漏洞

    千次阅读 多人点赞 2021-12-27 19:09:20
    最近IT圈被爆出的log4j2漏洞闹的沸沸扬扬,log4j2作为一个优秀的java程序日志监控组件,被应用在了各种各样的衍生框架中,同时也是作为目前java全生态中的基础组件之一,这类组件一旦崩塌将造成不可估量的影响。...
  • Log4j2突发重大漏洞之解决方案

    万次阅读 多人点赞 2021-12-14 11:03:51
    Log4j2突发重大漏洞解决方案
  • spring-boot-starter-log4j2修复方式 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency> ...
  • log4j2漏洞复现与利用】

    千次阅读 2022-01-31 21:31:01
    log4j2
  • Slf4j与log4j及log4j2的关系及使用方法

    千次阅读 2020-03-08 00:37:39
    Slf4j与log4j及log4j2的关系及使用方法 slf4j slf4j仅仅是一个为Java程序提供日志输出的统一接口,并不是一个具体的日志实现方案,就比如JDBC一样,只是一种规则而已,所以单独的slf4j是不能工作的,必须搭配...
  • Log4j日志配置详解(Log4j2)

    万次阅读 2018-07-26 10:48:44
    首先来说一下日志升级,log4j配置的变化,配置文件从log4j.xml变成了log4j2.xml,配置文件的内容也有很大不同,log file现在可以同时支持时间和文件大小分割。而且log4j2支持log的动态变化加载,直接指定监控周期就...
  • Java Log4j和Log4j2的区别

    万次阅读 2019-06-28 19:01:56
    Java Log4j和Log4j2的区别 一、核心JAR包 log4j核心包:log4j:log4j:[version] 而log4j2的核心包有2个: org.apache.logging.log4j:log4j-core:[version] org.apache.logging.log4j:log4j-api:[version] 二、...
  • Log4j2-Log4j 2介绍及使用

    万次阅读 2017-07-15 11:08:39
    Log4j 2 官网https://logging.apache.org/log4j/2.x/Log4j 2简介Log4j的1.x版本已经被广泛使用于很多应用程序中。然而,它这些年的发展已经放缓。它变得越来越难以维护,因为它需要严格遵循很老的Java版本,并在2015...
  • log4j2的漏洞修复

    千次阅读 2021-12-13 18:04:05
    log4j2的漏洞修复 简介 Log4j是Apache的一个开源项目,通过使用Log4j,可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;也可以控制每一条日志的...
  • log4j2 2.15.0 仍有安全漏洞

    千次阅读 2021-12-17 19:38:53
    目前log4j2的最新版本已经更新到2.16.0 Apache Log4j 2 Apache Log4j 2 is an upgrade to Log4j that provides significant improvements over its predecessor, Log4j 1.x, and provides many of the ...
  • Log4j2 漏洞复现GetShell

    千次阅读 2021-12-26 23:25:15
    Apache Log4j2 JNDI注入漏洞(CVE-2021-44228),可以任意命令执行

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 904,058
精华内容 361,623
关键字:

log4j2