'스크립트'에 해당되는 글 5건

  1. 2009.09.17 PHP V6 새로운 기능과 미래
  2. 2008.09.11 로그 모니터링시 특정 문자를 highlight 하기 (2)
2009.09.17 18:48

PHP V6 새로운 기능과 미래

PHP V6에서 등장할 새로운 기능과 PHP 스크립트에서 달라질 부분을 살펴보자

Nathan A. Good, 선임 정보 엔지니어, Consultant
옮긴이: 박재호 이해영 dwkorea@kr.ibm.com
2008 년 7 월 29 일

PHP 다음 버전인 V6는 객체 지향 관점에서 사용하기 쉽도록 새로운 기능을 제공하고 문법을 개선합니다. 또한 핵심 함수에서 유니코드를 지원하는 등 다국어 지원과 안정성이 한층 높아졌습니다.

PHP는 이미 인기가 높다. (Netcfaft에 따르면) 수백만 도메인이 PHP를 사용하며, 대다수 ISP가 PHP를 지원하며, 야후!와 같이 대표적인 웹 회사에서도 PHP를 사용한다. 이에 PHP V6는 유용성과 안정성을 더욱 높여주는 새로운 기능을 제공하여 현재 성공에 박차를 가하리라 보인다. 여러분은 PHP V6를 맞이할 준비가 되었는가? 내일 당장 PHP V6로 판올림한다면 지금 스크립트가 그대로 돌아갈까? 아니면 여기저기 손봐야 할까? 이 기사에서는 PHP V6에서 달라진 내용 중에서도 현재 스크립트에 영향을 미치는 부분에 초점을 맞춘다(일부 새 기능은 PHP V5.x로 역이식되었다).

아직 PHP를 사용하지 않고 고려 중이라면 최신 기능을 살펴보기 바란다. 코어 함수 유니코드 지원에서 XML 기능에 이르기까지, 복잡한 프로그램 구현을 수월하게 만들어주는 기능이 많다.

새로운 PHP V6 기능

PHP V6는 현재 개발자 스냅샷으로 사용이 가능하다. 따라서 이 기사에서 언급하는 기능과 변경 사항 대다수를 내려받아 사용할 수 있다. 현재 스냅샷에서 제공하는 기능은 참고자료를 살펴본다.

유니코드 지원 개선

PHP V6는 많은 코어 함수에서 유니코드 문자열을 더 잘 지원한다. 따라서 PHP 응용 프로그램도 다국어 문자 집합을 더 잘 지원하게 되었다. 다국어 지원(i18n) 기능이 더 낫다는 이유로 자바(Java™) 등 다른 언어를 사용했다면 이번 기회에 개선된 PHP V6를 살펴보기 바란다.

PHP V6 개발자 버전은 지금이라도 당장 내려받아 사용할 수 있으므로 유니코드 문자열 지원 기능도 즉시 확인이 가능하다. 유니코드로 테스트하여 검증된 함수 목록은 참고자료를 살펴본다.

유니코드란?
유니코드란 주로 다국어 지원(i18n)과 지역화(l10n)을 목적으로 하는 업계 표준의 문자 집합, 문자 인코딩, 인코딩 방법이다. UTF(Unicode Transformation Format)는 문자를 유니코드로 인코딩하는 방법을 명세한다. 유니코드와 UTF에 대한 자세한 정보는 참고자료를 살펴본다.

이름 공간

이름 공간(namespace)은 메서드 이름과 클래스 이름에 난해한 접두어를 붙이지 않고도 함수 이름과 클래스 이름이 충돌하지 않도록 막아주는 방법이다. 이름 공간을 사용하면 다른 사람이 사용하는 클래스 이름을 사용해도 문제가 발생하지 않는다. Listing 1은 PHP에서 이름 공간을 사용하는 예다.

PHP V6로 판올림해도 현재 PHP 코드를 수정할 필요는 없다. 이름 공간을 정의하지 않았더라도 코드는 문제없이 돌아간다. 이름 공간 기능은 PHP V5.3로 역이식될 예정이므로, 역이식이 끝난 다음부터 여러분의 PHP 프로그램에서 이름 공간을 사용하면 되겠다.

Listing 1. 이름 공간 예
                
