출처 :

http://j2k.naver.com/j2k_frame.php/korean/www.nurs.or.jp/~sug/soft/log4j/log4php2.htm

 

 

Log4J철저 해설

Log4php 의 Appender 들

목차


LoggerAppenderConsole

표준 출력 or 표준 에러 출력에 로그를 낸다.이것은 LoggerAppenderEcho (와)과는 달라, 성실하게 php://stdout 등을 열어 낸다.ConsoleAppender(을)를 참조.

옵션은 다음과 같이.

Target
STDOUT 인가 STDERR (을)를 취한다.각각 표준 출력이나 표준 에러 출력이다.디폴트 STDOUT.
layout
필수
Threshold
레벨을 지정해, 그 레벨 이하라고 출력하지 않게 하는 반응을 일으키는 최소의 물리량.모든 Appender 의 공통 옵션.

그리고,PHP 의 경우는 까다로운 것에, 별계통의 출력으로서 echo 하지만 있다.버퍼링이 별계통이 되므로, 같은 표준 출력에 낸다고 해도, 차례가 전후 하는 일이 있다.조금 실험해 보자.코드는 이런 곳.

이용 코드
<?php
require_once( '/usr/local/share/log4php/LoggerManager.php' );
$logger =& LoggerManager::getLogger('Sug.Test');

echo "echo 1\n";
print "print 2\n";
$fp = @fopen( 'php://stdout', 'w');
@fwrite($fp, "php://stdout 3\n" );
$logger->info( "logger.info 4" );
@fwrite($fp, "php://stdout 5\n" );
print "print 6\n";
echo "echo 7\n";
?>

log4php.properties
log4php.appender.echo=LoggerAppenderEcho
log4php.appender.echo.layout=LoggerPatternLayout
log4php.appender.echo.layout.ConversionPattern=echo %d %5p %c{1} - %m%n

log4php.appender.console=LoggerAppenderConsole
log4php.appender.console.Target=STDOUT
log4php.appender.console.layout=LoggerPatternLayout
log4php.appender.console.layout.ConversionPattern=console %d %5p %c{1} - %m%n

log4php.logger.Sug.Test=debug, console, echo
log4php.rootLogger=debug

이 출력은, 필자의 실험에서는,

$ php test.php
php://stdout 3
console 2006-04-08 12:10:26,095  INFO Test - logger.info 4
php://stdout 5
echo 1
print 2
echo 2006-04-08 12:10:26,095  INFO Test - logger.info 4
print 6
echo 7

그렇다고 하는 너무 재미있는 결과가 되었다....요컨데,

  1. 소스의 print, echo, log4php 의 LoggerAppenderEcho
  2. 「php://stdout」에의 fwrite (와)과 log4php 의 LoggerAppenderConsole

의 2 그룹에서 2개의 버퍼링이 있는 것 같다.그 말은,

출력의 차례를 신경쓴다면,LoggerApenderConsole (은)는 사용해서는 안된다.LoggerAppenderEcho (을)를 사용하세요.

LoggerAppenderEcho

이것은 표준 출력에 로그가 나오지만,PHP 의 echo (을)를 사용해 낸다.로그가 나오는 상태가 조금 다른 것으로,LoggerAppenderConsole 보다 여기를 좋아하는 사람이 많을 것이다.

옵션은 다음과 같이.고유 옵션은 없다.

layout
필수
Threshold
레벨을 지정해, 그 레벨 이하라고 출력하지 않게 하는 반응을 일으키는 최소의 물리량.모든 Appender 의 공통 옵션.

문제에 대해서는 LoggerAppenderConsole (을)를 참조.

LoggerAppenderFile

파일에 출력한다.FileAppender(을)를 참조.

PHP 어째서 , 실제의 출력은 「@fwrite()」(으)로 내고 있다.요컨데 어떤 에러가 발생해도 「무시!」이므로, 로그로테이트에는 이 Appender (은)는 전혀 사용할 수 없다.

옵션은 다음과 같이.

