`
kalogen
  • 浏览: 889940 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

log4j 2 转

    博客分类:
  • Java
阅读更多

一 最好与commons-logging一起用,why?

    1.标准接口,即使将来脱离了log4j也一样用
    2.简化了编码,减少耦合度:不需在代码中指定log4j配制文件位置,代码中不需要引用log4j的包
    3.基本所有框架都是这么用的。。。。。。(我相信群众)

    附加提供一下commons-logging寻找配置文件的顺序(从别人那抄的)
      1) 首先在classpath下寻找自己的配置文件commons-logging.properties,如果找到,则使用其中定义的Log实现类;
      2) 如果找不到commons-logging.properties文件,则在查找是否已定义系统环境变量org.apache.commons.logging.Log,找到则使用其定义的Log实现类;
      3) 否则,查看classpath中是否有Log4j的包,如果发现,则自动使用Log4j作为日志实现类;
      4) 否则,使用JDK自身的日志实现类(JDK1.4以后才有日志实现类);
      5) 否则,使用commons-logging自己提供的一个简单的日志实现类SimpleLog;


二 具体实现

    1.把commons-logging的jar加到classpath中
    2.把log4j的jar加到classpath中
    3.在classpath的根目录下,建立log4j.properties(必须是这个地方,必须叫这个名,才不用特殊配置),可以直接复制后边的模板
    4.在需要log的类中:
        import org.apache.commons.logging.Log;
        import org.apache.commons.logging.LogFactory;

        private static Log log = LogFactory.getLog(xxxx.class);
          为什么要使用static?因为避免产生多个实例
          为什么不使用this.class?因为是static不能用this(我经常犯这个错误。。。)
          为什么不使new XXXX().getClass()?因为。。。。你猜呢?
    5.根据实际需要log.debug()、log.info()、log.warn()、log.error()、log.fatal()    就可以输出不同等级的log


三 log的等级

    1.为什么需要等级?写代码的时候可能需要很多调试信息,运行的时候可能需要显示提示信息,如果在服务器上发生严重错误的时候,可能需要给管理员发邮件。这种:调试,提示,错误就是等级。
    2.都有什么等级? 调试(DEBUG)<信息(INFO)<警告(WARN)<错误(ERROR)<致命错误(FATAL)
    3.怎么用?         log.debug() log.info() log.warn() log.error() log.fatal()依次对应上边的等级


四 log4j的配制

1.基本参数解释:
    ⑴全局配制
      log4j.rootLogger = [ level ] , appenderName, appenderName,..........appenderName
      ★log4j.rootLogger的意思可以理解为:根log或者所有的log
      ★level就是输出级别,只能设置一个值。
       ·关于等级,前边已经说过了有5种,他们之间的关系可以理解为:
          调试(DEBUG):包含调试(DEBUG)、信息(INFO)、警告(WARN)、错误(ERROR)、致命错误(FATAL)
          信息(INFO):包含信息(INFO)、警告(WARN)、错误(ERROR)、致命错误(FATAL)
          警告(WARN):包含警告(WARN)、错误(ERROR)、致命错误(FATAL)
          错误(ERROR):包含错误(ERROR)、致命错误(FATAL)
          致命错误(FATAL):只有他自己
          这样,如果log4j.rootLogger = INFO,那么 INFO,WARN,ERROR,FATAL就全部会被输出
          如果log4j.rootLogger = ERROR,那么ERROR,FATAL就全部会被输出
      ★appenderName就是记录的目标,目标可以多个,中间用『,』分割,appenderName是自己定义的,换句话说,名字是随便起的,起了名之后,就需要在下边设定具体配制
      总结一下这部分,比如说有这么一句log4j.rootLogger = INFO , F1,F2那么就以为着要将所有INFO,WARN,ERROR,FATAL的log全部输出到F1,F2上。F1,F2是什么?往下看。。。。
    ⑵具体配制
      log4j.appender.F1=org.apache.log4j.ConsoleAppender
      log4j.appender.F1.layout=org.apache.log4j.PatternLayout
      log4j.appender.F1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n
      ★log4j.appender.F1=org.apache.log4j.ConsoleAppender的意思就是:将F1设置为控制台输出
       ·还可以设置成什么?
          org.apache.log4j.ConsoleAppender(控制台),
          org.apache.log4j.FileAppender(文件),
          org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),
          org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),
          org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
      ★log4j.appender.F1.layout=org.apache.log4j.PatternLayout的意思就是:将F1的输出布局设置为自定义输出布局。
       ·还可以设置成什么?
          org.apache.log4j.HTMLLayout(以HTML表格形式布局)
          org.apache.log4j.xml.XMLLayout(以XML形式布局)
          org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
          org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
          org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
      ★log4j.appender.F1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n既然上边定义的是自定义输出布局,那么就要定义一下具体输出什么样了~~上边的%c %p %m 等以%开头的都是模式字符串,除了模式字符串外[]-空格等这些字符会按照原样显示。
       ·模式字符串解释:
          %m:消息本身
          %p:消息的级别INFO,WARN,ERROR。。。
          %r:从程序开始执行到当前日志产生时的时间间隔(微秒)
          %c:输出当前日志动作所在的category名称。例如:如果category名称是"a.b.c","%c{2}"将会输出"b.c". {2}意谓着输出“以点分隔开的category名称的后两个组件”,如果 {n}没有,将会输出整个category名称.
          %t:输出当前线程的名称
          %x:输出和当前线程相关联的NDC,尤其用到像java servlets这样的多客户多线程的应用中。
          %n:输出平台相关的换行符。
          %%:输出一个"%"字符
          %d:输出日志产生时候的日期,当然可以对日期的格式进行定制。例如:%d{HH:mm:ss,SSSS}或者是%d{dd MMM yyyy HH:mm:ss,SSSS},如果没有指定后面的格式,将会输出ISO8601的格式。
          %l:输出位置信息,相当于%C.%M(%F:%L)的组合。
          %C:输出日志消息产生时所在的类名,如果类名是“test.page.Class1”%C{1}表示输出类名"Class1",%C{2}输出"page.Class1",而%C则输出"test.page.Class1"。
          %M:输出日志消息产生时的方法名称
          %F:输出日志消息产生时所在的文件名称
          %L:输出代码中的行号
       ·可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。如:
          1)%20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,默认的情况下右对齐。
          2)%-20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,"-"号指定左对齐。
          3)%.30c:指定输出category的名称,最大的宽度是30,如果category的名称大于30的话,就会将左边多出的字符截掉,但小于30的话也不会有空格。
          4)%20.30c:如果category的名称小于20就补空格,并且右对齐,如果其名称长于30字符,就从左边交远销出的字符截掉。
      总结一下,现在来我们所配制的F1的全部内容
      ·我们把它配制成了屏幕输出
      ·输出的布局为:自定义布局
      ·我们又定义了自定义布局的格式:日期时间(格式为:yyyy-MM-dd HH:mm:ss,SSS)[产生该日志的包名类名方法名] [等级] 信息+回车
      如果想配制F2为每天产生一个日志文件,并且保存为xml,就这么写:
      log4j.appender.F2=org.apache.log4j.DailyRollingFileAppender
      log4j.appender.F2.layout=org.apache.log4j.xml.XMLLayout
      这样就可以了吗?当然不是,既然保存为文件。。至少要指定一个文件名吧
      log4j.appender.F2.File=c:/logs/log.xml
      可以了吗?可以运行了。。。但是。。既然每天都产生一个文件,那么前一天的怎么办呢?
      log4j.appender.F2.DatePattern=yyyyMMdd'.xml.back'
      这样log4j会在第一次产生今天的log的同时,将昨天的log备份为 log文件名.扩展名yyyyMMdd.xml.back。对应我们这个文件,今天的log到明天有新log产生的时候,就会变为log.xml20070420.xml.back
      这样的参数到底有多少?常用的有:
      ★ConsoleAppender选项
       ·Threshold=WARN:指定日志消息的输出最低层次。
       ·ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
       ·Target=System.err:默认情况下是:System.out,指定输出控制台
      ★FileAppender 选项
       ·Threshold=WARN:指定日志消息的输出最低层次。
       ·ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
       ·File=mylog.txt:指定消息输出到mylog.txt文件。
       ·Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
      ★RollingFileAppender 选项
       ·Threshold=WARN:指定日志消息的输出最低层次。
       ·ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
       ·File=mylog.txt:指定消息输出到mylog.txt文件。
       ·Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
       ·MaxFileSize=100KB: 后缀可以是KB, MB 或者是 GB. 在日志文件到达该大小时,将会自动滚动,即将原来的内容移到mylog.log.1文件。
       ·MaxBackupIndex=2:指定可以产生的滚动文件的最大数。
      ★DailyRollingFileAppender 选项
       ·Threshold=WARN:指定日志消息的输出最低层次。
       ·ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
       ·File=mylog.txt:指定消息输出到mylog.txt文件。
       ·Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
       ·DatePattern='.'yyyy-ww:每周滚动一次文件,即每周产生一个新的文件。当然也可以指定按月、周、天、时和分。即对应的格式如下:
         1)'.'yyyy-MM: 每月
         2)'.'yyyy-ww: 每周
         3)'.'yyyy-MM-dd: 每天
         4)'.'yyyy-MM-dd-a: 每天两次
         5)'.'yyyy-MM-dd-HH: 每小时
         6)'.'yyyy-MM-dd-HH-mm: 每分钟
      ★PatternLayout 选项
       ·ConversionPattern=%m%n :指定怎样格式化指定的消息。
      ★HTMLLayout 选项
       ·LocationInfo=true:默认值是false,输出java文件名称和行号
       ·Title=my app file: 默认值是 Log4J Log Messages.
      ★XMLLayout 选项
       ·LocationInfo=true:默认值是false,输出java文件和行号
      现在来看一下我们完整的第一个配制文件:
========================================================================================
log4j.rootLogger = INFO,F1,F2

log4j.appender.F1=org.apache.log4j.ConsoleAppender
log4j.appender.Threshold=DEBUG
log4j.appender.F1.Target=System.out
log4j.appender.F1.layout=org.apache.log4j.PatternLayout
log4j.appender.F1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n

log4j.appender.F2=org.apache.log4j.DailyRollingFileAppender
log4j.appender.F2.File=c:/logs/log.xml
log4j.appender.F2.DatePattern=yyyyMMdd-HH'.xml.back'
log4j.appender.F2.layout=org.apache.log4j.xml.XMLLayout
========================================================================================
      编段代码看看效果
========================================================================================
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class Main{
      private static Log log = LogFactory.getLog(Main.class);
      public static void main(String[] args) throws Exception{
          log.info("info");
          log.debug("debug");
          log.warn("warn");
          log.error("error");
      }

}
========================================================================================
      运行效果
========================================================================================
2007-04-20 12:36:22,531 [cn.yyun.test.Main]-[INFO] info
2007-04-20 12:36:22,531 [cn.yyun.test.Main]-[WARN] warn
2007-04-20 12:36:22,531 [cn.yyun.test.Main]-[ERROR] error
========================================================================================
      并且在c:/logs/下有log.xml生成,里边的内容为:
========================================================================================
<log4j:event logger="cn.yyun.test.Main" timestamp="1177043782531" level="INFO" thread="main">
<log4j:message><![CDATA[info]]></log4j:message>
</log4j:event>

<log4j:event logger="cn.yyun.test.Main" timestamp="1177043782531" level="WARN" thread="main">
<log4j:message><![CDATA[warn]]></log4j:message>
</log4j:event>

<log4j:event logger="cn.yyun.test.Main" timestamp="1177043782531" level="ERROR" thread="main">
<log4j:message><![CDATA[error]]></log4j:message>
</log4j:event>
========================================================================================
      仔细看一下会发现,虽然我们在代码里写了log.debug("debug")但是debug并没有出现在log中,这是因为我们配置文件中,定义了log的等级为INFO,debug的等级小于info,所以不会显示,而warn,error的大于info,所以也会被显示出来


2.根据package生成不同的log文件
    ⑴配置
      log4j.logger.cn.yyun.test.abc=INFO,abc2,abc1

      log4j.appender.abc2=org.apache.log4j.ConsoleAppender
      log4j.appender.abc2.layout=org.apache.log4j.PatternLayout
      log4j.appender.abc2.layout.ConversionPattern=abc:[%p] %m%n

      log4j.appender.abc1=org.apache.log4j.DailyRollingFileAppender
      log4j.appender.abc1.File=C:/logs/abc.log
      log4j.appender.abc1.DatePattern='.'yyyyMMdd
      log4j.appender.abc1.layout=org.apache.log4j.PatternLayout
      log4j.appender.abc1.layout.ConversionPattern=%d %r [%t] %5p - %m%n

      log4j.logger.cn.yyun.test.def=INFO,def
      log4j.appender.def=org.apache.log4j.ConsoleAppender
      log4j.appender.def.layout=org.apache.log4j.PatternLayout
      log4j.appender.def.layout.ConversionPattern=def: [%p] %m%n

      把logger.cn.yyun.test.abc换成需要的package就可以了(整个log4j配制文件中只有这些就可以了 )。但是这样会有另一个问题,如果cn.yyun.test.Main这个类中,如果有log操作,会报告:log4j:WARN No appenders could be found for logger (cn.yyun.test.Main).所以要加上log4j.rootCategory=INFO,F1    这样所有的log都会被纪录了。。但是这样又做之后:cn.yyun.test.def里的log,会同时出现在def和F1中,cn.yyun.test.abc里的log,会同时出现在abc1,abc2和F1中。。。。。所以定义的时候一定要规划好。
    ⑵制定package的log等级
      log4j.logger.org.hibernate=DEBUG

分享到:
评论

相关推荐

    老生常谈Log4j和Log4j2的区别(推荐)

    下面我们将从配置文件类型、核心JAR包、文件渲染和Log调用四个方面来比较Log4j和Log4j2的区别。 配置文件类型 Log4j通过一个.properties文件作为主配置文件,而Log4j2则弃用了这种方式,采用的是.xml、.json或者....

    Log4j2简介及与Log4j效率对比

    ### Log4j2简介 Log4j2是Apache软件基金会推出的日志框架,它是Log4j 1.x的重构版本,旨在提供更为高效且灵活的日志解决方案。与Log4j 1.x相比,Log4j2在设计上进行了重大改进,并解决了Logback等其他日志框架中...

    若依框架使用的log4j2.16.0,修复log4j漏洞log4j2下载最新log4j2.16.0下载

    在2021年底,一个重大的安全漏洞(CVE-2021-44228)被发现在Log4j2的早期版本中,这个漏洞被称为“Log4Shell”。攻击者可以利用这个漏洞通过精心构造的输入来执行任意代码,对系统造成严重威胁。 标题中提到的“log...

    Log4j2学习用到的jar包及apache-log4j-2.19.0-bin.zip

    分别有disruptor-3.3.4.jar(Log4j2异步日志的底层实现)、log4j-api-2.19.0.jar(log4j门面)、log4j-core-2.19.0.jar(log4j实现)、log4j-slf4j-impl-2.19.0.jar(SLF4J与Log4j绑定)、slf4j-api-1.7.30.jar(SLF...

    logging-log4j2-log4j-2.15.0-rc2.zip maven 资源库

    针对Log4j 2 远程代码执行漏洞,需要用到的升级资源包,适用于maven资源库,包括log4j,log4j-core,log4j-api,log4j-1.2-api,log4j-jpa等全套2.15.0 maven资源库jar包。如果是maven本地仓库使用,需要将zip包解压...

    Log4j2学习log4j2.xml配置模板

    Log4j2 配置模板学习笔记 Log4j2 是 Java 语言中一种流行的日志记录工具,它提供了灵活的日志记录管理功能。下面我们将学习 Log4j2 配置模板的使用和配置。 引入 Log4j2 依赖 在使用 Log4j2 之前,需要在 Maven ...

    SpringBoot框架配置log4j和log4j2的配置代码

    Log4j和Log4j2是两种广泛使用的Java日志框架,它们提供了灵活的日志配置和高性能的日志处理能力。本文将详细介绍如何在SpringBoot项目中配置Log4j和Log4j2。 ### SpringBoot与Log4j Log4j是Apache的一个开源项目,...

    Log4j2、Fastjson、Log4j的BurpSuite插件亲测有效

    Log4j、Log4j2和Fastjson的安全性问题在过去曾引起广泛关注,例如Log4j2的CVE-2021-44228(也被称为Log4Shell漏洞),这是一个远程代码执行漏洞,影响了许多使用Log4j2的系统。这个插件可能就是为了检测和利用这些...

    Log4j2结合Slf4j配置使用

    Log4j2 结合 Slf4j 配置使用 Log4j2 是一个功能强大且广泛使用的日志记录工具,它提供了灵活的日志记录机制和高性能的日志记录能力。Slf4j 则是一个简单的日志记录门面,提供了统一的日志记录接口。今天,我们将...

    Apache Log4j2紧急缓解措施.docx

    Apache Log4j2 紧急缓解措施 Apache Log4j2 是一个流行的 Java 日志记录工具,但最近出现了严重的安全漏洞, Apache Log4j2 紧急缓解措施旨在帮助开发者尽快修复该漏洞,避免攻击者的攻击。 一、修改启动脚本 在...

    log4j2所需jar包

    这个压缩包包含的两个关键文件——`log4j-api-2.11.1.jar`和`log4j-core-2.11.1.jar`是Log4j2框架的核心组件。 1. **log4j-api-2.11.1.jar**:这个文件提供了Log4j2的API接口。开发者主要通过这些接口来与Log4j2...

    log4j2漏洞检测工具

    **Log4j2漏洞检测工具详解** 在当前的IT环境中,安全问题日益凸显,特别是针对开源组件的安全漏洞。Log4j2,一个广泛使用的Java日志框架,最近曝出的重大安全漏洞(CVE-2021-44228,被称为Log4Shell)引起了全球的...

    扫描log4j2 版本扫描log4j2 版本

    2. **版本确认**:然后,通过查看项目配置文件(如`log4j2.xml`或`log4j2.json`)或依赖管理工具(如Maven或Gradle)的配置,确定当前使用的Log4j2版本。 3. **漏洞评估**:对比已知受影响的版本列表,如CVE-2021-...

    日志版本-log4j2版本jar

    Log4j2的核心改进在于其引入了全新的API——Log4j 1.2 API,文件`log4j-1.2-api-2.8.2.jar`就是这个API的实现,它使得旧的基于Log4j 1.2的应用程序可以无缝地迁移到Log4j 2。这个API保持了与1.x版本接口的兼容性,但...

    修复log4j漏洞log4j2下载最新log4j2.16.0下载 log4j-api-2.16.0.jar

    apache下载太慢,特搬到国内下载。修复log4j漏洞log4j2下载最新log4j2.16.0下载

    tomcat9 slf4j+log4j2 写日志.zip

    3. **配置Tomcat**:在`$CATALINA_HOME/lib`目录下添加`log4j-api.jar`和`log4j-slf4j-impl.jar`,这将使Tomcat使用Log4j2作为其内部的日志系统。 4. **排除其他日志实现**:确保你的应用中没有引入其他的日志实现...

    logging-log4j2-log4j-2.15.0-rc2.zip

    这次我们关注的是其最新版本——logging-log4j2-log4j-2.15.0-rc2。这个版本在安全性和性能上都做了进一步的优化和提升,旨在为开发者提供更高效、更安全的日志处理方案。 1. **Log4j 2概述**: Log4j 2是Log4j的...

    log4j2-所需jar包+配置详解(详细)

    关于配置文件的名称以及在项目中的存放位置  log4j 2.x版本不再支持像1.x中的....如果本地要测试,可以把log4j2-test.xml放到classpath,而正式环境使用log4j2.xml,则在打包部署的时候不要打包log4j2-test.xml即可。

    Java与log4j2整合mongoDB需要的jar包

    2. **配置log4j2**:在你的项目中创建一个log4j2的配置文件(通常是`log4j2.xml`或`log4j2.json`)。在配置文件中,你需要定义一个Appender,将日志输出到MongoDB。这可能涉及到MongoDBAppender类,它可以将日志事件...

    log4j2所需的jar

    这个压缩包“apache-log4j-2.13.2-bin”包含了Log4j2的核心组件,使得开发者可以在他们的应用程序中集成并使用Log4j2。以下是关于Log4j2的一些关键知识点: 1. **日志框架**:Log4j2是Apache软件基金会开发的日志...

Global site tag (gtag.js) - Google Analytics