<?php
// XMLWriter를 직접 구현해야 하는 이유는 확실하지 않지만, 최소한 PHP에서 
// XMLWriter라는 이름은 충돌을 일으키지 않을 것이다.
namespace NathanAGood;
class XMLWriter 
{
    // 구현부
}

$writer = new NathanAGood::XMLWriter();
?>

웹 2.0 기능

PHP를 사용하는 방식과 현재 PHP 스크립트 모양새에 따라 PHP V6에서 바뀐 언어와 구문 차이점이 현재 코드에 미치는 영향이 달라진다. 특히 다음에 소개하는 새 기능을 사용하면 PHP 프로그램에 웹 2.0 기능을 바로 넣을 수 있다.

SOAP

SOAP은 웹 서비스끼리 “통신”하는 프로토콜 중 하나로, 자바와 마이크로소프트(Microsoft®) .NET 등 꽤 많은 언어에서 지원한다. SOAP 외에도 REST(Representational State Transfer) 등 웹 서비스를 사용하는 방법이 없지는 않으나, SOAP은 상호 운영성을 높이도록 다양한 플랫폼에 걸쳐 웹 서비스를 사용하는 일반적인 방법으로 자리 잡았다. 현재 PEAR(PHP Extension and Application Repository) 라이브러리는 SOAP 모듈을 제공하며 V5에서는 SOAP 확장 기능(SOAP extension to PHP)도 나왔다. 그러나 이 확장 기능은 기본적으로 비활성화되어 있으므로, 사용하려면 직접 활성화하거나 ISP에서 활성화해 주어야 한다. 또한 PEAR 패키지를 사용하면 SOAP 패키지 같은 SOAP 클라이언트와 서버를 작성할 수 있다.

V6에서는 SOAP 확장 기능이 기본적으로 활성화된다. 이 확장 기능을 사용하면 SOAP 클라이언트와 SOAP 서버를 구현하기 쉬워진다. 따라서 웹 서비스를 사용하고 제공하는 PHP 응용 프로그램을 작성하기도 쉬워진다.

SOAP 확장 기능이 기본적으로 활성화되어 있다면 PHP에서 별도로 구성할 필요가 없다는 뜻이다. 하지만 V6 환경에서 개발한 PHP 프로그램을 ISP에 게시할 때는 ISP의 판올림된 PHP 환경에서 SOAP 확장 기능이 활성화되어 있는지 ISP에 확인하는 편이 안전하다.

XML

PHP V5.1부터는 XMLReader와 XMLWriter가 PHP 코어에 포함되었다. 따라서 PHP 프로그램에서 XML을 다루기가 훨씬 더 수월해졌다. SOAL 확장 기능과 마찬가지로, SOAP이나 XML을 사용한다면 V4보다 XML 지원 기능이 훨씬 우수한 PHP V6를 반기리라 생각한다.

XMLWriter와 XMLReader는 스트림에 기반을 둔 객체 지향 클래스로, XML 구조를 일일이 신경쓰지 않고도 XML 문서를 간편하게 읽고 쓸 수 있다.

없어진 내용

PHP V6에는 새로운 기능도 추가했지만 기존 버전에서 일부 함수와 기능을 없애기도 했다. 대다수는 register_globalssafe_mode 등 현재 PHP에서 보안 허점을 노출할 가능성 때문에 "바람직하지 않다"고 여겼던 기능들이다. PHP를 정리하려는 노력의 일환으로 현재 버전에서 제거하였거나 더 이상 권장하지 않는 함수와 기능을 아래에 소개한다. ISP나 기업이 PHP V6로 판올림해버리면 기존 스크립트가 깨진다는 이유로 정리 작업을 반대하는 사람도 있지만, PHP 팀이 현재 버전의 허점을 메꾸고 좀 더 깔끔하고 안전한 기능을 제공한다는 이유로 이런 노력에 찬성하는 사람도 많다.

현재 PHP 버전에서 없어지는 기능은 다음과 같다.

  • magic_quotes
  • register_globals
  • register_long_arrays
  • safe_mode

magic_quotes