Append
true or false.추가 모드인가 아닌가.디폴트 true 그리고 추가 모드.
FileName
File
왜 2나 있을까...수수께끼이지만,FileName (분)편이 정규와 같이 생각한다.출력해야 할 파일명을 세트 한다.덧붙여 파일 출력계 Appender 그럼 이 2개의 옵션의 역할이 비묘 다른 케이스가 있으므로, 조심해.
layout
필수
Threshold
레벨을 지정해, 그 레벨 이하라고 출력하지 않게 하는 반응을 일으키는 최소의 물리량.모든 Appender 의 공통 옵션.

LoggerAppenderRollingFile

파일에 출력해, 사이즈 베이스의 로테이션을 한다.RollingAppender(을)를 참조.

동작은,FileName 옵션으로 지정된 파일에 로그를 출력해, 만약, 그 사이즈가 MaxFileSize (을)를 넘으면, 출력 파일을 닫고, 이름을 FileName.1 (으)로 변경한다.그리고, 신규의 출력 파일로서 FileName (을)를 작성한다.백업파일명은 단지 확장자(extension)만으로 구별해, 새로운 것으로부터 순서에 1, 2, 3... (와)과 차여서 가MaxBackupIndex (을)를 넘는 백업파일은 로테이션의 결과로서 소멸한다.

옵션은 다음과 같이.

MaxBackupIndex
최대 유지하는 백업파일의 수.== 3 (이)라면,FileName.3 까지 존재할 수 있다.디폴트 1 그리고 FileName.1 만 백업파일이 된다.
MaxFileSize
MaximumFileSize
1개의 파일의 최대 사이즈.요컨데 로그 출력의 결과 이 사이즈를 넘으면, 더이상 이 파일에는 추가하지 않고 로테이션 한다.디폴트는 10485760 byte(10Mbyte).동작은 2개 모두 같다.KB, MB, GB (와)과 숫자의 뒤에 단위를 붙일 수 있다.
FileName
이것은 덧쓰기되고 있다.File 옵션은 이 Appender 그럼 사용하지 않는다.파일의 베이스명(및 신규 로그의 출력 파일명)을 여기서 지정한다.
Append
true or false.추가 모드인가 아닌가.디폴트 true 그리고 추가 모드.
layout
필수
Threshold
레벨을 지정해, 그 레벨 이하라고 출력하지 않게 하는 반응을 일으키는 최소의 물리량.모든 Appender 의 공통 옵션.

LoggerAppenderDailyFile

파일 출력의 Appender.이것은DailyRollingAppender(와)과는 비슷하면서도 다른 것이다.기동시의 시간부터 파일명을 만들어낼 만한 것으로, 로테이션은 전혀 하지 않는다.서버 로그를 기록하는 경우에는, 최초로 기동한 시간의 파일명으로 연연 로그가 놓쳐 일절의 로테이션이 없기 때문에, 여기를 사용해서는 안된데.

옵션은 다음과 같이.

DatePattern
파일명의 패턴을 지정한다.디폴트는 「Ymd」.이 디폴트로부터 알도록(듯이), 요컨데 date() 하지만 접수서식 지정이라면 뭐든지OK.
File
출력 파일명이지만, 요주의.여기서의 지정에서는 「mylog%s.log」라고 하도록(듯이), 반드시 「%s」(을)를 포함하지 않으면 안 된다.요컨데,
    function setFile()
    {
        $numargs = func_num_args();
        $args    = func_get_args();
        
        if ($numargs == 1 and is_string($args[0])) {
            parent::setFile( sprintf((string)$args[0], date($this->getDatePattern())) );
        } elseif ($numargs == 2 and is_string($args[0]) and is_bool($args[1])) {
            parent::setFile( sprintf((string)$args[0], date($this->getDatePattern())), $args[1] );
        }
    } 

(와)과 하고 있어DatePattern 그리고 지정했다 date() 의 서식에 응한 지금의 일시 표현을,File 옵션의 「%s」의 위치에 삽입하게 된다.그리고,FileName 옵션은 이 Appender 그럼 사용하지 않는다(세트 가능하지만, 무시된다).
Append
true or false.추가 모드인가 아닌가.디폴트 true 그리고 추가 모드.
layout
필수
Threshold
레벨을 지정해, 그 레벨 이하라고 출력하지 않게 하는 반응을 일으키는 최소의 물리량.모든 Appender 의 공통 옵션.

LoggerAppenderDb

