Log4j 基本使用

    项目搭建起来之后,发现日志频繁不理想,因为是别人搭建的日志系统,所以出错之后很难定位。终于,忍无可忍,自己学习Log4j,其实一切都是那么简单,当然,这些都是初级知识,所以不应该骄傲,不过还是要记录下来,供以后学习使用!

关于系统文件描述:

1)三个标准文件描述符:标准输入,标准输出,标准出错。

2)Java中的System.in,System.out,System.err。对应:stdin,stdout,stderr

3)System.out 与 System.err 表面的区别就是控制台中打印,一个是黑色的一个是红色的!

4)System.out 与 System.err 内在的区别就是前者是缓冲流,后者不是缓冲流。换句话说前者不一定立刻打印信息,而后者会立刻打印!

5)System.out 与 System.err 设置一般可以调用对应的方法设置重定向(默认打印在控制台,通过设置可以打印到指定文件流中),分别是:

System.setOut(new PrintStream(file))和System.setErr(new PrintStream(file));

6)System.out 与 System.err 如果混合使用会出现顺序混乱,原因是缓冲流的原因,所以有些时候会看到异常的信息并不是在指定位置打印,原因就是异常调用的是System.err,他与System.out一起使用的话,可能就发生顺序混乱!

7)参考程序,看看打印结果:

  for(int i = 0 ; i < 10 ; i++){
   if(i % 2 ==0){
    System.out.println(i);
   }else{
    System.err.println(i);
   }
  }

 

Log4j 学习使用

1)Logger对象,她表示的就是一个日志输出对象,这个输出对象根据包名控制着日志级别、日志打印的位置。主要包括:日志打印的当前位置、日志打印的格式、日志打印的目的位置。

Logger对象的获取:

 Logger log = Logger.get:pgger(this.getClass());

Logger对象打印日志:

    log.debug(msg,exception);
    log.info(msg,exception);
    log.warn(msg,exception);
    log.error(msg,exception);
    log.fatal(msg,exception);

注意:级别从上往下是由低到高,父子关系是继承关系,因为他们是包含关系,但是子类优先考虑,只会打印大于等于自身级别的log。

2)Appender对象,日志信息输出的目的地对象,她代表着是控制台还是文件还是邮件等

一般的Appender对象:

    ConsoleAppender:输出到控制台的Appender对象
    RollingFileAppender:输出到文件的Appender对象
    JMSAppender:输出到JMS的Appender对象
    SMTPAppender:输出到邮件系统SMTP的Appender对象

注意:输出目的地对于父子类关系是采用合并,因为他们不是互斥关系。也就是儿子应该拥有父亲的,同时还拥有自己的。

3)Layout对象,日志打印格式控制对象

一般采用日志格式对象:

    PatternLayout:使用pattern字符串控制日志输出格式
    SimpleLayout:只是输出简单日志信息的一种格式

关于日志格式pattern字符串的意义:

    %p:日志信息级别,level
    %d{}:日志信息产生时间 , 一般使用格式%d{yyyy MM dd HH:mm:ss,SSS}
    %c:日志信息所在地(类名)
    %m:产生的日志具体信息
    %n:输出日志信息换行

4)Log4j文件的内容

有的是采用Log4j.properties 文件,有的是Log4j.xml 文件,二者是相同的,个人推荐使用前者,原因是看起来简单。

具体内容如下:

#指向根目录,以防止遗漏某些Logger对象,需要指定打印方式Appender和打印级别Level
log4j.rootLogger=error,stdout,logfile
#配置一个控制日志打印方式Appender,控制台打印
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
#配置一个控制日志打印的格式
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
#配置格式具体形式
log4j.appender.stdout.layout.ConversionPattern=[%d][%c]-[%p] %m%n
#把打印到控制台的内容都标记为标准输出,也可以指定为System.err
log4j.appender.CONSOLE.Target=System.out
#配置一个Logger,指定包名和打印级别,其他可以继承或合并
log4j.logger.com.restservice=info
log4j.logger.org.apache.catalina=warn
log4j.logger.org.springframework=info
log4j.logger.java.sql.Connection=debug
log4j.logger.java.sql.Statement=debug
log4j.logger.java.sql.PreparedStatement=debug,stdout
#配置一个控制日志打印方式的Appender,文件打印
log4j.appender.logfile=org.apache.log4j.RollingFileAppender
#指定日志打印位置,根目录下的Log/server.log
log4j.appender.logfile.File=Log/server.log
log4j.appender.logfile.MaxBackupIndex=3
log4j.appender.logfile.MaxFileSize=512KB
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=[%d][%c]-[%p] %m%n

5)Log4j文件的位置

只需要把它放在src目录下即可,系统自动加载初始化;对于Web程序,如果你想指定他的位置可以在 web.xml 文件中使用如下代码:

<!-- 作用是避免多个项目一起部署时有些项目初始化失败问题 -->
<context-param>
      <param-name>webAppRootKey</param-name>
      <param-value>identity_projectname</param-value>
</context-param>  
<!-- 如果你的Log4j.properties 文件放在 WEB-INF 目录下,那么这样指定 -->
<context-param>
  <param-name>log4jConfigLocation</param-name>
  <param-value>/WEB-INF/log4j.properties</param-value>
 </context-param>
<!-- Spring提供加载监听器,随时调整打印日志的级别而不用重启服务 -->
 <listener>
 <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>

Log4j与文件系统

本人刚刚接触项目,发现控制台采用System.out.print("hello world");总是没有东西输出,后面才发现,原来是标准输出采用重定向了,那么如果我们在初始化Log4j的时候,也把标准输出和标准出错指定在一个特定的文件里面,那么所有的信息都会记录为日志,而不需要采用Log去手动打印了!比如异常抛出,就可以重定向到文件中去。


你可能感兴趣的:(log4j,System.out,System.err)