이식성, 성능, 편의성 등과 같은 이유로 PHP 문서에서는 magic_quotes 사용을 권장하지 않는다. 너무도 바람직하지 못한 탓에 PHP V6에서 몽땅 없애버렸을 정도다. 그러므로 PHP V6로 판올림하기 전에 코드에서 magic_quotes를 모두 없애기 바란다. 데이터베이스 호출 시 문자열을 이스케이프하려고 magic_quotes를 사용했다면 매개변수화된 질의로 대체하는 편이 바람직하다. 만약 데이터베이스가 매개변수화된 질의를 지원하지 않는다면 (MySQL에서는) mysql_escape_string 혹은 (PostgreSQL에서는) pg_escape_string 같은 이스케이프 함수를 사용한다. Listing 2는 magic_quotes를 사용하는 예다.

Listing 2. magic_quotes 사용(권장하지 않음)
                
<?php
// magic_quotes를 켜놓았다고 가정한다.
$sql = "INSERT INTO USERS (USERNAME) VALUES $_GET['username']";
?>

Listing 3은 Listing 2 코드를 새로운 PHP V6에 맞게 수정한 코드다.

Listing 3. 매개변수화된 질의 사용(권장함)
                
<?php
// MySQL에서 적절하게 매개변수화된 질의를 사용하는 예다.
$statement = $dbh->prepare("INSERT INTO USERS (USERNAME) VALUES ?");
$statement->execute(array($_GET['username']));
?>

magic_quotes를 더 이상 지원하지 않으므로 get_magic_quotes_gpc() 함수도 더 이상 지원하지 않는다. 일부 오래된 PHP 스크립트는 영향을 받을지도 모르므로, PHP 버전을 판올림하기 전에 이런 함수를 사용하는 곳을 찾아내어 코드를 적절히 수정하기 바란다.

register_globals

register_globals 구성 키는 PHP V4.2에서 이미 기본적으로 꺼짐 상태다. 당시로는 꽤나 논란이 되었던 문제였다. register_globals를 켜면 HTML 폼으로 값을 침투시킬 수 있는 변수를 사용하기가 쉬워진다. 그런데 PHP 스크립트는 반드시 변수를 초기화할 필요가 없으므로 register_globals를 사용하면 보안 허점이 생긴다. 자세한 내용은 참고자료에서 언급하는 register_globals 문서를 살펴본다. Listing 4는 register_globals를 사용하는 예제다.

Listing 4. register_globals 사용(권장하지 않음)
                
<?php
// 보안 허점이 생긴 이유는 register_globals를 켜놓아서 user_authorized를 위한
// 변수가 사용자가 질의 문자열에 실어 보낸 값으로 설정될 가능성이 있기 때문이다.
// (예: http://www.example.com/myscript.php?user_authorized=true)
if ($user_authorized) {
    // 모든 사람에게 민감한 자료를 보여준다.
}
?>

PHP에서 전역 변수를 사용한다면 수정하기 바란다. PHP V6로 판올림하지 않더라도 보안 문제를 고려해 코드를 정정하는 편이 바람직하다. Listing 5는 Listing 4를 수정한 코드다.

Listing 5. 구체적으로 지정(권장함)
                
<?php
function is_authorized() {
    if (isset($_SESSION['user'])) {
        return true;
    } else {
        return false;
    }
}

$user_authorized = is_authorized();
?>

register_long_arrays

register_long_arrays 설정을 켜면 사전 정의된 $HTTP_*_VARS 변수를 등록한다. 현재 $HTTP_*_VARS 변수를 사용한다면 짧은 변수로 고치기 바란다. 이 설정은 PHP 5에서 (역호환성 문제로) 지원하는데, PHP 개발자들은 성능을 이유로 끄라고 권장한다. Listing 6은 register_long_arrays를 사용하는 예다.

Listing 6. 등록된 배열 사용(권장하지 않음)
                
<?php
    // 질의 문자열에 주어진 사용자 값의 이름을 피드백을 위해 출력한다.
    // http://www.example.com/myscript.php?username=ngood
    echo "Welcome, $HTTP_GET_VARS['username']!";
?>

PHP 코드가 Listing 6과 같다면 Listing 7로 수정한다. register_long_arrays 설정이 켜져 있다면 설정을 끈 다음 스크립트를 다시 테스트한다.


Listing 7. $_GET 사용(권장함)
                
<?php
    // $_GET 배열을 대신 사용한다.
    echo "Welcome, $_GET['username']!";
?>

safe_mode

