Log4j日志管理的简单实例

jopen 9年前

   大型项目中很多情况下要分析程序的日志信息,如何管理自己的日志信息至关重要。在应用程序中添加日志记录总的来说基于三个目的 ,

  • 监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析工作;
  • 跟踪代码运行时轨迹,作为日后审计的依据;
  • 担当集成开发环境中的调试器的作用,向文件或控制台打印代码的调试信息。

       最普通的做法就是在代码中嵌入许多的打印语句,这些打印语句可以输出到控制台或文件中,比较好的做法就是构造一个日志操作类 来封装此类操作,而不是让一系列的打印语句充斥了代码的主体。


       这篇文章主要针对基于Java语言实现的项目中的日志管理进行简单的阐述。

一、工具及文件

二、Log4j 简介

       在强调可重用组件开发的今天,除了自己从头到尾开发一个可重用的日志操作类外, Apache 为我们提供了一个强有力的日志操作包 -Log4j 。
       Log4j 是 Apache 的一个开放源代码项目,通过使用 Log4j ,我们可以控制日志信息输送的目的地是控制台、文件、 GUI 组件、甚至是套接口服 务器、 NT 的事件记录器、 UNIX Syslog 守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就 是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
       此外,通过 Log4j 其他语言接口,您可以在 C 、C++、.Net 、PL/SQL 程序中使用 Log4j ,其语法和用法与在 Java 程序中一样,使得多语言分布式系统得到一个统一一致的日志组件模块。而且,通 过使用各种第三方扩展,您可以很方便地将 Log4j 集成到 J2EE 、 JINI 甚至是 SNMP 应用中。
       Log4j主要配置三方面的内容,

  • Logger - 日志写出器 ,供程序员输出日志信息
  • Appender - 日志目的地 ,把格式化好的日志信息输出到指定的地方去
  • Layout - 日志格式化器 ,用来把程序员的 logging request 格式化成字符串

三、简单实例

  • log4j.properties文件配置编写
#配置日志写出器  #log4j.rootLogger = [ level ] , appenderName, appenderName, …  #其中, level 是日志记录的优先级,分为 OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定义的级别。  #Log4j 建议只使用四个级别,优先级从高到低分别是ERROR、WARN、INFO、DEBUG 。  #通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关。比如在这里定义了info级别,则应用程序中所有DEBUG级别的日志信息将不被打印出来。  #appenderName 就是指日志信息输出到哪个地方。可以同时指定多个输出目的地。  log4j.rootLogger=info,R,stdout     #配置日志目的地,输出到控制台  log4j.appender.stdout=org.apache.log4j.ConsoleAppender    #追加的方式输出  log4j.appender.stdout.follow=true    #配置日志格式化器  #可以灵活地指定布局模式  log4j.appender.stdout.layout=org.apache.log4j.PatternLayout    #指定布局模式的格式  log4j.appender.stdout.layout.ConversionPattern=%d[%t](%F%L)-%m%n    #文件大小到达指定尺寸的时候产生一个新的文件  log4j.appender.R=org.apache.log4j.RollingFileAppender    #输出日志文件的位置路径TestServer.log  log4j.appender.R.File=TestServer.log    #单个文件最大尺寸,在日志文件到达该大小时,将会自动滚动,即将原来的内容移到 TestServer.log.1 文件。  log4j.appender.R.MaxFileSize=20MB    #指定可以产生的滚动文件的最大数  log4j.appender.R.MaxBackupIndex=20    log4j.appender.R.layout=org.apache.log4j.PatternLayout  log4j.appender.R.layout.ConversionPattern=%d%5p[%t](%F%L)-%m%n

简单的Java程序实例代码
import org.apache.log4j.Logger;  import org.apache.log4j.PropertyConfigurator;    public class logTest {        static public Logger m_logger;        static private void InitLog() {          try {              m_logger = Logger.getLogger(logTest.class.getName());              PropertyConfigurator.configure("log4j.properties");          } catch (Exception ex) {              ex.printStackTrace();          }      }        public static void main(String[] args) {            logTest.InitLog();            m_logger.info("main is start [...]");            try {              m_logger.info("自定义的异常类对象");              throw new MyException("自定义的异常");// 抛一个自定义的异常类对象,传入的参数就是给控制台看的异常          } catch (MyException e) {              m_logger.error(e.getExceptionName().toString(), e);              m_logger.debug(e);          }          m_logger.info("main is over [ OK ]");        }    }    class MyException extends Exception // 自定义的异常类 继承Exception类  {      private static final long serialVersionUID = 1L;      private String exceptionName; // 定义一个私有变量,用来为自定义异常        public MyException() {      } // 创建一个无参数的构造函数        public MyException(String exceptionName) { // 创建一个有参数的构造函数,传入的参数为前面定义的异常名称          this.exceptionName = exceptionName;      }        public String getExceptionName() { // 定义一个方法,提供给外部来获取私有变量          return this.exceptionName;      }  }

四、参考引用