JDBCAppender(을)를 참조.JDBCAppender 에 가까운,SQL (을)를 스스로 구축해DB에 출력하는 것이다.하지만, 왠지 추천 테이블이 있기도 하는 근처 어중간하다.

그리고, 이것은 PEAR 의 DB 모듈을 이용해 만들어져 있다.그렇다면 뭐,PHP 의 DB 서포트는 각DB마다 고유한 함수를 호출해 주는 것이니까, 조금 추상 레이어를 갖고 싶은 것이다.(이)라고 해도 그 추상 레이어는 PHP 의 코어로 실장되고 있는 것이 아니라,PEAR(Perl 의 CPAN 같은 것이다)로 서포트되고 있다.

PEAR (은)는 대메이저인 프로젝트이므로,PHP 코어의 분이라도, 최근에는 PEAR 그리고 개발된 패키지를 함께 해 디스트리뷰션으로 하고 있는 것이 많다.그래서, 사용하기 전에 당신의 환경이 PEAR 의 DB 패키지를 서포트하고 있을지, 확인해 보자.

# pear info DB
About DB-1.6.2
==============
Provides        Classes:
Package         DB
Summary         Database Abstraction Layer
Description     DB is a database abstraction layer providing:
                
Maintainers     Stig S?her Bakken  (developer)
                
Version         1.6.2
Release Date    2004-04-07
Release License PHP License
Release State   stable
Release Notes   =============
                BUGS FIXED:
                
Release Deps    PHP >= 4.2.0
                Package PEAR >= 1.0b1
Last Modified   2004-10-15

같이 pear 커멘드가 있고, 한편 이와 같이 DB 패키지의 정보를 줍기 시작할 수 있으면OK(이)다.만약, 없으면,

# pear install DB

그리고, 넷에 연결되고 있는 환경이라면 인스톨 할 수 있다.

그리고,LoggerAppenderDB (은)는 이 DB 패키지를 이용하고 있어, 대개의DB(을)를 이용할 수 있을 것이다.

옵션은 다음과 같이.

Dsn
이것은DB(을)를 지정한다URL의,DB판의 것이다.일반 형식은,
phptype://username:password@protocol+hostspec:port//database?옵션

같은 모습이 된다.뭐, 보통은,
DB명 어카운트 패스워드 호스트 Database명
Mysql sug (none) localhost logs

정도로 사용하는 것이 많을테니, 이 옵션은
mysql://sug@localhost/logs

(이)가 되는 것이다.
Table
그DB중(안)에서 대상으로 하는 테이블명.
Sql
INSERT 해야 할SQL커멘드.그리고, 이것은 이 옵션으로 지정된 값을,LoggerPatternLayout 그리고 정형하고, 실제의SQL커멘드로 한다.
CreateTable
그리고, 이것이 문제의 옵션.true or false 그리고 디폴트 true 이다.이름대로, 마음대로 테이블을 만들어 준다.하지만, 만들어 주는 테이블의 schema는, 현상이라고 소스를 보지 않으면 원으로부터....그래서, 작성SQL(을)를 여기에 나타낸다.
CREATE TABLE Table옵션치 (
   timestamp varchar(32),
   logger varchar(32),
   level varchar(32),
   message varchar(64),
   thread varchar(32),
   file varchar(64),
   line varchar(4)
};

뭐, 이것을 보고 불만의 방향이 상당히 있을 것이다....message 하지만 너무 작지 말아라.마음에 들지 않으면, 스스로 마음대로 테이블을 만들어 줘.그리고 후, 이 옵션을 true (으)로 해 둔 채로도 전혀 문제는 일어나지 않지만, 당연한 일이면서 「테이블이 있을지?」(은)는, 로가-의 기동시에 하나 하나DB까지 체크하러 간다.이것을 속이 메스껍다고 생각한다면, 테이블을 만든 다음은, 이 옵션을 false (으)로 해 두자.물론, 여기서 지정한 유저 어카운트로, 테이블 작성을 할 수 있는 것이 전제인 것은 물론이다.그렇지 않으면,GRANT 라든가 적당하게 끝내고 나서 해 주어.
레이아웃
불요
Threshold
레벨을 지정해, 그 레벨 이하라고 출력하지 않게 하는 반응을 일으키는 최소의 물리량.모든 Appender 의 공통 옵션.

