Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4795237
  • 博文数量: 890
  • 博客积分: 17977
  • 博客等级: 上将
  • 技术积分: 8621
  • 用 户 组: 普通用户
  • 注册时间: 2005-08-26 09:59
个人简介

一个好老好老的老程序员了。

文章分类

全部博文(890)

文章存档

2020年(7)

2019年(40)

2018年(88)

2017年(130)

2015年(5)

2014年(12)

2013年(41)

2012年(36)

2011年(272)

2010年(1)

2009年(53)

2008年(65)

2007年(47)

2006年(81)

2005年(12)

分类: Python/Ruby

2011-04-03 11:24:16

    log4j是java下有名的日志框架,虽然作者后来有写了java下的另外一个日志框架logback,但在时隔近三年之后作者也更新了log4j,从1.2.15更新到1.2.16。从这个也能看出log4j在java领域日志中的重要性。
    Log4perl是Perl语言的日志框架,仿log4j的一个日志框架,大家知道和log4j相仿的很多其他语言的日志框架和log4j的配置都差不多。这里主要说说Perl下的Log4Perl。
    从Log4perl的官网http://mschilli.github.com/log4perl/下载最新的日志组件。在写这个博文的时候最新版本是1.32。解压后Log-Log4perl-1.32下的lib就是我们要用的库文件所在目录。下面写一个最简单的没有使用配置文件的日志输出(我们知道log4j在没有配置文件的时候也可以设置简单的日志输出)。
    例子如下:
   
  1. #!/usr/bin/perl
  2. use Log::Log4perl qw(:easy);
  3.   
  4. Log::Log4perl->easy_init($ERROR);

  5. drink();
  6. drink("Soda");

  7. sub drink {
  8.     my($what) = @_;

  9.     my $logger = get_logger();

  10.     if(defined $what) {
  11.         $logger->info("Drinking ", $what);
  12.     } else {
  13.         $logger->error("No drink defined");
  14.     }
  15. }

在我们没有把Perl的Log4perl库加到Perl的@INC配置中时,我们会得到下面的错误:

Can't locate Log/Log4perl.pm in @INC (@INC contains: /usr/lib/perl5/5.8.5/i386-linux-thread-multi /usr/lib/perl5/5.8.5 /usr/lib/perl5/site_perl/5.8.5/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.4/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.3/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.2/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.1/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.0/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.5 /usr/lib/perl5/site_perl/5.8.4 /usr/lib/perl5/site_perl/5.8.3 /usr/lib/perl5/site_perl/5.8.2 /usr/lib/perl5/site_perl/5.8.1 /usr/lib/perl5/site_perl/5.8.0 /usr/lib/perl5/site_perl /usr/lib/perl5/vendor_perl/5.8.5/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.4/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.3/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.2/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.1/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.0/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.5 /usr/lib/perl5/vendor_perl/5.8.4 /usr/lib/perl5/vendor_perl/5.8.3 /usr/lib/perl5/vendor_perl/5.8.2 /usr/lib/perl5/vendor_perl/5.8.1 /usr/lib/perl5/vendor_perl/5.8.0 /usr/lib/perl5/vendor_perl .) at xxxx.pl line 2.
BEGIN failed--compilation aborted at xxxx.pl line 2.

解决办法:在源码的第一行家上use lib 'Log4perl lib path';如:use lib '/tmp/Log-Log4perl-1.32/lib';(我解压完的目录在/tmp下)。
然后我们运行能得到下面的结果:

2011/04/03 13:17:43 No drink defined
因为我们设置的级别是ERROR,所以只打印出了ERROR界别的信息。将Log::Log4perl->easy_init($ERROR);
改为Log::Log4perl->easy_init($INFO);就可以输出两条信息了。

下面我说说通过配置文件来配置。

log4perl.conf文件内容如下:

 

  1. ############################################################
  2. # A simple root logger with a Log::Log4perl::Appender::File
  3. # file appender in Perl.
  4. ############################################################
  5. #log4perl.rootLogger=ERROR, LOGFILE
  6. log4perl.rootlogger=DEBUG, Screen, LOGFILE
  7. log4perl.appender.Screen=Log::Log4perl::Appender::Screen
  8. log4perl.appender.Screen.stderr=0
  9. log4perl.appender.Screen.layout=PatternLayout
  10. #log4perl.appender.Screen.layout.ConversionPattern=[%r] %F %L %c %t - %m%n
  11. log4perl.appender.Screen.layout.ConversionPattern=[%-4r] %-5p %c %d - %m%n
  12. log4perl.appender.LOGFILE=Log::Log4perl::Appender::File
  13. log4perl.appender.LOGFILE.filename=/var/log/myerrs.log
  14. log4perl.appender.LOGFILE.mode=append
  15. log4perl.appender.LOGFILE.layout=PatternLayout
  16. log4perl.appender.LOGFILE.layout.ConversionPattern=[%r] %F %L %c %t - %m%n

然后修改代码:

  1. #!/usr/bin/perl -w
  2. use lib '/tmp/Log-Log4perl-1.32/lib/Log';

  3. use Log::Log4perl qw(:easy);

  4. #Log::Log4perl->easy_init($DEBUG);
  5. Log::Log4perl->init("./log4perl.conf");

  6. drink();
  7. drink("Soda");

  8. sub drink{
  9.   my($what)=@_;

  10.   my $logger = get_logger();

  11.   if (defined $what){
  12.      $logger->info("Drinking ",$what);
  13.   } else {
  14.      $logger->error("No drink defined");
  15.   }
  16. }

在控制台我们会看到如下输出:

[6   ] ERROR main 2011/04/03 13:23:01 - No drink defined
[7   ] INFO  main 2011/04/03 13:23:01 - Drinking Soda
同时在/var/log/myerrs.log文件中也产生上面输出的内容。

关于配置文件中的参数说明如下:

[quote]

%c Category of the logging event. %C Fully qualified package (or class) name of the caller %d Current date in yyyy/MM/dd hh:mm:ss format %F File where the logging event occurred %H Hostname (if Sys::Hostname is available) %l Fully qualified name of the calling method followed by the callers source the file name and line number between parentheses. %L Line number within the file where the log statement was issued %m The message to be logged %m{chomp} The message to be logged, stripped off a trailing newline %M Method or function where the logging request was issued %n Newline (OS-independent) %p Priority of the logging event %P pid of the current process %r Number of milliseconds elapsed from program start to logging event %R Number of milliseconds elapsed from last logging event to current logging event %T A stack trace of functions called %x The topmost NDC (see below) %X{key} The entry 'key' of the MDC (see below) %% A literal percent (%) sign[/quote]关于Log4perl配置不同日志级别输出到不同的地方,在后续的文章中我们再一起研究。

Log4perl使用(二)http://blog.chinaunix.net/space.php?uid=78707&do=blog&id=205550

阅读(4460) | 评论(3) | 转发(2) |
给主人留下些什么吧!~~

2gua2011-08-20 07:34:32

renxiao2003: 2gua兄批评得是。本身不是搞Perl的。.....
但你是牛人。

renxiao20032011-07-06 23:31:51

2gua: 介绍了Log4Perl应用,对日常维护人员有一定帮助,但浅尝辄止。.....
2gua兄批评得是。本身不是搞Perl的。

2gua2011-04-26 10:11:13

介绍了Log4Perl应用,对日常维护人员有一定帮助,但浅尝辄止。