safe_mode 구성 키를 켜면 실행 중인 스크립트의 소유자와 스크립트가 작업을 수행하는 파일의 소유자를 일치시킨다. ISP가 흔히 사용하는 공유 서버 환경에서 보안 문제를 해결하려고 나온 방법이다. (safe_mode가 사라지면서 영향을 받게 되는 함수 목록은 참고자료를 살펴본다.) 기존 PHP 코드는 별다른 영향을 받지 않으리라 생각한다. 하지만 앞으로 PHP 코드를 작성할 때나 safe_mode를 사용할 때를 대비하여 알아두는 편이 좋다.

PHP 태그

PHP V6는 (PHP 태그보다 짧은) 마이크로소프트 ASP(Active Server Pages) 형식의 태그를 더 이상 지원하지 않는다. 즉, 이제 PHP 스크립트에서는 <%%>를 더 이상 사용하지 못한다. PHP 파일에서 <%%>를 사용하지 않는다면 큰 문제가 없다. 모두 <?php?>로 교체하기 바란다.

FreeType 1과 GD 1

PHP 팀은 FreeType 1과 GD 1을 더 이상 지원하지 않을 계획이다. 둘 다 오래되었고 별다른 개발 노력이 없다는 이유에서다. 두 라이브러리 모두 기능이 더 나은 새 버전이 있다. FreeType 1과 GD 1에 대한 자세한 내용은 참고자료를 살펴본다.

ereg

PHP V6부터는 (POSIX 정규식을 지원하는) ereg 확장 기능도 지원 목록에서 사라진다. 따라서 POSIX regex 함수를 사용하는 코드는 ereg 기능을 포함하면 영향을 받는다. 현재 POSIX regex를 사용한다면 시간을 투자해 PCRE(Perl-Compatible Regular Expression) 함수로 바꾸라고 권장한다. PCRE 함수가 성능 면에서나 기능 면에서 더 낫다. 표 1은 ereg를 제거한 후부터 사용하지 못할 POSIX regex 기능이다. 상응하는 PREC 함수는 아래와 같다.


표 1. ereg() 함수와 상응하는 PCRE 함수
ereg() 함수 상응하는 preg() 함수
ereg(), eregi() preg_match()
ereg_replace(), ereg_replacei() preg_replace()

PHP V5.3

여기서 언급한 일부 기능은 PHP V5.3으로 역이식되었다. PHP V5.3은 2008년 1사분기에 출시될 예정이다. 먼저 V5.3으로 판올림한 후 새 기능을 사용해 봐도 좋겠다. 그러면 V6로 판올림하기가 다소 수월해지리라 생각한다. 다음은 V5.3으로 역이식된 기능이다.

  • 이름 공간
  • XMLReader와 XMLWriter 기본적으로 지원





요약

PHP V6는 새로운 기능을 제공하고 이전 PHP 버전을 정리한다. 새로운 기능을 활용하고 없어진 기능에 대응하려면 (참고자료에서 언급하는) NEWS 리스트를 읽는다. NEWS 리스트는 PHP V6에 들어갈 (혹은 들어가지 않을) 최신 정보를 담고 있다. PHP V6 개발자 버전을 지금이라도 내려받을 수 있으니, 필요하다면 기존 프로그램이 영향을 받을지 테스트해보아도 좋겠다. 또한 이 기회를 빌어서 앞서 언급한 비권장 기능을 제거하고 문법을 개선하는 등 기존 스크립트를 정리해도 좋겠다.


참고자료