그래서,CreateTable 옵션으로 테이블을 만든 표준적인 케이스를 상정했다 Sql 옵션은, 다음과 같은 것이 된다.

                           타임 스탬프 레벨  스렛드   발생행
                               ↓         ↓        ↓        ↓
INSERT INTO 테이블명 VALUES('%d','%c','%p','%m','%t','%F','%L' )
                                    ↑        ↑        ↑
                                 카테고리 메세지 파일명  

만약, 필드 사이즈까지 지정해 둔다면 조심이 좋다( 「-」=왼쪽 채워 「min.max」).

INSERT INTO 테이블명 VALUES('%-.32d','%-.32c','%-.32p','%-.64m','%-.32t','%-.64F','%-.4L' )

그렇다고는 해도,MySQL 그리고 한 한계, 초과 자수는 특히 필드 사이즈를 지정하지 않아도 마음대로 끊어지는 것 같다.만약을 위해 설정예를 나타낸다.특히 Sql 옵션은, 이스케이프 관련으로 걸리는지, 「"~"」(으)로 쿠트 해 두지 않으면 에러가 되는 것 같다.

log4php.appender.db=LoggerAppenderDb
log4php.appender.db.Table="log4php"
log4php.appender.db.CreateTable=true
log4php.appender.db.Dsn="mysql://root@localhost/log4j"
log4php.appender.db.Sql="INSERT INTO log4php VALUES('%-.32d','%-.32c','%-.32p','%-.64m','%-.32t','%-.64F','%-.4L' )"

LoggerAppenderMail

SMTPAppender(을)를 참조.왠지 메일 송신Appender 하지만 2나 있지만, 여기는 로가-가 끝날 때까지 로그를 메일 본문에 모아 두고, 로가-가 종료(shutdown) 하면, 단번에 메일을 보낸다...(이)라는 것이다.그러니까, 로가-가 불렸을 때에는, 메일을 보내거나는 하지 않는다.Log4J 의 SMTPAppender 에서 만난 것 같은 순환 버퍼같은 멋부린 것은 없는 것이다.

옵션은 다음과 같이.

From
송신원을 지정한다.
To
송신지를 지정한다.
Subject
송신 타이틀을 지정한다.
layout
필수
Threshold
레벨을 지정해, 그 레벨 이하라고 출력하지 않게 하는 반응을 일으키는 최소의 물리량.모든 Appender 의 공통 옵션.

이것으로 보내진 메일은 다음과 같이 된다.

Return-Path: 
X-Original-To: sug@localhost.kobe-du.ac.jp
Delivered-To: sug@localhost.kobe-du.ac.jp
Received: by bizet.kobe-du.ac.jp (Postfix, from userid 1000)
        id 8ED106FD28; Sat,  8 Apr 2006 16:03:51 +0900 (JST)
To: sug@localhost.kobe-du.ac.jp
Subject: test mail from php
From: root@localhost.kobe-du.ac.jp
Mime-Version: 1.0
Content-Type: text/plain; charset=ISO-2022-JP
Content-Transfer-Encoding: 7bit
Message-Id: <20060408070351.8ED106FD28@bizet.kobe-du.ac.jp>
Date: Sat,  8 Apr 2006 16:03:51 +0900 (JST)
Status: R

2006-04-08 16:03:51,296  INFO Test - test start
2006-04-08 16:03:51,300  WARN Test - Warning Message
2006-04-08 16:03:51,302 ERROR Test - ERROR MESSAGE
2006-04-08 16:03:51,305 FATAL Test - FATAL MESSAGE
2006-04-08 16:03:51,308 DEBUG Test - only debug
2006-04-08 16:03:51,310  INFO Test - test end

그리고, 지금부터 문제다.이 Appender (은)는 「로가-가 종료되면 메일을 보낸다」동작을 한다.그 말은 「로가-가 종료된다」라고는 무슨 일인가?그렇다고 하는 문제가 생겨 버린다.단지 스크립트가 종료한 것 만으로는, 「로가-가 종료되었다」되어 주지 않는 것이다.

즉, 이것은 명시적으로 「로가-의 종료」를 호출하지 않으면 움직이지 않는다.구체적으로는,

<?php
require_once( '../log4php-0.9/src/log4php/LoggerManager.php' );
$logger =& LoggerManager::getLogger('Sug.Test');

