zoukankan      html  css  js  c++  java
  • log4j 巨大bug升级

    Pom 配置修改:

     剔除低版本的  log4j jar 包

     <dependency>
                <artifactId>pwp-sysmng</artifactId>
                <groupId>com.todaytech.pwp</groupId>
                <version>${pwp.version}</version>
                <exclusions>
                    <exclusion>
                        <artifactId>standard</artifactId>
                        <groupId>taglibs</groupId>
                    </exclusion>
                    <!--20211212 处理日志jar包漏洞 升级jar包-->
                    <exclusion>
                        <groupId>log4j</groupId>
                        <artifactId>log4j</artifactId>
                    </exclusion>
                    <exclusion>
                        <groupId>org.slf4j</groupId>
                        <artifactId>slf4j-log4j12</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>

    增加高版本的jar包

     <!--20211212 处理日志jar包漏洞 升级jar包-->
            <!--升级log4j 1.2.16 系列相关的jar包-->
            <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-slf4j-impl -->
            <dependency>
                <groupId>org.apache.logging.log4j</groupId>
                <artifactId>log4j-slf4j-impl</artifactId>
                <version>2.15.0</version>
            </dependency>
    
            <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->
            <dependency>
                <groupId>org.apache.logging.log4j</groupId>
                <artifactId>log4j-core</artifactId>
                <version>2.15.0</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-1.2-api -->
            <dependency>
                <groupId>org.apache.logging.log4j</groupId>
                <artifactId>log4j-1.2-api</artifactId>
                <version>2.15.0</version>
            </dependency>

    log4j2.properties 配置文件配置内容

    status = error
    
    property.LOG_HOME=h:/output/logs
    property.BACKUP_HOME=backup
    property.SERVER_NAME=buddie-Service
    property.EVERY_FILE_SIZE=100M
    property.OUTPUT_LOG_LEVEL=INFO
    property.FILE_MAX=10
    
    appender.console.type = Console
    appender.console.name = STDOUT
    appender.console.layout.type = PatternLayout

    # 格式名 含义
    # %c 输出日志信息所属的类的全名
    # %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy-MM-dd HH:mm:ss },输出类似:2002-10-18- 22:10:28
    # %f 输出日志信息所属的类的类名
    # %F:输出日志消息产生时所在的文件名称。
    # %l:输出日志事件的发生位置,相当于%c.%M(%F:%L)的组合,包括类全名、方法、文件名以及在代码中的行数。例如:test.TestLog4j.main(TestLog4j.java:10)。
    # %L::输出代码中的行号。
    # %m 输出代码中指定的信息,如log(message)中的message
    # %M 输出打印该条日志的方法名
    # %n 输出一个回车换行符,Windows平台为“rn”,Unix平台为“n”
    # %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL。如果是调用debug()输出的,则为DEBUG,依此类推
    # %r 输出自应用启动到输出该日志信息所耗费的毫秒数
    # %t 输出产生该日志事件的线程名
    # %x:输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。
    # %%:输出一个"%"字符。
    # 另外,还可以在%与格式字符之间加上修饰符来控制其最小长度、最大长度、和文本的对齐方式。如:
    # 1) c:指定输出category的名称,最小的长度是20,如果category的名称长度小于20的话,默认的情况下右对齐。
    # 2)%-20c:"-"号表示左对齐。
    # 3)%.30c:指定输出category的名称,最大的长度是30,如果category的名称长度大于30的话,就会将左边多出的字符截掉,但小于30的话也不会补空格。

    
    appender.console.layout.pattern =%-d{yyyy-MM-dd HH,SSS} %p %C{1.} [%t] %m%n
    appender.console.layout.charset=GBK
    # 级别过滤(过滤日志记录)
    appender.console.filter.threshold.type = ThresholdFilter
    # 只记录debug级别以上的日志,大小写无关:(ALL<)TRACE<DEBUG<INFO<WARN<ERROR<FATAL(<OFF)
    appender.console.filter.threshold.level = DEBUG
    
    
    appender.rolling.type=RollingFile
    appender.rolling.name=RollingFileAll
    appender.rolling.filter.threshold.level = trace
    appender.rolling.filter.threshold.type = ThresholdFilter
    appender.rolling.fileName=${LOG_HOME}/dev_${SERVER_NAME}_all.log
    appender.rolling.filePattern=${LOG_HOME}/dev_${BACKUP_HOME}/dev_${SERVER_NAME}_all.%d{yyyy-MM-dd-HH}.log
    appender.rolling.layout.type=PatternLayout
    appender.rolling.layout.pattern=%d %p %C{1.} [%t] %m%n
    appender.rolling.policies.type=Policies
    appender.rolling.policies.time.type=TimeBasedTriggeringPolicy
    appender.rolling.policies.time.interval=2
    appender.rolling.policies.time.modulate=true
    appender.rolling.policies.size.type=SizeBasedTriggeringPolicy
    appender.rolling.policies.size.size=${EVERY_FILE_SIZE}
    appender.rolling.strategy.type=DefaultRolloverStrategy
    
    appender.error.type=RollingFile
    appender.error.name=RollingFileError
    appender.error.filter.threshold.level = error
    appender.error.filter.threshold.type = ThresholdFilter
    appender.error.fileName=${LOG_HOME}/dev_${SERVER_NAME}_error.log
    appender.error.filePattern=${LOG_HOME}/dev_${BACKUP_HOME}/dev_${SERVER_NAME}_error.%d{yyyy-MM-dd-HH}.log
    appender.error.layout.type=PatternLayout
    appender.error.layout.pattern=%d %p %C{1.} [%t] %m%n
    appender.error.policies.type=Policies
    appender.error.policies.time.type=TimeBasedTriggeringPolicy
    appender.error.policies.time.interval=2
    appender.error.policies.time.modulate=true
    appender.error.policies.size.type=SizeBasedTriggeringPolicy
    appender.error.policies.size.size=${EVERY_FILE_SIZE}
    appender.error.strategy.type=DefaultRolloverStrategy
    
    appender.charge.type=RollingFile
    appender.charge.name=RollingFileCharge
    appender.charge.filter.threshold.level = trace
    appender.charge.filter.threshold.type = ThresholdFilter
    appender.charge.fileName=${LOG_HOME}/dev_${SERVER_NAME}_charge.log
    appender.charge.filePattern=${LOG_HOME}/dev_${BACKUP_HOME}/dev_${SERVER_NAME}_charge.%d{yyyy-MM-dd-HH}.log
    appender.charge.layout.type=PatternLayout
    appender.charge.layout.pattern=%d %p %C{1.} [%t] %m%n
    appender.charge.policies.type=Policies
    appender.charge.policies.time.type=TimeBasedTriggeringPolicy
    appender.charge.policies.time.interval=2
    appender.charge.policies.time.modulate=true
    appender.charge.policies.size.type=SizeBasedTriggeringPolicy
    appender.charge.policies.size.size=${EVERY_FILE_SIZE}
    appender.charge.strategy.type=DefaultRolloverStrategy
    
    logger.activity.name = buddie.activity
    logger.activity.level = debug
    logger.activity.additivity = false
    logger.activity.appenderRef.all.ref = RollingFileAll
    logger.activity.appenderRef.error.ref = RollingFileError
    logger.activity.appenderRef.stdout.ref = STDOUT
    
    logger.login.name = buddie.login
    logger.login.level = debug
    logger.login.additivity = false
    logger.login.appenderRef.all.ref = RollingFileAll
    logger.login.appenderRef.error.ref = RollingFileError
    logger.login.appenderRef.stdout.ref = STDOUT
    
    logger.charge.name = buddie.charge
    logger.charge.level = trace
    logger.charge.additivity = false
    logger.charge.appenderRef.all.ref = RollingFileAll
    logger.charge.appenderRef.error.ref = RollingFileError
    logger.charge.appenderRef.charge.ref = RollingFileCharge
    logger.charge.appenderRef.stdout.ref = STDOUT
    
    rootLogger.level = debug
    rootLogger.appenderRef.stdout.ref = STDOUT
    rootLogger.appenderRef.all.ref = RollingFileAll
    rootLogger.appenderRef.error.ref = RollingFileError

    如何找出jar包的依赖来源(idea)

    Maven 组件界面介绍

    • 如上图标注 1 所示,为常用的 Maven 工具栏,其中最常用的有:

      • 第一个按钮:Reimport All Maven Projects 表示根据 pom.xml 重新载入项目。一般单我们在 pom.xml 添加了依赖包或是插件的时候,发现标注 4 的依赖区中没有看到最新写的依赖的话,可以尝试点击此按钮进行项目的重新载入。
      • 第六个按钮:Execute Maven Goal 弹出可执行的 Maven 命令的输入框。有些情况下我们需要通过书写某些执行命令来构建项目,就可以通过此按钮。
      • 第九个按钮:Show Dependencies 显示项目依赖的结构图,可以方便我们直观项目的依赖包情况。这个功能有些具体的操作下面会专门进行讲解。
    • 如上图标注 2 所示,常用的 Maven 生命周期的命令,通过双击对应的命令来执行项目编译、打包、部署等操作。

    • 如上图标注 3 所示,为我们在 pom.xml 中配置的插件列表,方便调用插件。

    • 如上图标注 4 所示,为我们在 pom.xml 中配置的依赖包列表。

    • 如上图标注 5 所示,为常见的 Java Web 在 Maven 下的一个项目结构。

    大致了解过后,看怎么查看所有jar包的依赖关系。

     2017.2.6版本之后,这个图标的样子变啦

    点完之后就会有下图

    可以看到,这个maven项目的所有jar包依赖关系,一览无余。

    为什么我的这个jar包依赖这么少呢,因为我这个项目只是简单示范了一下springmvc框架的使用。所以,也没有引入过多的jar包,要是在一个大一点的项目里面,你使用定时任务了,使用poi了使用等等一些其他工具类的包,那么就会很多了。

    下面说一些小技巧

    自动适配这个页面的大小。

    右键,这个地方,如图,就可以调整到,适合大小。左上角那个放大镜边上,也有这个按钮。

    不用自己去放大缩小的,找不到合适点。

     

    这地方有个小技巧,也许有的人不知道呢,就是这有放大镜功能。不是简单的点上面给的图标,放大,那个放大也不方便不是?

    Windows电脑可以按alt键,页面上就会出现个大的圆圈,也就是传说中的放大镜了,这么一来就可以看的方便一点了。

    具体看图:

     依赖包冲突

    图中的红色实线就算是冲突的,可以入上图那样,右键,排除,他就自动在pom文件里面给exclud啦。

    还有一种是虚线的红线。

    这种虚线,告诉你同一个jar都在哪里被多次引用了。

     

    上面的都是理论姿势,那么实际中怎么使用呢?

    比如下面的这个pom.xml里面有这么2个dependency的引入。

    [html]  view plain  copy
     
     
     
    1. <dependency>  
    2.     <groupId>org.springframework</groupId>  
    3.     <artifactId>spring-webmvc</artifactId>  
    4.     <version>${org.springframework-version}</version>  
    5. </dependency>  
    6. <dependency>  
    7.     <groupId>org.springframework</groupId>  
    8.     <artifactId>spring-web</artifactId>  
    9.     <version>${org.springframework-version}</version>  
    10. </dependency>  

    可以看到,如果你不是很了解spring相关的包依赖的话,你就不知道你上面的引入,其实只需要引入一个依赖就可以了。如下:

     

     

    [html]  view plain  copy
     
     
     
    1. <dependency>  
    2.     <groupId>org.springframework</groupId>  
    3.     <artifactId>spring-webmvc</artifactId>  
    4.     <version>${org.springframework-version}</version>  
    5. </dependency>  

    因为,从上面的第一个依赖关系图可以看出来,spring-webmvc是依赖于spring-web的,所以,他是会自动的去添加这个jar包的。

     

     

    额,其实,就算知道了,也不一定会去改,你也看到了,我们项目里面那么多红线,但是项目依然可以健康的跑起来。基本上算是尾大不掉的局面啦。这个要是一开始就注意这个问题的话,那么项目看起来还是比较 整洁的。

     

    最后,湿胸我说的这么详细,各位观众,有钱的捧个钱场,没钱的捧个人场。点个赞,留个言啥的,好不好呀。

    #log4j2.properties#用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,会看到log4j2内部各种详细输出#(ALL<)TRACE<DEBUG<INFO<WARN<ERROR<FATAL(<OFF)status = debugdest = errname = PropertiesConfig

    #日志文件名称  指定日志文件的位置和文件名称,以便记录多份日志时,直接引用#property.filename = d:/logs/rollingtest.logproperty.filename = h:/zhpfds_logs/DEBUG.log#%n-换行#%m-日志内容#%p-日志级别(FATAL,ERROR,WARN...)#%F-java源文件名#%t 输出产生该日志事件的线程名#%d 输出日志时间点的日期或时间#%L-java源码行数#%C-java类名#%M-java方法名#%l-输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数property.layoutPattern = %-d{yyyy-MM-dd HH,SSS} %p %C{1.} [%t] %m%n
    # 级别过滤(过滤日志记录)filter.threshold.type = ThresholdFilter# 只记录debug级别以上的日志,大小写无关:(ALL<)TRACE<DEBUG<INFO<WARN<ERROR<FATAL(<OFF)filter.threshold.level = debug
    # 控制台类型的日志输出源appender.console.type = Console# 输出源的名称appender.console.name = STDOUT#输出类型appender.console.target = SYSTEM_OUT# 输出布局类型appender.console.layout.type = PatternLayout# 输出模板appender.console.layout.pattern = ${layoutPattern}# 级别过滤(过滤日志记录)appender.console.filter.threshold.type = ThresholdFilter# 只记录debug级别以上的日志,大小写无关:(ALL<)TRACE<DEBUG<INFO<WARN<ERROR<FATAL(<OFF)appender.console.filter.threshold.level = DEBUG


    # 文件日志输出源:文件滚动记录类型的日志输出源appender.rolling.type = RollingFile#输入源名称  指定当前滚动输出源的名称appender.rolling.name = RollingFile#日志文件名:指定当前日志文件的位置和文件名称,可以单独指定,也可以直接引用之前定义过得property.filename参数appender.rolling.fileName = ${filename}#指定当发生文件滚动时,文件重命名规则 :指定当发生Rolling时,文件的转移和重命名规则appender.rolling.filePattern = h:/zhpfds_logs/DEBUG-%d{MM-dd-yy-HH-mm-ss}-%i.log.gz# 滚动记录输出源布局类型appender.rolling.layout.type = PatternLayout# 滚动记录输出模板  %-d{yyyy-MM-dd HH:mm:ss,SSS} %p %C{1.} [%t] %m%nappender.rolling.layout.pattern = ${layoutPattern}# 指定记录文件的保存策略,该策略主要是完成周期性的日志文件保存工作:appender.rolling.policies.type = Policies# 基于时间的触发策略(TriggeringPolicy)appender.rolling.policies.time.type = TimeBasedTriggeringPolicy# 当前记录周期为每2秒生成一个文件,如果filePattern中配置的文件重命名规则是test1-%d{yyyy-MM-dd HH-mm}-%i,#最小的时间粒度是mm,即分钟,TimeBasedTriggeringPolicy指定的size是1,结合起来就是每2分钟生成一个新文件。#如果改成%d{yyyy-MM-dd HH},最小粒度为小时,则每2个小时生成一个文件。appender.rolling.policies.time.interval = 2# 是否对保存时间进行限制。若modulate=true,则保存时间将以0点为边界进行偏移计算。#比如,modulate=true,interval=4hours,#那么假设上次保存日志的时间为03:00,则下次保存日志的时间为04:00,之后的保存时间依次为08:00,12:00,16:00appender.rolling.policies.time.modulate = true# 基于日志文件大小的触发策略appender.rolling.policies.size.type = SizeBasedTriggeringPolicy# 当日志文件大小大于size指定的值时,触发滚动appender.rolling.policies.size.size=100MB# 文件保存的覆盖策略(RolloverStrategy)appender.rolling.strategy.type = DefaultRolloverStrategy# 生成分割(保存)文件的个数,默认为5(-1,-2,-3,-4,-5)appender.rolling.strategy.max = 5appender.rolling.filter.threshold.type=ThresholdFilterappender.rolling.filter.threshold.level=DEBUG
    # 记录器名称   com.example.my.applogger.rolling.name = com.video.demo# 设置日志级别logger.rolling.level = debug# 是否向上级logger传递信息logger.rolling.additivity = true
    # 关联名称为RollingFile的输出源(appender)logger.rolling.appenderRef.rolling.ref = RollingFile

    #设置SpringFramework框架的日志级别,一般业务上不需要其它使用了log4j的框架输出日志logger.SpringFramework.name = org.springframeworklogger.SpringFramework.level = INFO
    #当有其它框架的也使用了log4j时,会输出相应日志,以下方式为屏蔽其它框架的日志信息(设置日志级别)#logger.Http.name = org.apache.http#logger.Http.level = TRACE

    # 根记录器,所有记录器的父辈rootLogger.level = debug
    # 关联名称为STDOUT的输出源(appender)rootLogger.appenderRef.stdout.ref = STDOUT

    为人:谦逊、激情、博学、审问、慎思、明辨、 笃行
    学问:纸上得来终觉浅,绝知此事要躬行
    为事:工欲善其事,必先利其器。
    态度:道阻且长,行则将至;行而不辍,未来可期
    转载请标注出处!
  • 相关阅读:
    轻松实现 网络视频播放器
    端口扫描 多方式协同实现
    关于部分应用无法向POJ提交代码的解决方案
    一套跨平台五子棋网游的开发经历
    SSH2.0编程 ssh协议过程实现
    ssh秘钥交换详解与实现 diffie-hellman-group-exchange-sha
    OnlineJudge 离线题库采集
    SOCKET 实现NAT 穿越
    基于公网smtp协议实现邮件服务器
    周六搞事情,微信小程序开发文档已放出!
  • 原文地址:https://www.cnblogs.com/ios9/p/15681186.html
Copyright © 2011-2022 走看看