교육
  • NEWS 파일: PHP V6와 관련하여 최근 소식을 전한다.
  • Sara Golemon 블로그를 살펴본다.
  • PHP Internals: PHP 개발자들이 변경 중인 내용을 소개한다.
  • PHP meeting notes: V6에서 변경하는 내용과 변경하지 않는 내용을 소개한다.
  • core PHP functions: 유니코드를 지원하는 코어 함수 목록이다.
  • Unicode at Wikipedia: 유니코드 개념을 소개하는 위키 페이지다.
  • PHP.net: PHP 개발자들을 위한 정보 제공처다.
  • "Recommended PHP reading list.": IBM 웹 응용 프로그램 개발자들이 PHP 프로그래머와 관리자에게 권장하는 목록이다.
  • PHP 기사: PHP와 관련한 developerWorks 기사 목록이다.
  • PHP project resources: IBM developerWorks에서 제공하는 PHP 자료다. PHP 실력을 늘이고 싶다면 참고한다.
  • developerWorks 포드캐스트는 소프트웨어 개발자들이 나누는 토론과 흥미로운 인터뷰 자료를 제공한다.
  • PHP와 데이터베이스를 연동한다면 Zend Core for IBM을 권장한다.IBM Zend Core는 설치하기 쉽고 사용하기 간편한 PHP 개발 환경으로, IBM DB2 V9을 지원한다.
  • developerWorks 기술 행사와 웹 캐스트를 놓치지 말자.
  • IBM 오픈 소스 개발자들이 흥미를 가지는 컨퍼런스, 전시회, 웹 캐스트 등 전세계적으로 벌어지는 행사 목록도 참고한다.
  • developerWorks 오픈 소스 영역은 오픈 소스 개발과 구현에 필요한 자원을 모아놓은 사이트다. 오픈 소스를 개발하는 방법, 오픈 소스 도구, 오픈 소스 프로젝트, 오픈 소스에서 IBM 제품을 사용하는 방법 등을 상세히 설명한다.
  • developerWorks On demand demos에서 IBM 제품과 기술, 오픈 소스 제품과 기술을 무료로 시연해 볼 수 있다.

제품 및 기술 얻기
  • PHPUnit을 내려받아 판올림 후 PHP 스크립트를 테스트하자.
  • 다음번 오픈 소스 프로젝트에 IBM 평가판 소프트웨어를 활용해보자. 다운로드나 DVD로 제공한다.
  • IBM 제품 평가판을 내려받아서, DB2®, Lotus®, Rational®, Tivoli®, WebSphere® 같은 응용 프로그램 개발도구와 미들웨어를 사용해보자.

토론

필자소개

Nathan Good은 미네소타 주 트윈 시티에 산다. 프로그램을 짜지 않을 때는 PC와 서버를 직접 만들고, 새 기술을 읽고 시도하며, 친구들을 오픈 소스 소프트웨어 운동으로 끌어들이려고 애쓴다. 컴퓨터 앞에 앉아있지 않은 시간은 (스스로 컴퓨터 앞에서 많은 시간을 보낸다고 인정하지만) 가족과 시간을 보내며 교회에 참석하거나 영화를 본다. 웹 사이트 주소는 http://www.nathanagood.com/이다.



출처 : http://www.ibm.com/developerworks

Trackback 0 Comment 0
2008.09.11 17:57

로그 모니터링시 특정 문자를 highlight 하기

apache 웹로그, php 에러로그, syslog를 통한 로그를 모니터링할 때 특정 문자열에 대해서는 highlight해주면 원하는 부분만 쉽게 볼 수 있을 것이다. 또한 수치를 모니터링하는 경우, 0~59는 양호, 60~79 주의, 80~99는 경고를 나타내기위해 각각 녹색, 파란색, 빨간색으로 표시해준다면, 많은 로그가 순간적으로 스크롤되더라도 눈에 쉽게 띌 것이다.
이 글은 highlight 처리를 해주는 1) sed를 이용한 쉘스크립트와 2) 이보다 더 나은 perl 스크립트를 통해 모니터링하는 방법을 설명한다.

1. sed를 이용한 highlight 스크립트

* view.sh 내려받기

#!/bin/bash
#
# 특정 문자를 highlight한다. (view.sh)
#
# by 좋은진호(truefeel, http://coffeenix.net/ )

# color
szColBk="^[[;30m";      szColBk1="^[[1;30m"     # black
szColRe="^[[;31m";      szColRe1="^[[1;31m"     # red
szColGr="^[[;32m";      szColGr1="^[[1;32m"     # green
szColYe="^[[;33m";      szColYe1="^[[1;33m"     # yellow
szColBl="^[[;34m";      szColBl1="^[[1;34m"     # blue
szColPu="^[[;35m";      szColPu1="^[[1;35m"     # magenta(purple)
szColCy="^[[;36m";      szColCy1="^[[1;36m"     # cyan
szColGy="^[[;37m";      szColWh="^[[1;37m"      # white
szNormal="^[[;m"