$logger->info( 'test start' );
$logger->warn( 'Warning Message' );
$logger->error( 'ERROR MESSAGE' );
$logger->fatal( 'FATAL MESSAGE' );
echo "test body\n";
$logger->debug( 'only debug' );
$logger->info( 'test end' );

# 명시적인 로가-의 종료
$logger->shutdown();
?>

하지만 필요한 것으로 있다.Logger 의 shutdown() (은)는 그 Logger 에 묶을 수 있었다 Appender 의 shutdown() 에 파급해,LoggerAppenderMail 의 close() (을)를 호출하고, 메일이 보내진다, 라고 하는 치수다.다른 Appender 의 경우는 단순한 클로우즈 처리 정도밖에 하고 있지 않지만,LoggerAppenderMail 그럼 최대중요인 기능이 close() 에 실장되어 버리고 있다.조심하지 않지 않으면.

그리고, 나머지 하나 더 중대한 포인트가 있다.그것은 「외국인이 개발한 것이므로,mail() 그리고 메일을 보내 버린다」라고 하는 것이다.이것을 핵 해 mb_send_mail() 그리고 옮겨놓는지,php.ini 그렇지만 만지고,mbstring.func_overload=1 (으)로 할까 하지 않으면 일본어 메일은 보낼 수 없다.

LoggerAppenderMailEvent

여기는 로그 이벤트가 발생하면 메일을 그때마다 보낸다.debug 레벨로 보내거나 하면 메체 번거롭다고 생각한다....하지만 그런데도,LoggerAppenderMail 밖에 없으면, 유저의 불만이 폭발하지 않을까?

옵션은 다음과 같이.아무래도 이 Appender 하 LoggerAppenderMail 의 다시 만들어 냄새나고, 2개만 옵션이 증가하고 있다.

From
송신원을 지정한다.
To
송신지를 지정한다.
Subject
송신 타이틀을 지정한다.
SmtpHost
메일 송신을 받아들인다 SMTP 서버가 서있는 호스트를 지정한다.
Port
메일 송신을 받아들인다 SMTP 서버가 리슨 하고 있는 호스트를 지정한다.디폴트는 당연 25.
layout
필수
Threshold
레벨을 지정해, 그 레벨 이하라고 출력하지 않게 하는 반응을 일으키는 최소의 물리량.모든 Appender 의 공통 옵션.

그리고, 증가했다 SmtpHost (와)과 Port 의 옵션은 옵셔널인 물건이므로, 지정하지 않아도 대개의 경우OK일 것이다.요컨데,PHP 의 코어인 프롭퍼티로서SMTP, smtp_port 하지만 있어, 디폴트가 localhost (와)과 25 (이)가 되어 있다.요컨데 mail() (은)는 이것을 사용해 메일 송신의 접속처를 특정하고 있는 것이다.그리고, 이 Appender 의 SmtpHost 옵션은, 시스템의 SMTP 프롭퍼티를 일시적으로 고쳐 쓰는 것이다....현실적으로 생각하고, 이것을 지정하지 않으면 안 되는 장면은 상상하기 어렵다.프록시가 사이에는님은 있는 케이스라면, 그렇다면 php.ini (을)를 고쳐 쓰겠지.용도는 거의 없다고 생각한다.

불평 늘어지는 것은 그만두고, 설정예다.Threshold 옵션은 이런 때에야말로 활용하자.

log4php.appender.mail=LoggerAppenderMailEvent
log4php.appender.mail.From="root@localhost"
log4php.appender.mail.To="sug@localhost"
log4php.appender.mail.layout=LoggerPatternLayout
log4php.appender.mail.layout.ConversionPattern="%d %5p %c{1} - %m%n"
log4php.appender.mail.Subject="test mail from php"
log4php.appender.mail.Threshold=WARN

LoggerAppenderSocket

SocketAppender(을)를 참조.소켓으로 송신한다.log4J 의 SocketAppender (은)는,Java 의 시리아라이제이션을 사용해 LoggingEvent (을)를 송신했지만, 이 LoggerAppenderSocket 에도 비슷한 사양이 있다.

옵션은 다음과 같이.

