精华内容
下载资源
问答
  • 首先声明一下,我用的 Intellij IDEA 2018.3 版本的,springboot的版本是 2.0.5.RELEASE 版本。 当我喜滋滋的编写完测试代码,点击 Debug 的时候,睁大眼睛看控制台简直是看得一脸懵逼,控制台显示如下...SLF4J: D...

    首先声明一下,我用的 Intellij IDEA 2018.3 版本的,springboot的版本是 2.0.5.RELEASE  版本。

    当我喜滋滋的编写完测试代码,点击 Debug 的时候,睁大眼睛看控制台简直是看得一脸懵逼,控制台显示如下:

    SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
    SLF4J: Defaulting to no-operation (NOP) logger implementation
    SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
    
      .   ____          _            __ _ _
     /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
    ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
     \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
      '  |____| .__|_| |_|_| |_\__, | / / / /
     =========|_|==============|___/=/_/_/_/
     :: Spring Boot ::        (v2.0.5.RELEASE)
    
    十二月 13, 2018 4:48:04 下午 org.apache.catalina.core.StandardService startInternal
    信息: Starting service [Tomcat]
    十二月 13, 2018 4:48:04 下午 org.apache.catalina.core.StandardEngine startInternal
    信息: Starting Servlet Engine: Apache Tomcat/8.5.34
    十二月 13, 2018 4:48:04 下午 org.apache.catalina.core.AprLifecycleListener lifecycleEvent
    信息: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: [D:\Program Files\java\jdk1.8\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\ProgramData\Oracle\Java\javapath;C:\Program Files (x86)\Common Files\NetSarang;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\ATI Technologies\ATI.ACE\Core-Static;D:\Program Files\java\jdk1.7\bin;D:\Program Files\mysql-5.7.17\bin;C:\WINDOWS\System32\OpenSSH\;D:\Program Files\Git\cmd;D:\Program Files\TortoiseSVN\bin;C:\Users\Administrator\AppData\Local\Microsoft\WindowsApps;;.]
    十二月 13, 2018 4:48:05 下午 org.apache.catalina.core.ApplicationContext log
    信息: Initializing Spring embedded WebApplicationContext

    没错,就是这么点日志,但是注意 第一行  SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".

    然后去 http://www.slf4j.org/codes.html#StaticLoggerBinder  地址看了下解决方法,这里我就不详细说了,反正大概意思就加上slf4j-nop.jar slf4j-simple.jar, slf4j-log4j12.jar,slf4j-jdk14.jar或 logback-classic.jar中的其中一个jar包就行(只能是一个,多了就会有冲突)。

    于是乎我加了 slf4j-simple  jar包代码如下:(这段代码是我直接从线上maven库中copy出来的,肯定不会有错)

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-simple</artifactId>
        <version>1.7.25</version>
        <scope>test</scope>
      </dependency>

    引入依赖后,启动还是报错,一模一样,这TM就有点过分了,官网的解决方法一般是不会出错的,而且之前我也百度过,也是差不多一样的做法,那到底是什么问题呢?

    于是又是一顿找,看看前辈们有没有碰到过类似的错误,终于有所发现,最终修改代码如下:

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-simple</artifactId>
        <version>1.7.25</version>
        <scope>compile</scope>
      </dependency>
    

    没错,就是毁在这段代码上 <scope>test</scope> ,test表示只有在测试环境下,才可以使用,而我springboot是运行在main方法中,是不属于测试环境,所以这个包就相当于没有加入依赖,也就没有被加载到。改成compile则表示编译的时候就会加载此jar包,那么最后就运行成功了,成功的日志如下:
     

    "D:\Program Files\java\jdk1.8\bin\java.exe" -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:51555,suspend=y,server=n -javaagent:C:\Users\Administrator\.IntelliJIdea2018.3\system\captureAgent\debugger-agent.jar -Dfile.encoding=UTF-8 -classpath "D:\Program Files\java\jdk1.8\jre\lib\charsets.jar;D:\Program Files\java\jdk1.8\jre\lib\deploy.jar;D:\Program Files\java\jdk1.8\jre\lib\ext\access-bridge-64.jar;D:\Program Files\java\jdk1.8\jre\lib\ext\cldrdata.jar;D:\Program Files\java\jdk1.8\jre\lib\ext\dnsns.jar;D:\Program Files\java\jdk1.8\jre\lib\ext\jaccess.jar;D:\Program Files\java\jdk1.8\jre\lib\ext\jfxrt.jar;D:\Program Files\java\jdk1.8\jre\lib\ext\localedata.jar;D:\Program Files\java\jdk1.8\jre\lib\ext\nashorn.jar;D:\Program Files\java\jdk1.8\jre\lib\ext\sunec.jar;D:\Program Files\java\jdk1.8\jre\lib\ext\sunjce_provider.jar;D:\Program Files\java\jdk1.8\jre\lib\ext\sunmscapi.jar;D:\Program Files\java\jdk1.8\jre\lib\ext\sunpkcs11.jar;D:\Program Files\java\jdk1.8\jre\lib\ext\zipfs.jar;D:\Program Files\java\jdk1.8\jre\lib\javaws.jar;D:\Program Files\java\jdk1.8\jre\lib\jce.jar;D:\Program Files\java\jdk1.8\jre\lib\jfr.jar;D:\Program Files\java\jdk1.8\jre\lib\jfxswt.jar;D:\Program Files\java\jdk1.8\jre\lib\jsse.jar;D:\Program Files\java\jdk1.8\jre\lib\management-agent.jar;D:\Program Files\java\jdk1.8\jre\lib\plugin.jar;D:\Program Files\java\jdk1.8\jre\lib\resources.jar;D:\Program Files\java\jdk1.8\jre\lib\rt.jar;E:\IdeaProjects\miaosha\target\classes;E:\repository\org\springframework\boot\spring-boot-starter-web\2.0.5.RELEASE\spring-boot-starter-web-2.0.5.RELEASE.jar;E:\repository\org\springframework\boot\spring-boot-starter\2.0.5.RELEASE\spring-boot-starter-2.0.5.RELEASE.jar;E:\repository\org\springframework\boot\spring-boot\2.0.5.RELEASE\spring-boot-2.0.5.RELEASE.jar;E:\repository\org\springframework\boot\spring-boot-autoconfigure\2.0.5.RELEASE\spring-boot-autoconfigure-2.0.5.RELEASE.jar;E:\repository\org\springframework\boot\spring-boot-starter-logging\2.0.5.RELEASE\spring-boot-starter-logging-2.0.5.RELEASE.jar;E:\repository\org\apache\logging\log4j\log4j-to-slf4j\2.10.0\log4j-to-slf4j-2.10.0.jar;E:\repository\org\apache\logging\log4j\log4j-api\2.10.0\log4j-api-2.10.0.jar;E:\repository\org\slf4j\jul-to-slf4j\1.7.25\jul-to-slf4j-1.7.25.jar;E:\repository\javax\annotation\javax.annotation-api\1.3.2\javax.annotation-api-1.3.2.jar;E:\repository\org\springframework\spring-core\5.0.9.RELEASE\spring-core-5.0.9.RELEASE.jar;E:\repository\org\springframework\spring-jcl\5.0.9.RELEASE\spring-jcl-5.0.9.RELEASE.jar;E:\repository\org\yaml\snakeyaml\1.19\snakeyaml-1.19.jar;E:\repository\org\springframework\boot\spring-boot-starter-json\2.0.5.RELEASE\spring-boot-starter-json-2.0.5.RELEASE.jar;E:\repository\com\fasterxml\jackson\core\jackson-databind\2.9.6\jackson-databind-2.9.6.jar;E:\repository\com\fasterxml\jackson\core\jackson-annotations\2.9.0\jackson-annotations-2.9.0.jar;E:\repository\com\fasterxml\jackson\core\jackson-core\2.9.6\jackson-core-2.9.6.jar;E:\repository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.9.6\jackson-datatype-jdk8-2.9.6.jar;E:\repository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.9.6\jackson-datatype-jsr310-2.9.6.jar;E:\repository\com\fasterxml\jackson\module\jackson-module-parameter-names\2.9.6\jackson-module-parameter-names-2.9.6.jar;E:\repository\org\springframework\boot\spring-boot-starter-tomcat\2.0.5.RELEASE\spring-boot-starter-tomcat-2.0.5.RELEASE.jar;E:\repository\org\apache\tomcat\embed\tomcat-embed-core\8.5.34\tomcat-embed-core-8.5.34.jar;E:\repository\org\apache\tomcat\embed\tomcat-embed-el\8.5.34\tomcat-embed-el-8.5.34.jar;E:\repository\org\apache\tomcat\embed\tomcat-embed-websocket\8.5.34\tomcat-embed-websocket-8.5.34.jar;E:\repository\org\hibernate\validator\hibernate-validator\6.0.12.Final\hibernate-validator-6.0.12.Final.jar;E:\repository\javax\validation\validation-api\2.0.1.Final\validation-api-2.0.1.Final.jar;E:\repository\org\jboss\logging\jboss-logging\3.3.2.Final\jboss-logging-3.3.2.Final.jar;E:\repository\com\fasterxml\classmate\1.3.4\classmate-1.3.4.jar;E:\repository\org\springframework\spring-web\5.0.9.RELEASE\spring-web-5.0.9.RELEASE.jar;E:\repository\org\springframework\spring-beans\5.0.9.RELEASE\spring-beans-5.0.9.RELEASE.jar;E:\repository\org\springframework\spring-webmvc\5.0.9.RELEASE\spring-webmvc-5.0.9.RELEASE.jar;E:\repository\org\springframework\spring-aop\5.0.9.RELEASE\spring-aop-5.0.9.RELEASE.jar;E:\repository\org\springframework\spring-context\5.0.9.RELEASE\spring-context-5.0.9.RELEASE.jar;E:\repository\org\springframework\spring-expression\5.0.9.RELEASE\spring-expression-5.0.9.RELEASE.jar;E:\repository\org\slf4j\slf4j-simple\1.7.25\slf4j-simple-1.7.25.jar;E:\repository\org\slf4j\slf4j-api\1.7.25\slf4j-api-1.7.25.jar;D:\Program Files\IntelliJ IDEA 2018.3\lib\idea_rt.jar" cn.com.miaosha.App
    Connected to the target VM, address: '127.0.0.1:51555', transport: 'socket'
    Hello World!
    [background-preinit] INFO org.hibernate.validator.internal.util.Version - HV000001: Hibernate Validator 6.0.12.Final
     
      .   ____          _            __ _ _
     /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
    ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
     \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
      '  |____| .__|_| |_|_| |_\__, | / / / /
     =========|_|==============|___/=/_/_/_/
     :: Spring Boot ::        (v2.0.5.RELEASE)
     
    [main] INFO cn.com.miaosha.App - Starting App on SC-201806131812 with PID 13188 (E:\IdeaProjects\miaosha\target\classes started by Administrator in E:\IdeaProjects\miaosha)
    [main] INFO cn.com.miaosha.App - No active profile set, falling back to default profiles: default
    [main] INFO org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext - Refreshing org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@36b4fe2a: startup date [Thu Dec 13 17:07:55 CST 2018]; root of context hierarchy
    [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer - Tomcat initialized with port(s): 8080 (http)
    十二月 13, 2018 5:08:02 下午 org.apache.catalina.core.StandardService startInternal
    信息: Starting service [Tomcat]
    十二月 13, 2018 5:08:02 下午 org.apache.catalina.core.StandardEngine startInternal
    信息: Starting Servlet Engine: Apache Tomcat/8.5.34
    十二月 13, 2018 5:08:02 下午 org.apache.catalina.core.AprLifecycleListener lifecycleEvent
    信息: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: [D:\Program Files\java\jdk1.8\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\ProgramData\Oracle\Java\javapath;C:\Program Files (x86)\Common Files\NetSarang;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\ATI Technologies\ATI.ACE\Core-Static;D:\Program Files\java\jdk1.7\bin;D:\Program Files\mysql-5.7.17\bin;C:\WINDOWS\System32\OpenSSH\;D:\Program Files\Git\cmd;D:\Program Files\TortoiseSVN\bin;C:\Users\Administrator\AppData\Local\Microsoft\WindowsApps;;.]
    十二月 13, 2018 5:08:02 下午 org.apache.catalina.core.ApplicationContext log
    信息: Initializing Spring embedded WebApplicationContext
    [localhost-startStop-1] INFO org.springframework.web.context.ContextLoader - Root WebApplicationContext: initialization completed in 7244 ms
    [localhost-startStop-1] INFO org.springframework.boot.web.servlet.ServletRegistrationBean - Servlet dispatcherServlet mapped to [/]
    [localhost-startStop-1] INFO org.springframework.boot.web.servlet.FilterRegistrationBean - Mapping filter: 'characterEncodingFilter' to: [/*]
    [localhost-startStop-1] INFO org.springframework.boot.web.servlet.FilterRegistrationBean - Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
    [localhost-startStop-1] INFO org.springframework.boot.web.servlet.FilterRegistrationBean - Mapping filter: 'httpPutFormContentFilter' to: [/*]
    [localhost-startStop-1] INFO org.springframework.boot.web.servlet.FilterRegistrationBean - Mapping filter: 'requestContextFilter' to: [/*]
    [main] INFO org.springframework.web.servlet.handler.SimpleUrlHandlerMapping - Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
    [main] INFO org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter - Looking for @ControllerAdvice: org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@36b4fe2a: startup date [Thu Dec 13 17:07:55 CST 2018]; root of context hierarchy
    [main] INFO org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping - Mapped "{[/]}" onto public java.lang.String cn.com.miaosha.App.home(javax.servlet.http.HttpServletRequest)
    [main] INFO org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping - Mapped "{[/error]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController.error(javax.servlet.http.HttpServletRequest)
    [main] INFO org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping - Mapped "{[/error],produces=[text/html]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)
    [main] INFO org.springframework.web.servlet.handler.SimpleUrlHandlerMapping - Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
    [main] INFO org.springframework.web.servlet.handler.SimpleUrlHandlerMapping - Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
    [main] INFO org.springframework.jmx.export.annotation.AnnotationMBeanExporter - Registering beans for JMX exposure on startup
    [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer - Tomcat started on port(s): 8080 (http) with context path ''
    [main] INFO cn.com.miaosha.App - Started App in 11.308 seconds (JVM running for 14.362)
    

    这日志看上去就正常了。

    当然这只是我的解决方法,也许是我的粗心大意吧!如果你也遇到了这种情况可以不妨一试吧。

    展开全文
  • 最详细的Log4J使用教程

    万次阅读 多人点赞 2018-03-11 17:17:55
    地址:http://www.codeceo.com/log4j-usage.html ...在apache网站:jakarta.apache.org/log4j可以免费下载到Log4j最新版本的软件包。 一、入门实例 1.新建一个JAva工程,导入包log4j-1.2.17.jar,整个...

    地址:http://www.codeceo.com/log4j-usage.html

    日志是应用软件中不可缺少的部分,Apache的开源项目log4j是一个功能强大的日志组件,提供方便的日志记录。在apache网站:jakarta.apache.org/log4j 可以免费下载到Log4j最新版本的软件包。

    一、入门实例

    1.新建一个JAva工程,导入包log4j-1.2.17.jar,整个工程最终目录如下

    2、src同级创建并设置log4j.properties

     ### 设置###
    log4j.rootLogger = debug,stdout,D,E
    
    ### 输出信息到控制抬 ###
    log4j.appender.stdout = org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.Target = System.out
    log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
    
    ### 输出DEBUG 级别以上的日志到=E://logs/error.log ###
    log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
    log4j.appender.D.File = E://logs/log.log
    log4j.appender.D.Append = true
    log4j.appender.D.Threshold = DEBUG 
    log4j.appender.D.layout = org.apache.log4j.PatternLayout
    log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n
    
    ### 输出ERROR 级别以上的日志到=E://logs/error.log ###
    log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
    log4j.appender.E.File =E://logs/error.log 
    log4j.appender.E.Append = true
    log4j.appender.E.Threshold = ERROR 
    log4j.appender.E.layout = org.apache.log4j.PatternLayout
    log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n### 设置###
    log4j.rootLogger = debug,stdout,D,E
    
    ### 输出信息到控制抬 ###
    log4j.appender.stdout = org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.Target = System.out
    log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
    
    ### 输出DEBUG 级别以上的日志到=E://logs/error.log ###
    log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
    log4j.appender.D.File = E://logs/log.log
    log4j.appender.D.Append = true
    log4j.appender.D.Threshold = DEBUG 
    log4j.appender.D.layout = org.apache.log4j.PatternLayout
    log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n
    
    ### 输出ERROR 级别以上的日志到=E://logs/error.log ###
    log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
    log4j.appender.E.File =E://logs/error.log 
    log4j.appender.E.Append = true
    log4j.appender.E.Threshold = ERROR 
    log4j.appender.E.layout = org.apache.log4j.PatternLayout
    log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

    3、设置日志内容

    package com.mucfc;
    import org.apache.log4j.Logger;
    /**
     *@author linbingwen
     *@2015年5月18日9:14:21
     */
    public class Test {
    	private static Logger logger = Logger.getLogger(Test.class);  
    
        /** 
         * @param args 
         */  
        public static void main(String[] args) {  
            // System.out.println("This is println message.");  
    
            // 记录debug级别的信息  
            logger.debug("This is debug message.");  
            // 记录info级别的信息  
            logger.info("This is info message.");  
            // 记录error级别的信息  
            logger.error("This is error message.");  
        }  
    
    } com.mucfc;
    import org.apache.log4j.Logger;
    /**
     *@author linbingwen
     *@2015年5月18日9:14:21
     */
    public class Test {
    	private static Logger logger = Logger.getLogger(Test.class);  
    
        /** 
         * @param args 
         */  
        public static void main(String[] args) {  
            // System.out.println("This is println message.");  
    
            // 记录debug级别的信息  
            logger.debug("This is debug message.");  
            // 记录info级别的信息  
            logger.info("This is info message.");  
            // 记录error级别的信息  
            logger.error("This is error message.");  
        }  
    
    }

    4、输出结果

    (1)首先是控制台的信息

    (2)再来看输出的文件

    内容如下,发现已按照要求输出到对应的文档中去了。

    二、Log4j基本使用方法

    Log4j由三个重要的组件构成:日志信息的优先级,日志信息的输出目的地,日志信息的输出格式。日志信息的优先级从高到低有ERROR、WARN、 INFO、DEBUG,分别用来指定这条日志信息的重要程度;日志信息的输出目的地指定了日志将打印到控制台还是文件中;而输出格式则控制了日志信息的显 示内容。

    2.1、定义配置文件

    其实您也可以完全不使用配置文件,而是在代码中配置Log4j环境。但是,使用配置文件将使您的应用程序更加灵活。Log4j支持两种配置文件格式,一种是XML格式的文件,一种是Java特性文件(键=值)。下面我们介绍使用Java特性文件做为配置文件的方法:
    1.配置根Logger,其语法为:

    log4j.rootLogger = [ level ] , appenderName, appenderName, …4j.rootLogger = [ level ] , appenderName, appenderName, …

    其中,level 是日志记录的优先级,分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定义的级别。Log4j建议只使用四个级别,优 先级从高到低分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关。比如在这里定 义了INFO级别,则应用程序中所有DEBUG级别的日志信息将不被打印出来。 appenderName就是指B日志信息输出到哪个地方。您可以同时指定多个输出目的地。

    2.配置日志信息输出目的地Appender,其语法为:

    log4j.appender.appenderName = fully.qualified.name.of.appender.class  
    log4j.appender.appenderName.option1 = value1  
    …  
    log4j.appender.appenderName.option = valueN4j.appender.appenderName = fully.qualified.name.of.appender.class  
    log4j.appender.appenderName.option1 = value1  
    …  
    log4j.appender.appenderName.option = valueN

    其中,Log4j提供的appender有以下几种:

    org.apache.log4j.ConsoleAppender(控制台),  
    org.apache.log4j.FileAppender(文件),  
    org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),  
    org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),  
    org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方).apache.log4j.ConsoleAppender(控制台),  
    org.apache.log4j.FileAppender(文件),  
    org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),  
    org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),  
    org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)

    3.配置日志信息的格式(布局),其语法为:

    log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class  
    log4j.appender.appenderName.layout.option1 = value1  
    …  
    log4j.appender.appenderName.layout.option = valueN4j.appender.appenderName.layout = fully.qualified.name.of.layout.class  
    log4j.appender.appenderName.layout.option1 = value1  
    …  
    log4j.appender.appenderName.layout.option = valueN

    其中,Log4j提供的layout有以e几种:

    org.apache.log4j.HTMLLayout(以HTML表格形式布局),  
    org.apache.log4j.PatternLayout(可以灵活地指定布局模式),  
    org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),  
    org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息).apache.log4j.HTMLLayout(以HTML表格形式布局),  
    org.apache.log4j.PatternLayout(可以灵活地指定布局模式),  
    org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),  
    org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)

    Log4J采用类似C语言中的printf函数的打印格式格式化日志信息,打印参数如下: %m 输出代码中指定的消息

    %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL  
    %r 输出自应用启动到输出该log信息耗费的毫秒数  
    %c 输出所属的类目,通常就是所在类的全名  
    %t 输出产生该日志事件的线程名  
    %n 输出一个回车换行符,Windows平台为“rn”,Unix平台为“n”  
    %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:20021018221028921  
    %l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)log信息耗费的毫秒数  
    %c 输出所属的类目,通常就是所在类的全名  
    %t 输出产生该日志事件的线程名  
    %n 输出一个回车换行符,Windows平台为“rn”,Unix平台为“n”  
    %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:20021018221028921  
    %l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)

    2.2、在代码中使用Log4j

    1.得到记录器

    使用Log4j,第一步就是获取日志记录器,这个记录器将负责控制日志信息。其语法为:

    public static Logger getLogger( String name)

    通过指定的名字获得记录器,如果必要的话,则为这个名字创建一个新的记录器。Name一般取本类的名字,比如:

    static Logger logger = Logger.getLogger ( ServerWithLog4j.class.getName () )

    2.读取配置文件

    当获得了日志记录器之后,第二步将配置Log4j环境,其语法为:

    BasicConfigurator.configure (): 自动快速地使用缺省Log4j环境。  
    PropertyConfigurator.configure ( String configFilename) :读取使用Java的特性文件编写的配置文件。  
    DOMConfigurator.configure ( String filename ) :读取XML形式的配置文件。.configure (): 自动快速地使用缺省Log4j环境。  
    PropertyConfigurator.configure ( String configFilename) :读取使用Java的特性文件编写的配置文件。  
    DOMConfigurator.configure ( String filename ) :读取XML形式的配置文件。

    3.插入记录信息(格式化日志信息)

    当上两个必要步骤执行完毕,您就可以轻松地使用不同优先级别的日志记录语句插入到您想记录日志的任何地方,其语法如下:

    Logger.debug ( Object message ) ;  
    Logger.info ( Object message ) ;  
    Logger.warn ( Object message ) ;  
    Logger.error ( Object message ) ;.debug ( Object message ) ;  
    Logger.info ( Object message ) ;  
    Logger.warn ( Object message ) ;  
    Logger.error ( Object message ) ;

    2.3、日志级别

    每个Logger都被了一个日志级别(log level),用来控制日志信息的输出。日志级别从高到低分为:
    A:off 最高等级,用于关闭所有日志记录。
    B:fatal 指出每个严重的错误事件将会导致应用程序的退出。
    C:error 指出虽然发生错误事件,但仍然不影响系统的继续运行。
    D:warm 表明会出现潜在的错误情形。
    E:info 一般和在粗粒度级别上,强调应用程序的运行全程。
    F:debug 一般用于细粒度级别上,对调试应用程序非常有帮助。
    G:all 最低等级,用于打开所有日志记录。

    上面这些级别是定义在org.apache.log4j.Level类中。Log4j只建议使用4个级别,优先级从高到低分别是error,warn,info和debug。通过使用日志级别,可以控制应用程序中相应级别日志信息的输出。例如,如果使用b了info级别,则应用程序中所有低于info级别的日志信息(如debug)将不会被打印出来。

    三、Web项目中使用Log4j实例

    上面代码描述了Log4j的简单应用,其实使用Log4j也就是这样简单方便。当然除了上面的配置方法,还有其它,比如做一个J2EE应用,在J2EE应用使用Log4j,必须先在启动服务时加载Log4j的配置文件进行初始化,可以在web.xml中进行。

    1、web应用的log4j使用基本上都采用:新建一个servlet,这个servlet在init函数中为log4j执行配置。一般就是读入配置文件。所以需要在web.xml中为这个servlet配置,同时设定load-on-startup为1。

    2、这个servlet配置log4j就是读出配置文件,然后调用configure函数。这里有两个问题:一、需要知道文件在哪里;二、需要正确的文件类型

    3、配置文件位置在web.xml中配置一个param即可,路径一般是相对于web的root目录

    4、文件类型一般有两种,一个是Java的property文件,另一种是xml文件

    配置文件的大致内容:log4j可以指定输出的log级别的最低等级,以及log的输出配置格式,每个log可以指定多个输出方式

    (1)创建Web工程,整个工程最后目录如下

    (2)web.xml配置如下:

    <?xml version="1.0" encoding="UTF-8"?>  
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
        xmlns="http://java.sun.com/xml/ns/javaee"  
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"  
        id="WebApp_ID" version="3.0">  
        <display-name>LogLearning</display-name>  
    
        <servlet>  
            <servlet-name>Log4JTestServlet</servlet-name>  
            <servlet-class>com.mucfc.Log4JTestServlet</servlet-class>  
        </servlet>  
    
        <!--用来启动 log4jConfigLocation的servlet -->  
        <servlet>  
            <servlet-name>Log4JInitServlet</servlet-name>  
            <servlet-class>com.mucfc.Log4JInitServlet</servlet-class>  
            <init-param>  
                <param-name>log4j-properties-location</param-name>  
                <param-value>/WEB-INF/classes/log4j.properties</param-value>  
            </init-param>  
            <load-on-startup>1</load-on-startup>  
        </servlet>  
    
        <servlet-mapping>  
            <servlet-name>Log4JTestServlet</servlet-name>  
            <url-pattern>/test</url-pattern>  
        </servlet-mapping>  
    
    </web-app>xml version="1.0" encoding="UTF-8"?>  
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
        xmlns="http://java.sun.com/xml/ns/javaee"  
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"  
        id="WebApp_ID" version="3.0">  
        <display-name>LogLearning</display-name>  
    
        <servlet>  
            <servlet-name>Log4JTestServlet</servlet-name>  
            <servlet-class>com.mucfc.Log4JTestServlet</servlet-class>  
        </servlet>  
    
        <!--用来启动 log4jConfigLocation的servlet -->  
        <servlet>  
            <servlet-name>Log4JInitServlet</servlet-name>  
            <servlet-class>com.mucfc.Log4JInitServlet</servlet-class>  
            <init-param>  
                <param-name>log4j-properties-location</param-name>  
                <param-value>/WEB-INF/classes/log4j.properties</param-value>  
            </init-param>  
            <load-on-startup>1</load-on-startup>  
        </servlet>  
    
        <servlet-mapping>  
            <servlet-name>Log4JTestServlet</servlet-name>  
            <url-pattern>/test</url-pattern>  
        </servlet-mapping>  
    
    </web-app>

    (3)配置文件log4j.properties

     ### set log levels ###  
    log4j.rootLogger = debug,stdout,D,E  
    
    log4j.appender.stdout = org.apache.log4j.ConsoleAppender  
    log4j.appender.stdout.Target = System.out  
    log4j.appender.stdout.layout = org.apache.log4j.PatternLayout  
    log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n  
    
    log4j.appender.D = org.apache.log4j.DailyRollingFileAppender  
    log4j.appender.D.File = F://logs/log.log  
    log4j.appender.D.Append = true  
    log4j.appender.D.Threshold = DEBUG   
    log4j.appender.D.layout = org.apache.log4j.PatternLayout  
    log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n  
    
    log4j.appender.E = org.apache.log4j.DailyRollingFileAppender  
    log4j.appender.E.File =F://logs/error.log   
    log4j.appender.E.Append = true  
    log4j.appender.E.Threshold = ERROR   
    log4j.appender.E.layout = org.apache.log4j.PatternLayout  
    log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n### set log levels ###  
    log4j.rootLogger = debug,stdout,D,E  
    
    log4j.appender.stdout = org.apache.log4j.ConsoleAppender  
    log4j.appender.stdout.Target = System.out  
    log4j.appender.stdout.layout = org.apache.log4j.PatternLayout  
    log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n  
    
    log4j.appender.D = org.apache.log4j.DailyRollingFileAppender  
    log4j.appender.D.File = F://logs/log.log  
    log4j.appender.D.Append = true  
    log4j.appender.D.Threshold = DEBUG   
    log4j.appender.D.layout = org.apache.log4j.PatternLayout  
    log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n  
    
    log4j.appender.E = org.apache.log4j.DailyRollingFileAppender  
    log4j.appender.E.File =F://logs/error.log   
    log4j.appender.E.Append = true  
    log4j.appender.E.Threshold = ERROR   
    log4j.appender.E.layout = org.apache.log4j.PatternLayout  
    log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

    (4)web容器一来就初始化的servlet

    Log4JInitServlet.java

    package com.mucfc;  
    
    import java.io.File;  
    import java.io.IOException;  
    
    import javax.servlet.ServletConfig;  
    import javax.servlet.ServletContext;  
    import javax.servlet.ServletException;  
    import javax.servlet.annotation.WebServlet;  
    import javax.servlet.http.HttpServlet;  
    import javax.servlet.http.HttpServletRequest;  
    import javax.servlet.http.HttpServletResponse;  
    
    import org.apache.log4j.BasicConfigurator;  
    import org.apache.log4j.PropertyConfigurator;  
    
    /** 
     * Servlet implementation class Log4JInitServlet 
     */  
    @WebServlet("/Log4JInitServlet")  
    public class Log4JInitServlet extends HttpServlet {  
        private static final long serialVersionUID = 1L;  
    
        /** 
         * @see HttpServlet#HttpServlet() 
         */  
        public Log4JInitServlet() {  
            super();  
            // TODO Auto-generated constructor stub  
        }  
    
        /** 
         * @see Servlet#init(ServletConfig) 
         */  
        public void init(ServletConfig config) throws ServletException {  
            System.out.println("Log4JInitServlet 正在初始化 log4j日志设置信息");  
            String log4jLocation = config.getInitParameter("log4j-properties-location");  
    
            ServletContext sc = config.getServletContext();  
    
            if (log4jLocation == null) {  
                System.err.println("*** 没有 log4j-properties-location 初始化的文件, 所以使用 BasicConfigurator初始化");  
                BasicConfigurator.configure();  
            } else {  
                String webAppPath = sc.getRealPath("/");  
                String log4jProp = webAppPath + log4jLocation;  
                File yoMamaYesThisSaysYoMama = new File(log4jProp);  
                if (yoMamaYesThisSaysYoMama.exists()) {  
                    System.out.println("使用: " + log4jProp+"初始化日志设置信息");  
                    PropertyConfigurator.configure(log4jProp);  
                } else {  
                    System.err.println("*** " + log4jProp + " 文件没有找到, 所以使用 BasicConfigurator初始化");  
                    BasicConfigurator.configure();  
                }  
            }  
            super.init(config);  
        }  
    
        /** 
         * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 
         */  
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
            // TODO Auto-generated method stub  
        }  
    
        /** 
         * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 
         */  
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
            // TODO Auto-generated method stub  
        }  
    
    }import java.io.File;  
    import java.io.IOException;  
    
    import javax.servlet.ServletConfig;  
    import javax.servlet.ServletContext;  
    import javax.servlet.ServletException;  
    import javax.servlet.annotation.WebServlet;  
    import javax.servlet.http.HttpServlet;  
    import javax.servlet.http.HttpServletRequest;  
    import javax.servlet.http.HttpServletResponse;  
    
    import org.apache.log4j.BasicConfigurator;  
    import org.apache.log4j.PropertyConfigurator;  
    
    /** 
     * Servlet implementation class Log4JInitServlet 
     */  
    @WebServlet("/Log4JInitServlet")  
    public class Log4JInitServlet extends HttpServlet {  
        private static final long serialVersionUID = 1L;  
    
        /** 
         * @see HttpServlet#HttpServlet() 
         */  
        public Log4JInitServlet() {  
            super();  
            // TODO Auto-generated constructor stub  
        }  
    
        /** 
         * @see Servlet#init(ServletConfig) 
         */  
        public void init(ServletConfig config) throws ServletException {  
            System.out.println("Log4JInitServlet 正在初始化 log4j日志设置信息");  
            String log4jLocation = config.getInitParameter("log4j-properties-location");  
    
            ServletContext sc = config.getServletContext();  
    
            if (log4jLocation == null) {  
                System.err.println("*** 没有 log4j-properties-location 初始化的文件, 所以使用 BasicConfigurator初始化");  
                BasicConfigurator.configure();  
            } else {  
                String webAppPath = sc.getRealPath("/");  
                String log4jProp = webAppPath + log4jLocation;  
                File yoMamaYesThisSaysYoMama = new File(log4jProp);  
                if (yoMamaYesThisSaysYoMama.exists()) {  
                    System.out.println("使用: " + log4jProp+"初始化日志设置信息");  
                    PropertyConfigurator.configure(log4jProp);  
                } else {  
                    System.err.println("*** " + log4jProp + " 文件没有找到, 所以使用 BasicConfigurator初始化");  
                    BasicConfigurator.configure();  
                }  
            }  
            super.init(config);  
        }  
    
        /** 
         * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 
         */  
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
            // TODO Auto-generated method stub  
        }  
    
        /** 
         * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 
         */  
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
            // TODO Auto-generated method stub  
        }  
    
    }

    调用日志Log4JTestServlet,java

    package com.mucfc;  
    
    import java.io.IOException;  
    
    import javax.servlet.ServletConfig;  
    import javax.servlet.ServletException;  
    import javax.servlet.annotation.WebServlet;  
    import javax.servlet.http.HttpServlet;  
    import javax.servlet.http.HttpServletRequest;  
    import javax.servlet.http.HttpServletResponse;  
    
    import org.apache.log4j.Logger;  
    
    /** 
     * Servlet implementation class Log4JTestServlet 
     */  
    @WebServlet("/Log4JTestServlet")  
    public class Log4JTestServlet extends HttpServlet {  
        private static final long serialVersionUID = 1L;  
        private static Logger logger = Logger.getLogger(Log4JTestServlet.class);    
    
        /** 
         * @see HttpServlet#HttpServlet() 
         */  
        public Log4JTestServlet() {  
            super();  
            // TODO Auto-generated constructor stub  
        }  
    
        /** 
         * @see Servlet#init(ServletConfig) 
         */  
        public void init(ServletConfig config) throws ServletException {  
            // TODO Auto-generated method stub  
        }  
    
        /** 
         * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 
         */  
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
            // 记录debug级别的信息    
            logger.debug("This is debug message.");    
            // 记录info级别的信息    
            logger.info("This is info message.");    
            // 记录error级别的信息    
            logger.error("This is error message.");    
        }  
    
        /** 
         * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 
         */  
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
            doGet(request,response);  
        }  
    
    } com.mucfc;  
    
    import java.io.IOException;  
    
    import javax.servlet.ServletConfig;  
    import javax.servlet.ServletException;  
    import javax.servlet.annotation.WebServlet;  
    import javax.servlet.http.HttpServlet;  
    import javax.servlet.http.HttpServletRequest;  
    import javax.servlet.http.HttpServletResponse;  
    
    import org.apache.log4j.Logger;  
    
    /** 
     * Servlet implementation class Log4JTestServlet 
     */  
    @WebServlet("/Log4JTestServlet")  
    public class Log4JTestServlet extends HttpServlet {  
        private static final long serialVersionUID = 1L;  
        private static Logger logger = Logger.getLogger(Log4JTestServlet.class);    
    
        /** 
         * @see HttpServlet#HttpServlet() 
         */  
        public Log4JTestServlet() {  
            super();  
            // TODO Auto-generated constructor stub  
        }  
    
        /** 
         * @see Servlet#init(ServletConfig) 
         */  
        public void init(ServletConfig config) throws ServletException {  
            // TODO Auto-generated method stub  
        }  
    
        /** 
         * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 
         */  
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
            // 记录debug级别的信息    
            logger.debug("This is debug message.");    
            // 记录info级别的信息    
            logger.info("This is info message.");    
            // 记录error级别的信息    
            logger.error("This is error message.");    
        }  
    
        /** 
         * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 
         */  
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
            doGet(request,response);  
        }  
    
    }

    接下来就是运行了,来看看结果:

    输出结果:

    四、Spring中使用Log4j

    这里要实现web项目中利用Spring来使用Log4j

    (1)接上面的工程,然后再导入Spring的包

    (2)web.xml增加

    <!-- 设置根目录 -->  
       <context-param>    
           <param-name>webAppRootKey</param-name>    
           <param-value>webapp.root</param-value>    
       </context-param>    
    
       <context-param>  
        <param-name>log4jConfigLocation</param-name>  
        <param-value>/WEB-INF/classes/log4j.properties</param-value>  
    </context-param>  
    <!-- 3000表示 开一条watchdog线程每60秒扫描一下配置文件的变化;这样便于日志存放位置的改变 -->  
    <context-param>    
            <param-name>log4jRefreshInterval</param-name>    
            <param-value>3000</param-value>    
       </context-param>   
    <listener>  
        <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>  
    </listener>  
       <context-param>    
           <param-name>webAppRootKey</param-name>    
           <param-value>webapp.root</param-value>    
       </context-param>    
    
       <context-param>  
        <param-name>log4jConfigLocation</param-name>  
        <param-value>/WEB-INF/classes/log4j.properties</param-value>  
    </context-param>  
    <!-- 3000表示 开一条watchdog线程每60秒扫描一下配置文件的变化;这样便于日志存放位置的改变 -->  
    <context-param>    
            <param-name>log4jRefreshInterval</param-name>    
            <param-value>3000</param-value>    
       </context-param>   
    <listener>  
        <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>  
    </listener>

    整个内容如下:

    <?xml version="1.0" encoding="UTF-8"?>  
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
        xmlns="http://java.sun.com/xml/ns/javaee"  
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"  
        id="WebApp_ID" version="3.0">  
        <display-name>LogLearning</display-name>  
    
        <servlet>  
            <servlet-name>Log4JTestServlet</servlet-name>  
            <servlet-class>com.mucfc.Log4JTestServlet</servlet-class>  
        </servlet>  
    
        <!--用来启动 log4jConfigLocation的servlet -->  
    <!--     <servlet>  
            <servlet-name>Log4JInitServlet</servlet-name>  
            <servlet-class>com.mucfc.Log4JInitServlet</servlet-class>  
            <init-param>  
                <param-name>log4j-properties-location</param-name>  
                <param-value>/WEB-INF/classes/log4j.properties</param-value>  
            </init-param>  
            <load-on-startup>1</load-on-startup>  
        </servlet>-->  
    
        <servlet-mapping>  
            <servlet-name>Log4JTestServlet</servlet-name>  
            <url-pattern>/test</url-pattern>  
        </servlet-mapping>   
    
            <!-- Spring 容器加载 -->  
        <listener>  
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
        </listener>  
        <context-param>  
            <param-name>contextConfigLocation</param-name>  
            <param-value>classpath:applicationContext.xml</param-value>  
        </context-param>   
    
        <!-- 设置根目录 -->  
        <context-param>    
            <param-name>webAppRootKey</param-name>    
            <param-value>webapp.root</param-value>    
        </context-param>    
    
        <context-param>  
            <param-name>log4jConfigLocation</param-name>  
            <param-value>/WEB-INF/classes/log4j.properties</param-value>  
        </context-param>  
        <!-- 3000表示 开一条watchdog线程每60秒扫描一下配置文件的变化;这样便于日志存放位置的改变 -->  
        <context-param>    
             <param-name>log4jRefreshInterval</param-name>    
             <param-value>3000</param-value>    
        </context-param>   
        <listener>  
            <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>  
        </listener>   
    
    </web-app>xml version="1.0" encoding="UTF-8"?>  
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
        xmlns="http://java.sun.com/xml/ns/javaee"  
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"  
        id="WebApp_ID" version="3.0">  
        <display-name>LogLearning</display-name>  
    
        <servlet>  
            <servlet-name>Log4JTestServlet</servlet-name>  
            <servlet-class>com.mucfc.Log4JTestServlet</servlet-class>  
        </servlet>  
    
        <!--用来启动 log4jConfigLocation的servlet -->  
    <!--     <servlet>  
            <servlet-name>Log4JInitServlet</servlet-name>  
            <servlet-class>com.mucfc.Log4JInitServlet</servlet-class>  
            <init-param>  
                <param-name>log4j-properties-location</param-name>  
                <param-value>/WEB-INF/classes/log4j.properties</param-value>  
            </init-param>  
            <load-on-startup>1</load-on-startup>  
        </servlet>-->  
    
        <servlet-mapping>  
            <servlet-name>Log4JTestServlet</servlet-name>  
            <url-pattern>/test</url-pattern>  
        </servlet-mapping>   
    
            <!-- Spring 容器加载 -->  
        <listener>  
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
        </listener>  
        <context-param>  
            <param-name>contextConfigLocation</param-name>  
            <param-value>classpath:applicationContext.xml</param-value>  
        </context-param>   
    
        <!-- 设置根目录 -->  
        <context-param>    
            <param-name>webAppRootKey</param-name>    
            <param-value>webapp.root</param-value>    
        </context-param>    
    
        <context-param>  
            <param-name>log4jConfigLocation</param-name>  
            <param-value>/WEB-INF/classes/log4j.properties</param-value>  
        </context-param>  
        <!-- 3000表示 开一条watchdog线程每60秒扫描一下配置文件的变化;这样便于日志存放位置的改变 -->  
        <context-param>    
             <param-name>log4jRefreshInterval</param-name>    
             <param-value>3000</param-value>    
        </context-param>   
        <listener>  
            <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>  
        </listener>   
    
    </web-app>

    这里Log4JInitServlet.java就相当于没用到了。

    (2)applicationContext.xml

    没有内容:

    <?xml version="1.0" encoding="UTF-8"?>  
    <beans xmlns="http://www.springframework.org/schema/beans"  
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"  
        xmlns:aop="http://www.springframework.org/schema/aop"  
        xsi:schemaLocation="    
    
    http://www.springframework.org/schema/beans
    
    
    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
    
    
    http://www.springframework.org/schema/aop
    
    
    http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
    
    
    http://www.springframework.org/schema/context
    
               http://www.springframework.org/schema/context/spring-context-3.2.xsd">  
    </beans>xml version="1.0" encoding="UTF-8"?>  
    <beans xmlns="http://www.springframework.org/schema/beans"  
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"  
        xmlns:aop="http://www.springframework.org/schema/aop"  
        xsi:schemaLocation="    
    
    http://www.springframework.org/schema/beans
    
    
    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
    
    
    http://www.springframework.org/schema/aop
    
    
    http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
    
    
    http://www.springframework.org/schema/context
    
               http://www.springframework.org/schema/context/spring-context-3.2.xsd">  
    </beans>

    (3)这样日志就跟随Spring窗口启动而启动了

    程序一运行,就会自动把日志打印

    log.log

    error.log为空,因为它只打印error级别以上的信息

    浏览器输入http://localhost:8080/LogLearning2/test

    然后打开文件

     

     

    展开全文
  • dom4j 官方绿色完整jar包

    万次下载 热门讨论 2011-03-15 23:21:49
    dom4j完整jar包 下载 包括 dom4j-1.6.1.rar jaxen-1.1-beta-7.rar sitemesh-2.2.1.rar
  • log4j 配置日志输出(log4j.properties)

    万次阅读 多人点赞 2018-05-27 11:19:27
    2018年5月27日一、入门log4j实例1.1 下载解压log4j.jar

    2018年5月27日

    欢迎扫二维码关注公众号,获取技干术货。

    一、入门log4j实例

    1.1 下载解压log4j.jar(地址:http://mirrors.hust.edu.cn/apache/logging/log4j/2.11.0/

    1.2 新建工程,导入jar包

    1.3 Log4jTest.java:

    package test6;
    
    import org.apache.log4j.Logger;
    /**
     * @author mmb
     * @function test log4j
     * */
    public class Log4jTest {
    	
    	private static Logger logger = Logger.getLogger(Log4jTest.class);  
    	
    	public static void main(String [] args){
    		
    		//BasicConfigurator.configure(); //自动快速地使用缺省Log4j环境。
    		
    		logger.info("aaaa");
    		
    		logger.debug("bbbb");
    		
    		logger.error("cccc");
    		
    	}
    }
    

    1.4 log4j.properties

     ### 设置###
    log4j.rootLogger = debug,stdout,D,E
    
    ### 输出信息到控制抬 ###
    log4j.appender.stdout = org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.Target = System.out
    log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
    
    ### 输出DEBUG 级别以上的日志到=E://logs/error.log ###
    log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
    log4j.appender.D.File = E://logs/log.log
    log4j.appender.D.Append = true
    log4j.appender.D.Threshold = DEBUG 
    log4j.appender.D.layout = org.apache.log4j.PatternLayout
    log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n
    
    ### 输出ERROR 级别以上的日志到=E://logs/error.log ###
    log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
    log4j.appender.E.File =E://logs/error.log 
    log4j.appender.E.Append = true
    log4j.appender.E.Threshold = ERROR 
    log4j.appender.E.layout = org.apache.log4j.PatternLayout
    log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

    1.5 输出

     

    二、log4j 详细配置

    参考blog:https://blog.csdn.net/azheng270/article/details/2173430/

     

    展开全文
  • log4j2 实际使用详解

    万次阅读 多人点赞 2017-05-12 19:31:07
    日志框架简单比较(slf4j、log4j、logback、log4j2 ) log4j2基础知识 log4j2实用配置 实战部分 slf4j + log4j2 实际使用 二、日志框架比较(slf4j、log4j、logback、log4j2 ) 日志接口(slf4j) slf4j是对所有日志...

    分享一个朋友的人工智能教程(请以“右键”->"在新标签页中打开连接”的方式访问)。比较通俗易懂,风趣幽默,感兴趣的朋友可以去看看。

    一、目录简介

    • 基础部分
      • 日志框架简单比较(slf4j、log4j、logback、log4j2 )
      • log4j2基础示例
      • log4j2配置文件
    • 实战部分
      • slf4j + log4j2 实际使用

    二、日志框架比较(slf4j、log4j、logback、log4j2 )

    • 日志接口(slf4j)
      slf4j是对所有日志框架制定的一种规范、标准、接口,并不是一个框架的具体的实现,因为接口并不能独立使用,需要和具体的日志框架实现配合使用(如log4j、logback)

    • 日志实现(log4j、logback、log4j2)

      • log4j是apache实现的一个开源日志组件
      • logback同样是由log4j的作者设计完成的,拥有更好的特性,用来取代log4j的一个日志框架,是slf4j的原生实现
      • Log4j2是log4j 1.x和logback的改进版,据说采用了一些新技术(无锁异步、等等),使得日志的吞吐量、性能比log4j 1.x提高10倍,并解决了一些死锁的bug,而且配置更加简单灵活,官网地址: http://logging.apache.org/log4j/2.x/manual/configuration.html
    • 为什么需要日志接口,直接使用具体的实现不就行了吗?

      接口用于定制规范,可以有多个实现,使用时是面向接口的(导入的包都是slf4j的包而不是具体某个日志框架中的包),即直接和接口交互,不直接使用实现,所以可以任意的更换实现而不用更改代码中的日志相关代码。

      比如:slf4j定义了一套日志接口,项目中使用的日志框架是logback,开发中调用的所有接口都是slf4j的,不直接使用logback,调用是 自己的工程调用slf4j的接口,slf4j的接口去调用logback的实现,可以看到整个过程应用程序并没有直接使用logback,当项目需要更换更加优秀的日志框架时(如log4j2)只需要引入Log4j2的jar和Log4j2对应的配置文件即可,完全不用更改Java代码中的日志相关的代码logger.info(“xxx”),也不用修改日志相关的类的导入的包(import org.slf4j.Logger;
      import org.slf4j.LoggerFactory;)

      使用日志接口便于更换为其他日志框架。

      log4j、logback、log4j2都是一种日志具体实现框架,所以既可以单独使用也可以结合slf4j一起搭配使用)


    三、log4j2基础示例

    1. 创建maven web 项目, 结构如下
      这里写图片描述

    2. 配置pom.xml,引入log4j2必要的依赖(log4j-api、log4j-core)

    <properties>
      	<junit.version>3.8.1</junit.version>
      	<log4j.version>2.5</log4j.version>
    </properties>
    
    <!-- 使用aliyun镜像 -->
    <repositories>
      <repository>
          <id>aliyun</id>
          <name>aliyun</name>
          <url>http://maven.aliyun.com/nexus/content/groups/public</url>
      </repository>
    </repositories>
    
    <dependencies>
    	<dependency>  
            <groupId>org.apache.logging.log4j</groupId>  
            <artifactId>log4j-api</artifactId>  
            <version>${log4j.version}</version>  
        </dependency>  
        <dependency>  
            <groupId>org.apache.logging.log4j</groupId>  
            <artifactId>log4j-core</artifactId>  
            <version>${log4j.version}</version>  
        </dependency>  
    </dependencies>
    

    3、 使用Main方法简单测试
    这里写图片描述

    测试说明:

    1. 工程中只引入的jar并没有引入任何配置文件,在测试的时候可以看到有ERROR输出:“ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console.”

    2. 输出logger时可以看到只有error和fatal级别的被输出来,是因为没有配置文件就使用默认的,默认级别是error,所以只有error和fatal输出来

    3. 引入的包是log4j本身的包(import org.apache.logging.log4j.LogManager)


    四:log2j 配置文件详解

    配置文件的格式和位置

    配置文件的格式:log2j配置文件可以是xml格式的,也可以是json格式的,
    配置文件的位置:log4j2默认会在classpath目录下寻找log4j2.xml、log4j.json、log4j.jsn等名称的文件,如果都没有找到,则会按默认配置输出,也就是输出到控制台,也可以对配置文件自定义位置(需要在web.xml中配置),一般放置在src/main/resources根目录下即可
    这里写图片描述

    纯Java方式:

    public static void main(String[] args) throws IOException {  
        File file = new File("D:/log4j2.xml");  
        BufferedInputStream in = new BufferedInputStream(new FileInputStream(file));  
        final ConfigurationSource source = new ConfigurationSource(in);  
        Configurator.initialize(null, source);  
          
        Logger logger = LogManager.getLogger("myLogger");  
    } 
    

    Web工程方式:

    <context-param>  
        <param-name>log4jConfiguration</param-name>  
        <param-value>/WEB-INF/conf/log4j2.xml</param-value>  
    </context-param>  
      
    <listener>  
        <listener-class>org.apache.logging.log4j.web.Log4jServletContextListener</listener-class>  
    </listener> 
    

    示例一:简单配置(使用根控制器输出到控制台上)

    log4j2.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <Configuration status="WARN">  
        <Appenders>  
            <Console name="Console" target="SYSTEM_OUT">  
                <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />  
            </Console>  
        </Appenders>  
        
        <Loggers>  
            <Root level="info">  
                <AppenderRef ref="Console" />  
            </Root>  
        </Loggers>  
    </Configuration>
    

    示例结果:

    这里写图片描述

    结果解释:
    日志管理器获取的是根日志器LogManager.getLogger(LogManager.ROOT_LOGGER_NAME);
    对应的log4j2.xml中的Loggers节点下的Root,因为该根日志器的level=“info”,所以输出的info级别以上的日志


    示例二:File Logger

    <?xml version="1.0" encoding="UTF-8"?>
    <Configuration status="WARN">  
        <Appenders>  
            <Console name="Console" target="SYSTEM_OUT">  
                <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />  
            </Console>
            
            <File name="FileAppender" fileName="D:/logs/app.log">  
                <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />  
            </File>  
            
            <!-- 发现Async 好像PatternLayout的输出格式配置的和输出的格式不一样,不用异步就完全一样  -->
            <Async name="AsyncAppender">
    	    <AppenderRef ref="FileAppender"/>
        	</Async>
        </Appenders>  
        
        <Loggers>  
        	<Logger name="AsyncFileLogger" level="trace" additivity="true">  
    	        <AppenderRef ref="AsyncAppender" />  
    		</Logger>
            <Root level="info">  
                <AppenderRef ref="Console" />  
            </Root>  
        </Loggers>  
    </Configuration>
    
    import org.apache.logging.log4j.LogManager;
    import org.apache.logging.log4j.Logger;
    
    public class Log4j2Test {
    
    	public static void main(String[] args) {
    		Logger logger = LogManager.getLogger("AsyncFileLogger"); // Logger的名称
    		
    		logger.trace("trace level");
    		logger.debug("debug level");
    		logger.info("info level");
    		logger.warn("warn level");
    		logger.error("error level");
    		logger.fatal("fatal level");
    	}
    }
    
    

    AsyncFileLogger的additivity的值如果为false的话,就不会在控制台上输出或者为该Logger再增加一个输出源Consloe

    <Logger name="AsyncFileLogger" level="trace" additivity="false">  
    	<AppenderRef ref="AsyncAppender" />  
    	<AppenderRef ref="Console" />  
    </Logger>
    

    示例三: RollingRandomAccessFile

    <?xml version="1.0" encoding="UTF-8"?>
    <Configuration status="WARN"> 
    	<properties>
    		<property name="LOG_HOME">D:/logs</property>
    		<property name="FILE_NAME">mylog</property>
    	</properties>
    	
    	 
        <Appenders>  
            <Console name="Console" target="SYSTEM_OUT">  
                <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />  
            </Console>
            
            <RollingRandomAccessFile name="RollingRandomAccessFile" fileName="${LOG_HOME}/${FILE_NAME}.log" filePattern="${LOG_HOME}/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd HH-mm}-%i.log">
            	<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
            	<Policies>
            		<TimeBasedTriggeringPolicy interval="1"/>
            		<SizeBasedTriggeringPolicy size="10 MB"/>
            	</Policies>
            	<DefaultRolloverStrategy max="20"/>
            </RollingRandomAccessFile>
            
            <Async name="AsyncAppender">
            	<AppenderRef ref="RollingRandomAccessFile"/>
        	</Async>
        </Appenders>  
        
        <Loggers>  
        	<Logger name="RollingRandomAccessFileLogger" level="info" additivity="false">  
    	        <AppenderRef ref="AsyncAppender" />  
    	        <AppenderRef ref="Console" />  
    	    </Logger>
        </Loggers>  
    </Configuration>
    
    import org.apache.logging.log4j.LogManager;
    import org.apache.logging.log4j.Logger;
    
    public class Log4j2Test {
    
    	public static void main(String[] args) {
    		
    	    Logger logger = LogManager.getLogger("RollingRandomAccessFileLogger");  
    	    for(int i = 0; i < 50000; i++) {  
    	        logger.trace("trace level");  
    	        logger.debug("debug level");  
    	        logger.info("info level");  
    	        logger.warn("warn level");  
    	        logger.error("error level");  
    	        logger.fatal("fatal level");  
    	    }  
    	    
    	    try {  
    	        Thread.sleep(1000 * 61);  
    	    } catch (InterruptedException e) {}  
    	    
    	    logger.trace("trace level");  
    	    logger.debug("debug level");  
    	    logger.info("info level");  
    	    logger.warn("warn level");  
    	    logger.error("error level");  
    	    logger.fatal("fatal level"); 
    	}
    }
    
    

    这里写图片描述

    RollingRandomAccessFile 会根据命名规则当文件满足一定大小时就会另起一个新的文件


    五:log4j2配置文件详解

    log4j2.xml文件的配置大致如下:

    • Configuration
      • properties
      • Appenders
        • Console
          • PatternLayout
        • File
        • RollingRandomAccessFile
        • Async
      • Loggers
        • Logger
        • Root
          • AppenderRef

    • Configuration:为根节点,有status和monitorInterval等多个属性

      • status的值有 “trace”, “debug”, “info”, “warn”, “error” and “fatal”,用于控制log4j2日志框架本身的日志级别,如果将stratus设置为较低的级别就会看到很多关于log4j2本身的日志,如加载log4j2配置文件的路径等信息
      • monitorInterval,含义是每隔多少秒重新读取配置文件,可以不重启应用的情况下修改配置
    • Appenders:输出源,用于定义日志输出的地方
      log4j2支持的输出源有很多,有控制台Console、文件File、RollingRandomAccessFile、MongoDB、Flume 等

      • Console:控制台输出源是将日志打印到控制台上,开发的时候一般都会配置,以便调试

      • File:文件输出源,用于将日志写入到指定的文件,需要配置输入到哪个位置(例如:D:/logs/mylog.log)

      • RollingRandomAccessFile: 该输出源也是写入到文件,不同的是比File更加强大,可以指定当文件达到一定大小(如20MB)时,另起一个文件继续写入日志,另起一个文件就涉及到新文件的名字命名规则,因此需要配置文件命名规则
        这种方式更加实用,因为你不可能一直往一个文件中写,如果一直写,文件过大,打开就会卡死,也不便于查找日志。

        • fileName 指定当前日志文件的位置和文件名称
        • filePattern 指定当发生Rolling时,文件的转移和重命名规则
        • SizeBasedTriggeringPolicy 指定当文件体积大于size指定的值时,触发Rolling
        • DefaultRolloverStrategy 指定最多保存的文件个数
        • TimeBasedTriggeringPolicy 这个配置需要和filePattern结合使用,注意filePattern中配置的文件重命名规则是${FILE_NAME}-%d{yyyy-MM-dd HH-mm}-%i,最小的时间粒度是mm,即分钟
        • TimeBasedTriggeringPolicy指定的size是1,结合起来就是每1分钟生成一个新文件。如果改成%d{yyyy-MM-dd HH},最小粒度为小时,则每一个小时生成一个文件
      • NoSql:MongoDb, 输出到MongDb数据库中

      • Flume:输出到Apache Flume(Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方(可定制)的能力。)

      • Async:异步,需要通过AppenderRef来指定要对哪种输出源进行异步(一般用于配置RollingRandomAccessFile)

      PatternLayout:控制台或文件输出源(Console、File、RollingRandomAccessFile)都必须包含一个PatternLayout节点,用于指定输出文件的格式(如 日志输出的时间 文件 方法 行数 等格式),例如 pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"

        %d{HH:mm:ss.SSS} 表示输出到毫秒的时间
        %t 输出当前线程名称
        %-5level 输出日志级别,-5表示左对齐并且固定输出5个字符,如果不足在右边补0
        %logger 输出logger名称,因为Root Logger没有名称,所以没有输出
        %msg 日志文本
        %n 换行
      
        其他常用的占位符有:
        %F 输出所在的类文件名,如Log4j2Test.java
        %L 输出行号
        %M 输出所在方法名
        %l 输出语句所在的行数, 包括类名、方法名、文件名、行数
      
    • Loggers:日志器
      日志器分根日志器Root和自定义日志器,当根据日志名字获取不到指定的日志器时就使用Root作为默认的日志器,自定义时需要指定每个Logger的名称name(对于命名可以以包名作为日志的名字,不同的包配置不同的级别等),日志级别level,相加性additivity(是否继承下面配置的日志器), 对于一般的日志器(如Console、File、RollingRandomAccessFile)一般需要配置一个或多个输出源AppenderRef;

      每个logger可以指定一个level(TRACE, DEBUG, INFO, WARN, ERROR, ALL or OFF),不指定时level默认为ERROR

      additivity指定是否同时输出log到父类的appender,缺省为true。

    <Logger name="rollingRandomAccessFileLogger" level="trace" additivity="true">  
    	<AppenderRef ref="RollingRandomAccessFile" />  
    </Logger>
    
    • properties: 属性
      使用来定义常量,以便在其他配置的时候引用,该配置是可选的,例如定义日志的存放位置
      D:/logs

    【实战部分】

    1. 引入slf4j和log4j需要的依赖
    <properties>
      	<junit.version>3.8.1</junit.version>
      	<log4j.version>2.5</log4j.version>
      </properties>
      
      <dependencies>
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>${junit.version}</version>
          <scope>test</scope>
        </dependency>
        
        <!-- slf4j + log4j2 begin -->
        <dependency>
    	    <groupId>org.slf4j</groupId>
    	    <artifactId>slf4j-api</artifactId>
    	    <version>1.7.10</version>
    	</dependency>
    	
    	<dependency> <!-- 桥接:告诉Slf4j使用Log4j2 -->
    	    <groupId>org.apache.logging.log4j</groupId>
    	    <artifactId>log4j-slf4j-impl</artifactId>
    	    <version>2.2</version>
    	</dependency>
    	<dependency> <!-- 桥接:告诉commons logging使用Log4j2 -->
    	    <groupId>org.apache.logging.log4j</groupId>
    	    <artifactId>log4j-jcl</artifactId>
    	    <version>2.2</version>
    	</dependency>
        
        <dependency>  
            <groupId>org.apache.logging.log4j</groupId>  
            <artifactId>log4j-api</artifactId>  
            <version>${log4j.version}</version>  
        </dependency>  
        <dependency>  
            <groupId>org.apache.logging.log4j</groupId>  
            <artifactId>log4j-core</artifactId>  
            <version>${log4j.version}</version>  
        </dependency>  
        <!-- log4j end-->
      </dependencies>
      
      <!-- 使用aliyun镜像 -->
      <repositories>
        <repository>
            <id>aliyun</id>
            <name>aliyun</name>
            <url>http://maven.aliyun.com/nexus/content/groups/public</url>
        </repository>
      </repositories>
    

    2、配置log2.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <Configuration status="WARN"> 
    	<properties>
    		<property name="LOG_HOME">D:/logs</property>
    		<property name="FILE_NAME">mylog</property>
    		<property name="log.sql.level">info</property>
    	</properties>
    	
    	 
        <Appenders>  
            <Console name="Console" target="SYSTEM_OUT">  
                <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %l - %msg%n" />  
            </Console>
            
            <RollingRandomAccessFile name="RollingRandomAccessFile" fileName="${LOG_HOME}/${FILE_NAME}.log" filePattern="${LOG_HOME}/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd HH-mm}-%i.log">
            	<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %l - %msg%n"/>
            	<Policies>
            		<TimeBasedTriggeringPolicy interval="1"/>
            		<SizeBasedTriggeringPolicy size="10 MB"/>
            	</Policies>
            	<DefaultRolloverStrategy max="20"/>
            </RollingRandomAccessFile>
        </Appenders>  
        
        <Loggers>  
        	<Root level="info">  
        		<AppenderRef ref="Console" />  
    	        <AppenderRef ref="RollingRandomAccessFile" />  
    	    </Root>
    	    
    	    <Logger name="com.mengdee.dao" level="${log.sql.level}" additivity="false">
                 <AppenderRef ref="Console" />
            </Logger>
        </Loggers>  
    </Configuration>
    

    3、 Java

    package com.mengdee.manage;
    
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    public class Log4j2Test {
    
    	// Logger和LoggerFactory导入的是org.slf4j包
    	private final static Logger logger = LoggerFactory.getLogger(Log4j2Test.class);
    	public static void main(String[] args) {
    		long beginTime = System.currentTimeMillis();
    		
    		for(int i = 0; i < 100000; i++) {  
    			logger.trace("trace level");  
    		    logger.debug("debug level");  
    		    logger.info("info level");  
    		    logger.warn("warn level");  
    		    logger.error("error level");
    		}
    		
    		try {  
    	        Thread.sleep(1000 * 61);  
    	    } catch (InterruptedException e) {}  
    	      
    	    
    	    logger.info("请求处理结束,耗时:{}毫秒", (System.currentTimeMillis() - beginTime));    //第一种用法
    	    logger.info("请求处理结束,耗时:" + (System.currentTimeMillis() - beginTime)  + "毫秒");    //第二种用法
    
    	}
    }
    

    4、运行结果
    这里写图片描述

    这里写图片描述

    这里写图片描述

    持续完善中。。。

    分享一个朋友的人工智能教程(请以“右键”->"在新标签页中打开连接”的方式访问)。比较通俗易懂,风趣幽默,感兴趣的朋友可以去看看。

    我的微信公众号

    这里写图片描述

    展开全文
  • dom4j-1.6.1.jar (dom4j) 欢迎下载

    千次下载 热门讨论 2007-05-01 04:01:10
    dom4j-1.6.1.jar,Dom4j是一个Java的XML API接口,是jdom的进化版,dom4j基本用来读写xml文件,是一个十分优秀的JavaXML API接口
  • J-Link J-Flash 注册机

    千次下载 热门讨论 2014-01-03 15:56:30
    segger j link keygen 使用jflash烧程序的时候需要的license
  • log4j与log4j2性能对比及log4j升级至log4j2方案

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

    万次阅读 2013-09-08 22:32:59
    Log4j 2 包含了基于LMAX 分离库的下一代的异步日志系统,在多线程环境下,异步日志系统比 Log4j 1.x 和Logback 提高了10倍性能提升(吞吐量和延迟率 )。
  • SpringBoot出现该错误,log4j冲突,exclusion一下【spring-boot-starter-logging】就好了 我的项目是servicecomb的,同样,也是在引入springboot-starer的时候排除掉logging即可 SLF4J: Class path contains ...
  • log4j.jar

    万次下载 热门讨论 2008-04-04 22:13:48
    log4j的jar包,有了它你就可以打log了
  • Log4j2与Slf4j的最佳实践

    万次阅读 2018-05-07 21:38:30
    日志对于项目的重要性不言而喻,现在市面上的日志框架多种多样:Log4j、Log4j2、Slf4j、JDKLog、Logback等等,如果没有真正深入了解过,可能会被搞得眼花缭乱。本文将介绍目前Java项目中最常见的Log4j2 + Slf4j的...
  • 【问题记录】java.lang.IllegalStateException: Detected both log4j-over-slf4j.jar AND bound slf4j-log4j12.jar on the class path SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding ...
  • log4j.properties配置详解与实例

    万次阅读 多人点赞 2016-02-22 17:16:49
    最近使用log4j写log时候发现网上的写的都是千篇一律,写的好的嘛不全,写的全一点的嘛没有一点格式,看着累。这里把网上收集到的整理了一下,并且全部都在机器上测试成功了。这么好的文档估计没有了吧? ############...
  • j = j ++ 和 j = ++ j的区别

    千次阅读 2018-09-09 10:40:50
    今天看到一个题,问下面代码输出来是答案是多少: public class Test { public static void main(String[] args) { int j = 0; for(int i=0; i&lt;100 ;... j = j++; } System.out.p...
  • java中j=j++和j=++j的理解

    万次阅读 2018-03-01 10:44:23
    先来看一段程序: public class Test1 { public static void main(String[] args) { int j = 0; for(int i = 0; i &lt; 100; i++){ j = j++; } System.out.println(j); ...
  • springboot 关于 Class path contains multiple SLF4J bindings.警告的解决   有一次配置好springboot项目启动后,忽然发现有下边的警告: SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found...
  • Spring Boot配置log4j记录日志

    万次阅读 多人点赞 2019-02-18 16:57:18
    转载请注明出处:Spring Boot配置log4j记录日志 我们在老的项目框架ssh,springMVC中都使用过log4j日志模块。 例如:java日志功能log4j模块的使用方法 Spring Boot框架也能很好的快速集成log4j,本篇文章记录如何在...
  • Caused by: org.apache.logging.log4j.LoggingException: log4j-slf4j-impl cannot be present with log4j-to-slf4j SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/D:/...
  • 文章目录常用日志框架Log4jLogbackLog4j 2Log4j1/Logback/Log4j2性能比较日志门面SLF4J 常用日志框架 Log4j Log4j是Apache的一个Java的日志库,通过使用Log4j,我们可以控制日志信息输送的目的地(控制台、文件、...
  • 如提示,log4j没有配置日志记录的位置,需要配置log4j.properties,在src目录下新建log4j.properties,将下面的内容写入文件1.应用于控制台 log4j.appender.CONSOLE = org.apache.log4j.ConsoleAppender log4j....
  • 根据报错提示,我们可以知道出错的原因是“加载类文件org.slf4j.impl.StaticLoggerBinder时失败”,而出错的地方主要是在于slf4j的jar包。 官网给出的解决思路如下: This error is reported when the org.slf4j....
  • log4j与slf4j的区别

    万次阅读 多人点赞 2019-04-27 11:11:18
    log4j : 即 log for java;Java的日志4英文名 four 与for同音 slf4j : simple log facade for java :简单日志门面 区别: log4j是真正实现日志功能的产品,像这样的产品有很多 slf4j 是一个适配器,我们通过...
  • maven+springmvc+mybatis+log4j框架搭建

    千次下载 热门讨论 2014-02-12 17:23:08
    maven+springmvc+mybatis+log4j框架搭建,以后项目可以多次利用起来。。节省开发时间
  • 日志框架:slf4j 日志实现:log4j2 桥接包:log4j-slf4j-impl 桥接包log4j-slf4j-impl起到适配的作用,因为市面上的日志实现互不兼容,日志框架slf4j要想适用于日志实现log4j2,就需要使用桥接包 slf4j使用...
  • Log4j使用教程

    万次阅读 2021-08-16 20:11:47
    日志是应用软件中不可缺少的部分,Apache的开源项目log4j是一个功能强大的日志组件,提供方便的日志记录。在apache网站:jakarta.apache.org/log4j可以免费下载到Log4j最新版本的软件包。Maven工程中依赖如下: <...
  • J-Link ARM V4.66+Segger_J-Link_keygen

    热门讨论 2013-05-12 18:27:15
    J-Link ARM V4.66驱动,及J-link license 算号器。 算号器用于产生RDI FlashBP FlashDownload J-Flash的License。破解后可用盗版的J-link单独烧写目标板的FLASH,否则在烧写Flash时会出现"Sorry, no valid license ...
  • maven中配置slf4j-log4j、log4j实现包

    千次阅读 2018-10-24 23:22:02
    maven中配置slf4j-log4j、log4j实现包 java中很多开源组件pom.xml中都内置引入了slf4j的日志jar包,如quartz-2.3.jar的pom依赖中就有slf4j-api-1.7.7.jar slf4j,提起来大家可能不太熟悉,但若说起它的一个实现log4j...
  • 原因 引入了一个第三方 jar 包,里面打包了别的日志插件,导致报错 堆栈信息 ...SLF4J: Found binding in [jar:file:/C:/Users/tudan/Documents/WorkLearn3/wechat-demo/lib/itchat4j-1.1.0-jar-wi...
  • Log4j,Log4j2,logback,slf4j日志框架比较

    万次阅读 多人点赞 2018-07-12 09:35:10
    Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、数据库等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,247,930
精华内容 2,099,172
关键字:

j