#
sed \
        -e "s/^[A-Z][a-z][a-z] *[0-9]* //g" \
        \
        -e "s/ \(192.168.123.[0-9]*\)/${szColGr} \\1$szNormal/g" \
        \
        -e "s/\(httpd\)/${szColCy}\\1$szNormal/g" \
        -e "s/\(vsftpd\)/${szColCy}\\1$szNormal/g" \
        -e "s/\(proftpd\)/${szColCy}\\1$szNormal/g" \
        -e "s/\(ftpd\)/${szColCy}\\1$szNormal/g" \
        -e "s/\(sshd\)/${szColCy}\\1$szNormal/g" \
        -e "s/\(xinetd\)/${szColCy}\\1$szNormal/g" \
        -e "s/\(Connection attempt\)/${szColRe1}\\1$szNormal/g" \
        -e "s/\(authentication failure\)/${szColRe1}\\1$szNormal/g" \
        -e "s/\(BAD SU\)/${szColRe1}\\1$szNormal/g" \
        \
        -e "s/\(nfs server\)/${szColYe}\\1/g" \
        \
        -e "s/$/$szNormal/g"
[/quote]

사용은 tail -f 로그파일명 |./view.sh 형태로 사용하면 된다.

첫번째 부분은 색깔을 정의한 변수이다. 여기서 ^[[;31m ANSI코드로, ^[ 문자는 ESC키를 의미한다. 쉘에서 입력할 때 Ctrl+V를 누른 후 ESC키를 누르면 입력할 수 있다. 색깔은 사용하는 터미널에 따라서 약간 다르게 표시될 수도 있다.


그 다음부터는 sed를 이용해서 문자열을 변환처리하며, 한줄당 하나의 정규표현식을 사용하였다. 부분적으로 살펴보자.

 1:     -e "s/^[A-Z][a-z][a-z] *[0-9]* //g" \

기본적으로 -e s/변환전문자열/변환후문자열/g 형식을 사용하는데, 위는 syslog를 통해 남은 로그중 'Oct 30'과 같이 '월일'을 표시하지 않기 위한 정규표현식이다.
 
 1:     -e "s/ \(192.168.123.[0-9]*\)/${szColGr} \\1$szNormal/g" \
 2:     \
 3:     -e "s/\(httpd\)/${szColCy}\\1$szNormal/g" \
 4:     -e "s/\(vsftpd\)/${szColCy}\\1$szNormal/g" \

첫번째줄은 특정 IP대역을 highlight하기 위한 것으로 서버의 IP, 접속하는 PC의 IP등을 한줄에 하나씩 적어주면 좋을 것이다. 두번째줄의 \ 은 보기 좋게 구분하기 위한 것이며, 세번째와 네번째줄은 각각 httpd와 vsftpd를 highlight한다.

 1:     -e "s/\(nfs server\)/${szColYe}\\1/g" \
 2:     \
 3:     -e "s/$/$szNormal/g"

첫번째줄은 'nfs server'로 문자열이 나온다면, 해당 줄 끝까지 highlight한다. ${szColYe}\\1과 server과 ${szColYe}\\1$szNormal 의 차이를 생각하면 쉽게 이해가 될 것이다. 세번째줄은 줄의 끝부분에서 색깔 표시는 정상으로 돌려놓으라는 의미이다.

2. perl을 이용한 highlight 스크립트


위의 예제를 통해서 원하는 문자열을 원하는 색깔로 highlight하는 것은 쉽게 할 수 있을 것이다. 이젠 perl이용한 방법을 소개한다.

* view.pl 내려받기

#!/usr/bin/perl
#
# 특정 문자를 highlight한다. (view.pl)
#
# by 좋은진호(truefeel, http://coffeenix.net/ )

# color
$szColBk ="^[[;30m";    $szColBk1 ="^[[1;30m";  # black
$szColRe ="^[[;31m";    $szColRe1 ="^[[1;31m";  # red
$szColGr ="^[[;32m";    $szColGr1 ="^[[1;32m";  # green
$szColYe ="^[[;33m";    $szColYe1 ="^[[1;33m";  # yellow
$szColBl ="^[[;34m";    $szColBl1 ="^[[1;34m";  # blue
$szColPu ="^[[;35m";    $szColPu1 ="^[[1;35m";  # magenta(purple)
$szColCy ="^[[;36m";    $szColCy1 ="^[[1;36m";  # cyan
$szColGy ="^[[;37m";    $szColWh  ="^[[1;37m";  # white
$szNormal="^[[;m";

#
$szBeep="\a";

#
while(&lt;STDIN&gt;) {
    # log에서 필요없는 부분 삭제
        s/^[A-Z][a-z][a-z] *[0-9]* //g;

    # IP
        s/(192\.168\.123\.[1-9][0-9]{0,2})/$szColGr$1$szNormal/g;

    # 줄 끝은 정상 색으로 변경
    s/$/$szNormal/;

    # 원하는 문자열에 색을 입힌다
        s/(httpd)/$szColCy$1$szNormal/g;
        s/(vsftpd|proftpd|ftpd)/$szColCy$1$szNormal/g;
        s/(sshd)/$szColCy$1$szNormal/g;
        s/(xinetd)/$szColCy$1$szNormal/g;
        s/(Connection attempt)/$szColRe1$1$szNormal/g;
        s/(authentication failure)/$szColRe1$1$szNormal/g;
        s/(BAD SU)/$szColRe1$1$szNormal/g;

    # 원하는 문자열을 찾으면 줄 끝까지 색을 읽힌다.
        s/(nfs server)/$szColYe$1/g;

    print $_;
}

사용은 shell스크립트를 사용할 때와 동일하게 tail -f 로그파일명 |./view.pl 형태로 사용하면 된다.

 1:     s/(192\.168\.123\.[1-9][0-9]{0,2})/$szColGr$1$szNormal/g;
 2:     ... 생략...
 3:     s/(vsftpd|proftpd|ftpd)/$szColCy$1$szNormal/g;

첫번째줄에서 192\.168\.123\.[1-9][0-9]{0,2} 은 sed를 이용할 때보다 더 정교하게 IP를 체크한 것으로, 1) 192.168.123. 시작하는 IP대역 2) 그 다음 1~9까지 숫자이고, 그다음에 숫자가 오게된다면 0~9까지 숫자가 0자리~2자리까지 가능하다. 정규 표현식에 대한 자세한 사항은 이 글의 주제를 벗어나는 내용이므로 '4 참고 자료'를 살펴보기 바란다. 세번째줄은 vsftpd, proftpd, ftpd 등의 문자를 highlight한다.

다음은 위의 스크립트를 이용하여 로그를 모니터링한 화면이다.

3. 수치에 따라 다른 색으로 표시

어떤 로그에 수치가 다음과 같이 실시간으로 쌓인다고 가정하자. 그리고, 그 수치는 'disk 54'와 같은 형태로 되어 있다.

---------  ------   --------
측정수치    상태     색깔
---------  ------   --------
0~59       양호      녹  색
60~79      주의      파란색
80~100     경고      빨간색
---------  ------   --------

다음은 perl을 이용하여 색을 표시하는 예이다. 그리고, 수치가 80이상일 땐 beep음을 발생한다. 이런한 방법은 서버의 load, disk 사용량, disk I/O, 커넥션 수, 메모리 사용량 등을 모니터링할 때 유용하게 사용할 수 있다.

 s/(disk [0-9][^0-9])/$szColGr$1$szNormal/;
 s/(disk [1-5][0-9][^0-9])/$szColGr$1$szNormal/;
 s/(disk [6-7][0-9])/$szColBl$1$szNormal/;
 s/(disk [8-9][0-9])/$szColRe1$1$szNormal$szBeep/;
 s/(disk 100)/$szColRe1$1$szNormal$szBeep/;

4. 참고 자료

* ANSI color codes
  http://pueblo.sourceforge.net/doc/manual/ansi_color_codes.html
* 정규표현식
  http://coffeenix.net/dir_catagory.php?cata_code=99
* Perl regular expressions
  http://www.perl.com/doc/manual/html/pod/perlre.html


출처 : 커피닉스( http://coffeenix.net/ )

Trackback 0 Comment 2
  1. 쇼코 2008.09.12 04:58 address edit & del reply

    허긍..이것이 다 모다요? 어렵잖아..전문가들이 쓰는거네=_=

  2. 2008.12.30 00:10 address edit & del reply

    비밀댓글입니다