RemoteHost
Hostname
양쪽 모두 송신해야 할 서버의 호스트명을 지정한다.Hostname (분)편은 Deprecated 그래서,RemoteHost 만을 사용해야 한다.
Port
송신해야 할 서버가 리슨 하고 있는 포토 번호.디폴트는 4446.
Timeout
서버가 연결되지 않을 때에, 단념하기 위한 타임 아웃 시간.단위는 초.디폴트는 30(초).
LocationInfo
log4php 그럼, 로그의 발생행·파일명·발생 함수명을 줍기 시작하는데, 일부러 스택 트레이스를 보고 데이터를 구축하지 않으면 안 된다.그러니까, 「로그 이벤트를 보낸다」때에 이것을 구축해 보낼지가 옵션이다.디폴트는 false (이어)여, 구축하지 않고 보내지 않는다....하지만, 버그가 있다.true (으)로 하면,
Fatal error: Call to undefined function:  getlocationinfo() in /home/sug/.../lo
  g4php/appenders/LoggerAppenderSocket.php on line 270

(와)과 에러 해 준다.마음대로 해 줘.
UseXml
log4php 그럼, 로그 이벤트를 보낼 때에 2방법의 보내는 방법이 생긴다.하나는 PHP 의 오브젝트·시리아라이제이션을 사용해 보내는 방식이며, 하나 더는 XML 그리고 보내는 방식이다.이 어느 쪽인지를 이 옵션으로 지정한다.디폴트는 false (이어)여, 오브젝트·시리아라이제이션으로 보낸다.
Log4jNamespace
UseXml 옵션이 true(XML그리고 보낸다) 케이스로, 로그 이벤트는 LoggerXmlLayout 그리고 정형되어 보내지지만, 그 때에 사용하는 이름 공간을 Log4j 의 것으로 하는지,Log4php 의 것으로 하는지를 선택한다.디폴트는 false 이다.
layout
불요
Threshold
레벨을 지정해, 그 레벨 이하라고 출력하지 않게 하는 반응을 일으키는 최소의 물리량.모든 Appender 의 공통 옵션.

뭐이것은 실험이다.이런 설정 파일로 좋을 것이다.

log4php.appender.socket=LoggerAppenderSocket
log4php.appender.socket.Remotehost="localhost"
log4php.appender.socket.Port=4329
log4php.appender.socket.UseXml=false
# log4php.appender.socket.Log4jNamespace=true

그리고, 적당한 서버 프로그램으로 4329차례를 감시 하게 한다.거기에 테스트 프로그램으로부터 LoggerAppenderSocket (을)를 사용해 보내면, 이렇게 된다.

# java temp.MyServer
read from /127.0.0.1: O:18:"loggerloggingevent":10:{s:4:"fqcn";s:14:"LoggerCat
egory";s:12:"categoryName";s:8:"Sug.Test";s:5:"level";O:11:"loggerlevel":3:{s:
5:"level";i:50000;s:8:"levelStr";s:5:"FATAL";s:16:"syslogEquivalent";i:0;}s:3:
"ndc";N;s:17:"ndcLookupRequired";b:1;s:7:"message";s:13:"FATAL MESSAGE";s:15:"
renderedMessage";N;s:10:"threadName";N;s:9:"timestamp";N;s:12:"locationInfo";N
;}
Disconnected: /127.0.0.1

뭐, 이런 시리아라이제이션 사양을 PHP (은)는 가지고 있는 것이다.만약, 서버를 PHP 그리고 쓰고,seriarize() ⇔ unserialize() 그리고 바탕으로 되돌리면, 오브젝트를 재생할 수 있게 되는 것이다.다음은,

log4php.appender.socket.UseXml=true

(으)로서 하고,XML그리고 이벤트를 보낸 결과이다.

read from /127.0.0.1: <log4j:event logger="Sug.Test" level="FATAL"
 thread="1167" timestamp="1144483927497">
read from /127.0.0.1: <log4j:message><![CDATA[FATAL MESSAGE]]></log4j:message>
read from /127.0.0.1: <log4j:locationInfo class="main" file=
"/home/sug/public_html/soft/log4j/php/mytest.php" line="10" method="main" />
read from /127.0.0.1: </log4j:event>

어머나... LocationInfo 하 false 일텐데,LocationInfo (을)를 보내 버리고 있다...명백하게 버그야.한층 더 여기서 신경이 쓰이는 것은 Log4jNamespace = 미정도리 == false 일텐데, 이 XML 의 이름 공간이 「log4j:」일이다.예를 들어와 같이 LoggerXmlLayout 그리고,

log4php.appender.echo=LoggerAppenderEcho
log4php.appender.echo.layout=LoggerXmlLayout
log4php.appender.echo.layout.Log4jNamespace=false

(와)과 하고 주면, 올바르고 「log4php:」의 이름 공간을 사용해 준다.

<log4php:event logger="Sug.Test" level="FATAL" thread="1188" timestamp="1144484562539">
<log4php:message><![CDATA[FATAL MESSAGE]]></log4php:message>
<log4php:locationInfo class="main" 
file="/home/sug/public_html/soft/log4j/php/mytest.php" line="10" method="main" />
</log4php:event>

버그같지만 우선 「log4j:」의 이름 공간이 Chainsaw 등의 호환성은 좋기 때문에, 영향은 적은가.무엇인가 버그가 많다...

LoggerAppenderPhp

이것은 log4php 독자적인 사양.요컨데 PHP 하지만 가지고 있는 에러 처리의 기구를 사용하고 로그를 한다.trigger_error() (을)를 부르는 것이다.

옵션은 다음과 같이.특히 아무것도 필요 없다.

layout
불요
Threshold
레벨을 지정해, 그 레벨 이하라고 출력하지 않게 하는 반응을 일으키는 최소의 물리량.모든 Appender 의 공통 옵션.

그리고,log4php 의 로그 레벨과PHP 의 에러 레벨과의 대응 관계는 이러하다.

log4php PHP
DEBUG E_USER_NOTICE
INFO E_USER_NOTICE
WARN E_USER_WARNING
ERROR E_USER_ERROR
FATAL E_USER_ERROR

그리고, 실제 이 에러를 발생 시켜 보자.표시는 LoggerAppenderEcho (와)과 겹치게 하기로 한다.

echo 2006-04-08 17:45:36,543  INFO Test - test start

Notice: Sat Apr  8 17:45:36 2006,543 [1260] INFO Sug.Test - test start
 in /usr/local/share/log4php/appenders/LoggerAppenderPhp.php on line 80
echo 2006-04-08 17:45:36,545  WARN Test - Warning Message

Warning: Sat Apr  8 17:45:36 2006,545 [1260] WARN Sug.Test - Warning Message
 in /usr/local/share/log4php/appenders/LoggerAppenderPhp.php on line 78
echo 2006-04-08 17:45:36,547 ERROR Test - ERROR MESSAGE

Fatal error: Sat Apr  8 17:45:36 2006,547 [1260] ERROR Sug.Test - ERROR MESSAGE
 in /usr/local/share/log4php/appenders/LoggerAppenderPhp.php on line 76

어?3건 밖에 나오지 않는다....이것은 trigger_error() 의 사양으로,E_USER_ERROR 그리고 불렸을 경우에는, 「실행을 중지한다」라고 하는 디폴트의 에러 핸들러가 기동되는 것으로 있다.물론, 에러 핸들러를 덧쓰기해버리면 이것은 회피할 수 있다.

require_once( '../log4php-0.9/src/log4php/LoggerManager.php' );

# 자기 부담의 에러 핸들러
function myhandler( $level, $mess, $file, $line ) {
    echo "[$level] $message - $file,$line\n";
}

# 에러 핸들러의 등록
set_error_handler( 'myhandler' );

$logger =& LoggerManager::getLogger('Sug.Test');
$logger->info( 'test start' );
$logger->warn( 'Warning Message' );
# 더이상 이것이 걸리지 않는다.
$logger->error( 'ERROR MESSAGE' );
$logger->fatal( 'FATAL MESSAGE' );
echo "test body\n";
$logger->debug( 'only debug' );
$logger->info( 'test end' );

(이)라고 해도 에러 발생 개소의 리포트가

 in /usr/local/share/log4php/appenders/LoggerAppenderPhp.php on line 78

왜냐하면 맞아, 사용할 수 있는 인...

LoggerAppenderSyslog

SyslogAppender(을)를 참조.이것은 유일 능력적으로 Log4J 에 이기고 있는 것일까? 요컨데 PHP 의 syslog() (을)를 부르고,syslog 한다 Appender 이다.Java (은)는 플랫폼·인디펜던트를 구가하고 있으므로,OS 의존의 syslog(2) (은)는 사용하지 못하고, 그 대신에 UDP 그리고 리모트 로그 서버에 넷 넘어로 전달하는 것만으로 있다(그쪽이 플랫폼 독립인 것은 무엇인가 모순되고 있는 것 같은...).하지만,PHP하 PHP 의 함수의 옆에서 native code 서포트를 해 버린다 (뜻)이유로, 당당히 로컬 syslog (을)를 할 수 있다 syslog() (을)를 가지고 있다.그것을 이것은 사용한다.

옵션은 다음과 같이.특히 아무것도 필요 없다.

layout
불요
Threshold
레벨을 지정해, 그 레벨 이하라고 출력하지 않게 하는 반응을 일으키는 최소의 물리량.모든 Appender 의 공통 옵션.

그리고,log4php 의 로그 레벨과syslog 의 에러 레벨과의 대응 관계는 이러하다.

log4php syslog
DEBUG LOG_DEBUG
INFO LOG_INFO
WARN LOG_WARNING
ERROR LOG_ERR
FATAL LOG_ALERT

그리고, 실제의 로그가 어떻게 될까...에 대해서는,UNIX 계의 경우는,SyslogAppender 에 써 있으므로, 그쪽을 봐 줘.그리고,Windows 의 경우는, 이것이 실질상 NTEventLogAppender (이)라고 같은 것이 된다.

실제로 로그에 나오는 것은, 로그 메세지만으로, 나머지는 완전히 syslog 옆의 출력 사양에 따른다.log4J 의 SyslogAppender (와)과 달라, 아무것도 생각하지 않아 좋다.조금 실험해 보았지만,FACILITY 하 LOG_USER (을)를 사용하고 있다.이 근처에 는 syslog() (을)를 openlog() (을)를 사용하지 않고 열렸을 경우의 디폴트의 FACILITY 의 문제이므로, 참고라고 생각했으면 좋겠다(OS의 설정에 따라서 다른 케이스가 있을 수 있다).뭐 노력해 /etc/syslog.conf (을)를 설정하면, 이 로그를 더욱 리모트 로그 서버에 전달하는 것도 가능하기도 하다 (뜻)이유다...

덧붙여서 시스템의 로그 파일에 나오는 내용은 다음과 같이 되었다(필자의 경우!).

Apr  8 18:19:43 bizet php: test start
Apr  8 18:19:43 bizet php: Warning Message
Apr  8 18:19:43 bizet php: only debug
Apr  8 18:19:43 bizet php: test end
Apr  8 18:19:43 bizet php: Another Logger!

요컨데 PHP 의 syslog() 하지만 「php:」라고 하는 프레픽스를 붙여 단지 로그 메세지를 기록할 만한 출력이다.

LoggerAppenderNull

NullAppender(을)를 참조.아무것도 하지 않는다.이것은 완벽하게 Log4J (와)과 기능이 공통된다(쓴웃음).

옵션은 다음과 같이.

layout
불요
Threshold
레벨을 지정해, 그 레벨 이하라고 출력하지 않게 하는 반응을 일으키는 최소의 물리량.모든 Appender 의 공통 옵션.

설정예는 이런 곳에서 있다.

log4php.appender.null=LoggerAppenderNull

log4php.logger.Sug.Test=debug, null
log4php.rootLogger=debug, null

출력은 이렇게 된다.

% php mytest.php
test body  ← 참고를 위해서 echo 그리고 내고 있는 메세지.로그는 아니다.

찬미했으니까.



 

copyright by K.Sugiura, 1996-2006

HTTP/1.1 200 OK Date: Thu, 17 Jan 2008 17:07:05 GMT Server: Apache/2.2.3 (Debian) DAV/2 PHP/5.2.0-8+etch9 mod_ssl/2.2.3 OpenSSL/0.9.8c Content-Length: 0 Keep-Alive: timeout=10, max=50 Connection: Keep-Alive Content-Type: application/x-perl

 

 

Posted by 김용환 '김용환'

댓글을 달아 주세요