スポンサーサイト

2023.04.20 Thursday
0

    一定期間更新がないため広告を表示しています

    category:- | by:スポンサードリンク | - | - | -

    logログ2

    2015.01.29 Thursday 06:56
    0
      [meguro@mgr01-A pchan]$ perl test2.pl
      1[meguro@mgr01-A pchan]$ l
      total 24
      -rw-rw-r-- 1 meguro meguro 354 Jan 11 06:41 env.pl
      -rw-rw-r-- 1 meguro meguro 1927 Jan 11 14:06 lib_common.pl
      -rw-rw-r-- 1 meguro meguro 186 Jan 11 14:07 test2.pl
      drwxrwxr-x 2 meguro meguro 4096 Jan 11 14:07 ./
      drwxrwxr-x 5 meguro meguro 4096 Jan 11 14:11 ../
      -rw-rw-r-- 1 meguro meguro 338 Jan 29 06:54 log_kinrisystem.log
      [meguro@mgr01-A pchan]$
      [meguro@mgr01-A pchan]$ cat test2.pl
      #!/usr/bin/perl

      require 'lib_common.pl' ;

      print logf("DEBUG" , "ssss test");
      print logf("INFO" , "ssss test");
      print logf("WARNING" , "ssss test");
      print logf("ERROR" , "ssss test");

      [meguro@mgr01-A pchan]$
      [meguro@mgr01-A pchan]$ cat lib_common.pl
      #!/usr/bin/perl

      use POSIX 'strftime';

      # エラーレベル
      our $E_LEVEL_DEBUG = 1;
      our $E_LEVEL_INFO = 2;
      our $E_LEVEL_WARNING = 3;
      our $E_LEVEL_ERROR = 4;

      # ログファイル
      $LOGFILE_NAME = "log_kinrisystem.log" ;

      # ログファイルに表示する、エラーレベル(対象のレベル以上を表示)
      $LOG_LEVEL = 2; # 1:DEBUG 2:INFO 3:WARNING 4:ERROR



      sub logf {
      my ($level,$message) = @_;
      my ($pkg,$file,$line) = caller;
      my @time = localtime;
      my $now = strftime "%Y/%m/%d %H:%M:%S", localtime;
      my $logmsg = $now . " [" . $level . "]" . $message . " at " . $file . " line " . $line . "¥n" ;

      if( $level eq "DEBUG") {
      if( $E_LEVEL_DEBUG >= $LOG_LEVEL ){
      log_write($logmsg); # すべてのメッセージを出力
      }
      }
      if( $level eq "INFO") {
      if( $E_LEVEL_INFO >= $LOG_LEVEL ){
      log_write($logmsg); # INFOレベル以上のメッセージを出力
      }
      }
      if( $level eq "WARNING") {
      if( $E_LEVEL_WARNING >= $LOG_LEVEL ){
      log_write($logmsg); # WARNレベル以上のメッセージを出力
      }
      }
      if( $level eq "ERROR") {
      if( $E_LEVEL_ERROR >= $LOG_LEVEL ){
      log_write($logmsg); # ERRORのメッセージを出力
      }
      }

      }

      sub log_write {
      my ($logmsg) = @_;

      # ログファイル追加モードでオープン
      open($fh_log, '>>', $LOGFILE_NAME) or die(qq/Can't open file "$LOGFILE_NAME": $!/);

      # ログ書き込み 日付 時間 : ログメッセージ(改行)
      printf($fh_log "%s", $logmsg);

      # ログファイルクローズ
      close($fh_log) or die(qq/Can't close file "$LOGFILE_NAME": $!/);

      }

      [meguro@mgr01-A pchan]$
      [meguro@mgr01-A pchan]$
      [meguro@mgr01-A pchan]$
      [meguro@mgr01-A pchan]$ cat env.pl
      #!/usr/bin/perl

      # エラーレベル
      our $E_LEVEL_DEBUG = 1;
      our $E_LEVEL_INFO = 2;
      our $E_LEVEL_WARNING = 3;
      our $E_LEVEL_ERROR = 4;

      # ログファイル
      $LOGFILE_NAME = "log_kinrisystem.log" ;

      # ログファイルに表示する、エラーレベル(対象のレベル以上を表示)
      $LOG_LEVEL = 2; # 1:DEBUG 2:INFO 3:WARNING 4:ERROR

      [meguro@mgr01-A pchan]$
      [meguro@mgr01-A pchan]$
      [meguro@mgr01-A pchan]$ cat *log
      2015/01/11 14:07:44 [INFO]ssss test at test2.pl line 6
      2015/01/11 14:07:44 [WARNING]ssss test at test2.pl line 7
      2015/01/11 14:07:44 [ERROR]ssss test at test2.pl line 8
      2015/01/29 06:54:27 [INFO]ssss test at test2.pl line 6
      2015/01/29 06:54:27 [WARNING]ssss test at test2.pl line 7
      2015/01/29 06:54:27 [ERROR]ssss test at test2.pl line 8
      [meguro@mgr01-A pchan]$
      [meguro@mgr01-A pchan]$
      category:- | by:ittoocomments(0)trackbacks(0) | -

      logログ

      2015.01.29 Thursday 06:52
      0
        どこでエラーを出力するべきか?
        では、これらの方法でエラーを出力する処理は、ソフトウェアのどこに記述すれば良いのでしょうか。
        1つは、ある関数でエラーが発生した時、エラーの出力もその関数の中で行ってしまう、
        という方針が考えられます。ログの出力は、たいていはこの方針で行われます。

        もう1つは、発生したエラーの情報を呼び出し側に渡して、エラーの出力は呼び出し側で行う、という方針も考えられます。
        エラーメッセージの出力は、たいていはこの方針で行われます。

        この2つの方針には、それぞれ利点と欠点があります。





        ログを出力する際の注意

        ログには、エラーの原因となった変数の値をそのまま出力することが多いです。しかし、エラーが発生した時の値は、不用意に出力するべきではありません。

        文字列
        文字列は、場合によっては終端文字が見つからず、異常に長い文字列になってしまっている可能性があります。文字列をそのまま出力すると、ログに出力するためのバッファをオーバーしたり、ログファイルを埋め尽くしてしまう可能性があります。

        ポインタ
        構造体やクラスの内容がおかしくなっている時は、ポインタが誤った位置を指している可能性があります。この時、ログに構造体やクラスの内容をそのまま出力しようとするのは危険なことがあります。

        これらのことに注意しないと、肝心のエラーが発生した時に、ログが出力されない、という状況になってしまいます。

        ログに出力しておくと役立つ情報






        ログレベル

        ログの緊急度や用途により、以下のようにログレベルを設定する。 Log4j のログレベルを踏襲しているため、運用の状況によっては Critical などのレベルを適宜追加すると良い。

        FATAL: 致命的なエラー。プログラムの異常終了を伴うようなもの。コンソール等に即時出力することを想定
        ERROR: エラー。予期しないその他の実行時エラー。コンソール等に即時出力することを想定
        WARN: 警告。廃要素となったAPIの使用、APIの不適切な使用、エラーに近い事象など、実行時に生じた異常とは言い切れないが正常とも異なる何らかの予期しない問題。コンソール等に即時出力することを想定
        INFO: 情報。実行時の何らかの注目すべき事象(開始や終了など)。コンソール等に即時出力することを想定。従ってメッセージ内容は簡潔に止めるべき
        DEBUG: デバッグ用の情報。システムの動作状況に関する詳細な情報。コンソールではなくログ上にだけ出力することを想定
        TRACE: トレース情報。更に詳細な情報。コンソールではなくログ上にだけ出力することを想定





        [Wed Aug 1 1:01:01 2012] [ERR] [client xxx.xx.xxx.xxx] Could not retrieve data from URL. in /var/www/html/path/to/somelib.php on line 123



        エラー発生時のエラーメッセージ・スタックトレースに加え、メソッドに対する引数もログに出力する
        使用するログレベルの数は抑える
        まず1番目に関してですが、実際のログを例に挙げて説明します(一部改変しています)。
        例えば以下のようなログが出力されたとします。これはFacebook SDKが吐くエラーメッセージを表示しただけのものです。
        [Wed Aug 1 1:01:01 2012] [ERR] [client xxx.xx.xxx.xxx] Could not retrieve data from URL.
        in /var/www/html/path/to/somelib.php on line 123
        行数を見れば、どこでエラーが発生したかはすぐ分かります。これは実際にはOpen Graphのデータ送信処理で
        発生したエラーによるものです。しかし、これだけの情報では実際のコードを見ない限り、
        なぜエラーが発生したのかがすぐには分かりません。これではトラブルシューティングに時間がかかってしまいます。
        そこで例えば、エラーメッセージの中にデータを送信したユーザーのFacebookユーザーIDと、
        送信したOpen GraphオブジェクトのURLがあればどうでしょうか。
        [Wed Aug 1 1:01:01 2012] [ERR] [client xxx.xx.xxx.xxx] Facebook ID = nnnnn,
        Object URL = http://retty.me/path/to/object, message = Could not retrieve data from URL.
        in /var/www/html/path/to/somelib.php on line 123
        送信したオブジェクトに問題があるのか、送信したユーザーアカウントに問題があるのか、
        といった切り分けがすぐにできると思います。



        http://codezine.jp/article/detail/1581
        ログに出力すべき内容
         ログに出力すべき項目は次のとおりです。
        項目 説明
        時刻 yyyy/MM/dd hh:MM:ss.SSS形式で、西暦からミリ秒まで。実行時間を知りたい場合、ミリ秒は必須です。.
        スレッド番号 スレッド固有の番号。マルチスレッドアプリケーションでは必須です。
        ユーザーID システムの利用者番号。複数ユーザーのアプリケーションでは必須です。
        ログレベル ログレベルは実装段階、運用段階でログの出力量を制限するために設定します。
        Log4jの場合:fatal, error, warn, info, debug, trace
        メッセージコード ログ一行毎の分類コード、もしくはエラーコード。
        任意メッセージ エラーメッセージなど、日本語の説明。
        スタックトレース 例外発生箇所までの呼び出し階層。




        http://codezine.jp/article/detail/1581


        http://d.hatena.ne.jp/perlcodesample/20080424/1209042419
        /**
        * ログに出力するメッセージの接頭辞を返します。
        * クラス名を取得します。



        ★perlのcallerが何かと便利、ログ取るときとか
        my $oniku = $args{'syake'} || (caller 1)[3];
        使い方

        引数なし

        リストで返されます。
        0: 呼び出し元のパッケージ名
        1: 呼び出し元のファイル名
        2: 呼び出し元の行番号

        ($package, $file, $line) = caller;
        引数あり

        リストで返されます。
        0: 呼び出し元のパッケージ名
        1: 呼び出し元のファイル名
        2: 呼び出し元の行番号
        3: 呼び出したサブルーチン名
        4: 引数の有無(1: 引数あり、2: 引数なし)
        5: リストの要望(1: リストコンテキストで呼び出された場合、2: スカラーコンテキストで呼び出された場合)

        引数
        1: 実行している関数名が対象
        2: 呼び出し元の関数が対象

        my$this_func_name = (caller0)[3];
        $this_func_name =~ s/.*:://;
        そうそう、このままでは完全修飾名が取得されるから、
        ↑みたいに正規表現で要らない部分を削除したら、関数名だけがとれます。

        sub get_host_func_name {
        my $host_func_name = (caller1)[3];
        $host_func_name =~ s/.*:://;
        }
        ↑みたいな関数をメソッドをBase.pmとかの汎用ライブラリに作っておいてもいいかもなぁって思ったりもします。





        first_log4php.php

        <?php
        /**
        * log4phpのインストールディレクトリ
        */
        define('LOG4PHP_DIR', 'log4php');

        /**
        * プロパティファイルの指定
        */
        define('LOG4PHP_CONFIGURATION', './log4php.properties');

        require_once(LOG4PHP_DIR . '/LoggerManager.php');
        ?>
        <?php
        /**
        * Loggerの取得
        * スクリプト名をLogger名として渡す
        */
        $logger =& LoggerManager::getLogger(basename($_SERVER['SCRIPT_NAME']));

        /**
        * ログの出力
        */
        $logger->debug('DEBUGメッセージです');
        $logger->info('INFOメッセージです');
        $logger->warn('WARNメッセージです');
        $logger->error('ERRORメッセージです');
        $logger->fatal('FATALメッセージです');

        /**
        * シャットダウン
        */
        LoggerManager::shutdown();
        ?>


        FATAL->ERROR->WARN->INFO->DEBUG->TRACE(低)

        <?php
        require_once('log4php/Logger.php');
        Logger::configure(dirname(__FILE__).'/config.xml'); // 設定ファイルの読み込み
        $logger = Logger::getLogger('myLogger'); // myLoggerという名前のloggerを使用

        // 以下ログの出力
        $logger->debug("debug message");
        $logger->trace("trace message");
        ?>


        appender name="myAppender" class="LoggerAppenderFile">
        <param name="file" value="myLog.log" />
        <layout class="LoggerLayoutPattern">
        <param name="conversionPattern" value="%date{Y-m-d H:i:s.u} %logger %-5level %sessionid %file(%line) %msg%n" />
        </layout>
        </appender>

        上のパターンを指定した場合には以下の出力となります。
        2013-03-13 10:28:22.086 myLogger DEBUG 26qpf1sop0m7jem9jghges2h07 /public/index.php(361) debug message


        <?php
        require_once('log4php/Logger.php');
        Logger::configure(dirname(__FILE__).'/config.xml'); // 設定ファイルの読み込み
        $logger = Logger::getLogger('myLogger'); // myLoggerという名前のloggerを使用

        // 以下ログの出力
        $logger->debug("debug message");
        $logger->trace("trace message");
        ?>


        <?php
        # require_once で LoggerManager.php を include するだけで使える
        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 =& LoggerManager::getLogger('Sug.Another');
        $logger->info( 'Another Logger!' );

        # これは注意!
        $logger->shutdown();
        ?>




        perlの配列
        my @menus = (
        [0,"ふわとろオムライス",1200],
        [1,"ハンバーグ",1000],
        [2,"パフェ",800]
        );

        ()は配列のコンストラクタで、[]はそのリファレンスです。
        flairリファレンスとは変数の格納場所を指し示すデータ型で、C言語で例えるとポインタのようなものです。
        1次元配列にリファレンスをたくさんつなぎ合わせることで、多次元配列にしています。

        要素を追加するときは、以下のようにします。
        $menus[3][0] = 3;
        $menus[3][1] = "メロンソーダ";
        $menus[3][2] = 500;
        配列のリファレンスを使うと、もう少しまとめて書けます。
        また、pushを使うと以下のように書けます。
        push @menus, [4,"アルコールカクテル",600];



        constantモジュールを使います。
        use constant AAA => 'aaa';
        use constant BBB => 100;
        use constant CCC => 24 * 60 * 60;
        use constant YYY => [100, 200, 300];
        use constant ZZZ => {a => 'A', b => 'B'};

        print AAA, "¥n";
        print BBB * 10, "¥n";
        print CCC, "¥n";
        print YYY->[1], "¥n";
        print ZZZ->{a}, "¥n";
         まとめて書くこともできます。
        use constant {
        AAA => 'aaa',
        BBB => 100,
        CCC => 24 * 60 * 60,
        YYY => [100, 200, 300],
        ZZZ => {a => 'A', b => 'B'},
        };




        $ENV{LM_DEBUG} = 0;
        debugf("debug message"); #表示されない

        $ENV{LM_DEBUG} = 1;
        debugf("debug message"); #表示される



        リスト6 log4perl出力結果
        2011/08/11 17:58:39 [DEBUG] This is a debug message log4perl.pl at 9.
        2011/08/11 17:58:39 [WARN] This is a warn message log4perl.pl at 10.
        2011/08/11 17:58:39 [FATAL] Fatal error has occurred log4perl.pl at 11.
        Log::Dispatch



        forループの反復子変数は常にmyで宣言する
        forループで明示的な反復変数を使用する際は、必ずmyキーワードを使用して、レ
        キシカル変数として明示的に宣言する



        my $client_holding;
        SEARCH:
        for my $client (@clietns) {
        if ($client->holding()){
        $client_holding = $client;
        last SEARCH;
        }
        }
        if ($client_holding) {
        $client_holding->resume_conversation();
        }



        コンストラクタの呼び出しはアロー演算子を使用するのがよい。
        Perlではコンストラクタと他のメソッドに実質的な違いはない。

        arrowOperand
        my $obj = SomeClass->new;
        間接オブジェクト呼び出しは、将来的には非推奨になる可能性がある。

        indirectCall
        my $obj = new SomeClass();


        LOG_LEVEL_

        $ENV{LOG_LEVEL_DEBUG} = 1;
        $ENV{LOG_LEVEL_INFO} = 2;
        $ENV{LOG_LEVEL_WARNING} = 3;
        $ENV{LOG_LEVEL_ERROR} = 4;

        100 => 'DEBUG',
        200 => 'INFO',
        250 => 'NOTICE',
        300 => 'WARNING',
        400 => 'ERROR',


        $ENV{LM_DEBUG} = 0;
        debugf("debug message"); #表示されない

        $ENV{LM_DEBUG} = 1;
        debugf("debug message"); #表示される


        ・ログはぎたいばしょにかくよ
        logf("INFO" , "ssss test");


        ・ログ吐く関数
        sub logf {
        my ($level,$message) = @_;
        my ($pkg,$file,$line) = caller;
        my $r = sprintf "%04d/%02d/%02d %02d:%02d:%02d [%s] %s at %s line %d.¥n",
        $time[5]+1900, $time[4]+1, @time[3,2,1,0],
        $level, $message,
        $file, $line;
        return $r;
        }



        # エラーレベル
        use constant E_LEVEL_DEBUG => 1;
        use constant E_LEVEL_INFO => 2;
        use constant E_LEVEL_WARNING => 3;
        use constant E_LEVEL_ERROR => 4;

        # ログファイル
        $LOGFILE_NAME = "log_kinrisystem.log" ;

        # ログファイルに表示する、エラーレベル(対象のレベル以上を表示)
        $LOG_LEVEL = 2; # 1:DEBUG 2:INFO 3:WARNING 4:ERROR



        # 使用例 logf("INFO","メッセージ内容") ;
        use POSIX 'strftime';

        sub logf {
        my ($level,$message) = @_;
        my ($pkg,$file,$line) = caller;
        my @time = localtime;
        my $now = strftime "%Y/%m/%d %H:%M:%S", localtime;
        my $logmsg = $now . " [" . $level . "]" . $message . " at " . $file . " line " . $line . "¥n" ;

        if( $level eq "DEBUG") {
        if( $E_LEVEL_DEBUG >= $LOG_LEVEL ){
        log_write($logmsg); # すべてのメッセージを出力
        }
        }
        if( $level eq "INFO") {
        if( $E_LEVEL_INFO >= $LOG_LEVEL ){
        log_write($logmsg); # INFOレベル以上のメッセージを出力
        }
        }
        if( $level eq "WARNING") {
        if( $E_LEVEL_WARNING >= $LOG_LEVEL ){
        log_write($logmsg); # WARNINGレベル以上のメッセージを出力
        }
        }
        if( $level eq "ERROR") {
        if( $E_LEVEL_ERROR >= $LOG_LEVEL ){
        log_write($logmsg); # ERRORのメッセージを出力
        }
        }

        }


        sub log_write {
        my ($logmsg) = @_;

        # ログファイル追加モードでオープン
        open($fh_log, '>>', $LOGFILE_NAME) or die(qq/Can't open file "$LOGFILE_NAME": $!/);

        # ログ書き込み 日付 時間 : ログメッセージ(改行)
        printf($fh_log "%s", $logmsg);

        # ログファイルクローズ
        close($fh_log) or die(qq/Can't close file "$LOGFILE_NAME": $!/);

        }



        print logf("DEBUG" , "ssss test");
        print logf("INFO" , "ssss test");
        print logf("WARNING" , "ssss test");
        print logf("ERROR" , "ssss test");



        ・よし、あとはファイルを分割するよ


        # ロガーの取得
        $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' );



        ・使うやつ
        ・実行ファイルサンプル
        ・lib_common.pl

        ・test.pl
        #!/usr/bin/perl

        require 'lib_common.pl' ;

        print logf("DEBUG" , "ssss test");
        print logf("INFO" , "ssss test");
        print logf("WARNING" , "ssss test");
        print logf("ERROR" , "ssss test");



        ・env.pl
        #!/usr/bin/perl

        # エラーレベル
        our $E_LEVEL_DEBUG = 1;
        our $E_LEVEL_INFO = 2;
        our $E_LEVEL_WARNING = 3;
        our $E_LEVEL_ERROR = 4;

        # ログファイル
        $LOGFILE_NAME = "log_kinrisystem.log" ;

        # ログファイルに表示する、ログレベル(対象のレベル以上を表示)
        $LOG_LEVEL = 2; # 1:DEBUG 2:INFO 3:WARNING 4:ERROR



        ・lib_common.pl
        #!/usr/bin/perl

        use POSIX 'strftime';

        require 'lib_common.pl' ;

        print logf("DEBUG" , "ssss test");
        print logf("INFO" , "ssss test");
        print logf("WARNING" , "ssss test");
        print logf("ERROR" , "ssss test");


        # エラーレベル
        our $E_LEVEL_DEBUG = 1;
        our $E_LEVEL_INFO = 2;
        our $E_LEVEL_WARNING = 3;
        our $E_LEVEL_ERROR = 4;

        # ログファイル
        $LOGFILE_NAME = "log_kinrisystem.log" ;

        # ログファイルに表示する、エラーレベル(対象のレベル以上を表示)
        $LOG_LEVEL = 2; # 1:DEBUG 2:INFO 3:WARNING 4:ERROR


        sub logf {
        my ($level,$message) = @_;
        my ($pkg,$file,$line) = caller;
        my @time = localtime;
        my $now = strftime "%Y/%m/%d %H:%M:%S", localtime;
        my $logmsg = $now . " [" . $level . "]" . $message . " at " . $file . " line " . $line . "¥n" ;

        if( $level eq "DEBUG") {
        if( $E_LEVEL_DEBUG >= $LOG_LEVEL ){
        log_write($logmsg); # すべてのメッセージを出力
        }
        }
        if( $level eq "INFO") {
        if( $E_LEVEL_INFO >= $LOG_LEVEL ){
        log_write($logmsg); # INFOレベル以上のメッセージを出力
        }
        }
        if( $level eq "WARNING") {
        if( $E_LEVEL_WARNING >= $LOG_LEVEL ){
        log_write($logmsg); # WARNレベル以上のメッセージを出力
        }
        }
        if( $level eq "ERROR") {
        if( $E_LEVEL_ERROR >= $LOG_LEVEL ){
        log_write($logmsg); # ERRORのメッセージを出力
        }
        }

        }

        sub log_write {
        my ($logmsg) = @_;

        # ログファイル追加モードでオープン
        open($fh_log, '>>', $LOGFILE_NAME) or die(qq/Can't open file "$LOGFILE_NAME": $!/);

        # ログ書き込み 日付 時間 : ログメッセージ(改行)
        printf($fh_log "%s", $logmsg);

        # ログファイルクローズ
        close($fh_log) or die(qq/Can't close file "$LOGFILE_NAME": $!/);

        }

        [meguro@mgr01-A 20150110]$





        ・test2.pl
        require 'lib_common.pl' ;

        print write_log("DEBUG" , "ssss test");
        print write_log("INFO" , "ssss test");
        print write_log("WARNING" , "ssss test");
        print write_log("ERROR" , "ssss test");




        ・lib_common.pl
        #!/usr/bin/perl

        use POSIX 'strftime';

        # エラーレベル ログレベルは下記の4段階 上にあるほど多く出力
        our $E_LEVEL_DEBUG = 1;
        our $E_LEVEL_INFO = 2;
        our $E_LEVEL_WARNING = 3;
        our $E_LEVEL_ERROR = 4;

        # ログファイル
        $LOGFILE_NAME = "log_kinrisystem.log" ;

        # ログファイルに表示する、エラーレベル(対象のレベル以上を表示)
        $LOG_LEVEL = 2; # 1:DEBUG 2:INFO 3:WARNING 4:ERROR

        sub write_log {
        my ($level,$message) = @_;
        my ($pkg,$file,$line) = caller;
        my @time = localtime;
        my $now = strftime "%Y/%m/%d %H:%M:%S", localtime;
        my $logmsg = $now . " [" . $level . "]" . $message . " at " . $file . " line " . $line . "¥n" ;

        if( $level eq "DEBUG") {
        if( $E_LEVEL_DEBUG >= $LOG_LEVEL ){
        log_write($logmsg); # すべてのメッセージを出力
        }
        }
        if( $level eq "INFO") {
        if( $E_LEVEL_INFO >= $LOG_LEVEL ){
        log_write($logmsg); # INFOレベル以上のメッセージを出力
        }
        }
        if( $level eq "WARNING") {
        if( $E_LEVEL_WARNING >= $LOG_LEVEL ){
        log_write($logmsg); # WARNレベル以上のメッセージを出力
        }
        }
        if( $level eq "ERROR") {
        if( $E_LEVEL_ERROR >= $LOG_LEVEL ){
        log_write($logmsg); # ERRORのメッセージを出力
        }
        }

        }

        sub log_write {
        my ($logmsg) = @_;

        # ログファイル追加モードでオープン
        open($fh_log, '>>', $LOGFILE_NAME) or die(qq/Can't open file "$LOGFILE_NAME": $!/);

        # ログ書き込み 日付 時間 : ログメッセージ(改行)
        printf($fh_log "%s", $logmsg);

        # ログファイルクローズ
        close($fh_log) or die(qq/Can't close file "$LOGFILE_NAME": $!/);

        }



        /home/meguro/work/20150110/pchan

        //ddeで

        変数を別ファイルにしたら へんだよ という作業から・

        package

        ・ログイン時間保持作業

        ログイン時に、ログイン時刻、ログインユーザを記録し、ページ操作を行った際にユーザ名、時刻と操作内容を記録する
        →同じユーザ名大丈夫だっげ? ユーザIDを記録するほうがよさそうだよね。

        ふぉーなっと

        ページ操作


        ・参考
        cakephp
        <?php
        class AccessLogs{
        function write_log() {
        $msg = date('Y-m-d H:i:s') . "," . env('REQUEST_URI') . "," . env('HTTP_REFERER') . "," . env('HTTP_USER_AGENT') . "," . env('REMOTE_ADDR') . "¥n";

        $filename = LOGS . 'accesslogs/' . date('Ymd') . '.log';
        $log = new File($filename);
        $log->append($msg);

        return true;
        }
        }
        ?>


        class AppController extends Controller {
        function write_log($systemName, $level, $message){
        $ip = 2;
        $data = array(
        'system' => $systemName,
        'level' => $level,
        'message' => $message,
        'client' => $ip,
        'created' => '',
        );
        $this->History->create();
        $this->History->save($data);
        }
        }





        --- End ---------------------------------------------------------------------------------------------


        ・Diary 2015/01/11(日) 16:08:55
        --- Start -------------------------------------------------------------------------------------------


        ・監査ログ機能設計書
        操作ログをはくよ
        ユーザID、をログイン時に保持する

        エラー処理、ログ処理は、基底クラスにまとめる

        一般的なJ2EEフレームワークの呼び出し階層の例
        サーブレット -> コントローラー -> 基底クラス -> ぎょうむロジック -> 汎用処理
          isValiddata
        1 サーブレット XXXServlet.doPost() HTTPリクエストを処理する入り口。
        2 コントローラ BLInvoker.invoke() フレームワークが、リクエストパラメタから処理すべきロジックを選択し、実行する。MVCモデルのControllerにあたる。
        3 業務ロジックの基底クラス BlBase.execute() 業務ロジックすべてに共通する前処理、後処理、例外処理(try 〜 catch)、ロギングを行う。MVCモデルのModelにあたる。
        4 業務ロジック BlCalc.execute() ユーザー定義の業務ロジック。
        5 汎用処理 CheckUtils.isValidData() ユーザー定義の汎用処理。


        modelにロギング処理をかくよ
        ロギング 【 logging 】
        ユーザの操作やシステムの稼働状況、ネットワークのアクセス状況などを時系列で記録に残すこと。
        記録データのことを「ログ」(log)という。

        model ロギング処理 どこに mvc
        →php参考にするかiyo


        コントローラー は制御担当であって、処理担当では無い。
        ビュー     はもちろん表示担当であってやっぱり処理担当ではない。

        ログ出力するのは、model.pm だね


        人にエラーを知らせる方法

        発生したエラーについて人に知らせる方法には、ソフトウェアの開発者に知らせるための方法と、利用者に知らせるための方法と、2つの種類があります。

        ログは、主にソフトウェア開発者がデバッグを行うために、エラーの情報をファイルに出力するものです。クラス名や変数名、値、ファイル名、行番号などを、そのまま出力します。

        エラーメッセージは、ソフトウェアの利用者にエラーが起きたことを知らせるために、コンソールやウィンドウに出力するものです。一般の利用者が見て分かるような表現で出力します。利用者がエラーを確認して何らかの操作を行うまで、ソフトウェアの動作を停止させるために、メッセージボックスを使うこともあります。
        どこでエラーを出力するべきか?

        では、これらの方法でエラーを出力する処理は、ソフトウェアのどこに記述すれば良いのでしょうか。

        1つは、ある関数でエラーが発生した時、エラーの出力もその関数の中で行ってしまう、という方針が考えられます。ログの出力は、たいていはこの方針で行われます。

        もう1つは、発生したエラーの情報を呼び出し側に渡して、エラーの出力は呼び出し側で行う、という方針も考えられます。エラーメッセージの出力は、たいていはこの方針で行われます。

        この2つの方針には、それぞれ利点と欠点があります。


        詳細設計書 ログ出力
        かきのう

        ・保存する対象データは
        操作時刻,ユーザID,操作内容

        操作内容
        ログイン
        入力確認

        ふぉーまっと
        時間 ユーザ 操作内容
        2015/01/15 21:30:30 admin 入力確認ボタン
        http://www.slideshare.net/fullscreen/Manabu_Shimohira/vc1-idc-20110120kmt/44
        http://www.mdit.co.jp/logauditor/images2/logimage01b.gif
        http://www.mdit.co.jp/logauditor/enterprise/
        http://itpro.nikkeibp.co.jp/article/COLUMN/20080403/297901/


        http://software.fujitsu.com/jp/manual/manualfiles/M080091/J2X14600/05Z200/secu06/secu0041.html
        http://software.fujitsu.com/jp/manual/manualfiles/M060015/J2X13110/01Z200/dmins01/dmins018.html
        http://infra.makeall.net/archives/1361


        ここでは、監査ログ管理機能の構成を設計するために必要な以下の項目について説明します。

        ・構成例
        ・ログ収集対象期間
        ・ログファイルの管理方法ログファイルの転送方法
        ・必要な設計項目

        ■ログ収集対象
        ユーザID
        操作時間
        操作内容

        ■ログふぉーばっと
        YYYY/MM/DD  YYYY:西暦年(〜2038) MM:月2桁(01〜12) DD:日2桁(01〜31)
        HH:MM:SS   HH:時(00〜23) MM:分(00〜59) SS:秒(00〜59)

        ■ログ収集対象期間
        監査ログ管理機能では、収集実施日から最大7日前までデータをさかのぼって収集します。
        同じ日に複数回収集を行った場合は、前回収集したデータから当日分の差分データを収集します。
        例)5/8にログ収集を実施した場合
        1ヶ月を過ぎたデータについては、バックアップは取得しない

        ■ログファイルの管理方法
        収集対象となるログファイル内のログレコードを、ログレコードの日付単位に分割して管理します。
        例)2006年の5月8日にログ収集を実施した場合
        以下のようにデータを分割して管理し

        ■ログファイルの運用方法
        サイクリック(回帰的)な運用とし、ログファイルをローテーションして使用する。
        サイクリック運用しているもの
        (例)C:¥AppLog¥log_*

        古い記録を上書きするサイクリック運用とすることで
        ファイルサイズの肥大化を防ぎ、ログ記録スペースが枯渇しない運用とする。
        また一定期間(一ヶ月以上)経過したログ情報は消失してしまう。


        情報をファイルに保存、ログファイルはサイクリック使用でディスク容量のオーバーフローを防止する

        [ログ機能]・イベントログ相当の運用情報をテキストファイルに出力、サイクリック運用を可能

        ログファイルは回帰的(サイクリック)に使用される
        ファイル名 日

        log_01 2015.02.01
        log_02 2015.02.02
        log_03 2015.01.03


        log_29 2015.01.29
        log_30 2015.01.30
        log_31 2015.01.31



        http://software.fujitsu.com/jp/manual/manualfiles/M080091/J2X14600/05Z200/secu09/secu0063.html

        なお通常「監査証跡」は「ログ」を指すので相手方担当者がイカレだったのだと思う



        --- End ---------------------------------------------------------------------------------------------
        category:- | by:ittoocomments(0)trackbacks(0) | -

        perl shift関数とunshift関数

        2015.01.25 Sunday 22:19
        0

          shift関数とunshift関数
          shift
          shift関数はリスト Array の左端(先頭)から要素をひとつ取り除く。
          書式 shift(Array)

          unshift
          unshift関数はリスト Array の左端(先頭)に新しい値 List を加える。
          書式 unshift(Array, List)



          連想配列(ハッシュ)
          keys関数、values関数とeach関数

          keys
          keys関数はハッシュ Hash に含まれるすべてのキーのリストを返す。
          書式 keys(Hash)

          values
          values関数はハッシュ Hash に含まれるすべての値のリストを返す。
          書式 values(Hash)

          each
          each関数はハッシュ Hash に対して、キーと値の組からなる2要素のリストをひ とつ返す。
          書式 each(Hash)



          特殊変数
          Perl言語で特別な意味を持つ定義済みの変数。
          $_
          入力処理とパターンマッチで、デフォルトの対象となる変数。



          category:perl | by:ittoocomments(0)trackbacks(0) | -

          perl 2次元ハッシュのソート2

          2015.01.25 Sunday 22:18
          0

            ★ハッシュのソート2
            my %foo;
            $foo{Mon} = 10;
            $foo{Tue} = 200;
            $foo{Wed} = 30;
            $foo{Tur} = 1000;
            $foo{Fri} = 20;
            $foo{Sat} = 50;
            $foo{Sun} = 1;
            ------------------------------
            for my $key (keys %foo) {
            print "$key:$foo{$key}¥n";
            }
            ------------------------------

            実行結果(例)
            Mon:10
            Tue:200
            Fri:20
            Tur:1000
            Wed:30
            Sun:1
            Sat:50

            このハッシュについて、キーと値のそれぞれでソートして出力したいのですが、具体的な方法が分かりません。
            2.ハッシュのキーでソートする
            ハッシュのキーでソートするには、for文のハッシュ名の左側に「sort keys」を追加します。

            ------------------------------
            for my $key (sort keys %foo) {
            print "$key:$foo{$key}¥n";
            }
            ------------------------------
            実行結果
            Fri:20
            Mon:10
            Sat:50
            Sun:1
            Tue:200
            Tur:1000
            Wed:30



            4.ハッシュの値でソートする
            ハッシュの値でソートするには、for文のハッシュ名の左側に「sort values」を追加します。
            ------------------------------
            for my $key (sort values %foo) {
            print "$value¥n";
            }
            ------------------------------
            実行結果
            1
            10
            1000
            20
            200
            30
            50

            6.ハッシュを数値でソートする
            4項と5項は数字が期待通りに並んでいません。これはデフォルトのソートが文字列として扱われるためです。
            数値としてソートするには、数値でのソート条件「{$a <=> $b}」を記述します。
            ------------------------------
            for my $value (sort {$a <=> $b} values %foo) {
            print "$value¥n";
            }
            ------------------------------
            実行結果
            1
            10
            20
            30
            50
            200
            1000



            category:perl | by:ittoocomments(0)trackbacks(0) | -

            perl 連想ハッシュのソート

            2015.01.25 Sunday 22:11
            0
              ★ソート 連想ハッシュのソート
              表示の直前まで、年を含んだようにしておくべし

              # 連想配列 あえて、panel順序、日の順序もバラバラにしてる
              57 my %HoH = (
              58 'panel_1' => { '20141203'=>'0' , '20141204'=>'0' , '20141205'=>'0' , '20141206'=>'0' , '20141207'=>'0' , '20141208'=>'0' },
              59 'panel_8' => { '20141208'=>'0' , '20141207'=>'0' , '20141203'=>'0' , '20141204'=>'0' , '20141206'=>'0' , '20141205'=>'0' },
              60 'panel_6' => { '20141208'=>'0' , '20141207'=>'0' , '20141203'=>'0' , '20141204'=>'0' , '20141206'=>'0' , '20141205'=>'0' },
              61 'panel_3' => { '20141208'=>'0' , '20141207'=>'0' , '20141203'=>'0' , '20141204'=>'0' , '20141206'=>'0' , '20141205'=>'0' },
              62 'panel_4' => { '20141205'=>'0' , '20141206'=>'0' , '20141205'=>'0' , '20141206'=>'0' , '20141203'=>'0' , '20141204'=>'0' },
              63 );


              78 # ソートされた全体を出力
              79 foreach my $family ( sort keys %HoH ) {
              80 print "$family: { ";
              81 for my $role ( sort keys %{ $HoH{$family} } ) {
              82 print "$role=$HoH{$family}{$role} ";
              83 }
              84 print "}¥n";
              85 }

              出力 panelでもソートしてるし、中の日でもソートしてる
              panel_1: { 20141203=0 20141204=0 20141205=0 20141206=0 20141207=0 20141208=0 }
              panel_3: { 20141203=0 20141204=0 20141205=0 20141206=0 20141207=0 20141208=0 }
              panel_4: { 20141203=0 20141204=0 20141205=0 20141206=0 }
              panel_6: { 20141203=0 20141204=0 20141205=0 20141206=0 20141207=0 20141208=0 }
              panel_8: { 20141203=0 20141204=0 20141205=0 20141206=0 20141207=0 20141208=0 }


              category:perl | by:ittoocomments(0)trackbacks(0) | -

              ad
              Calender
                  123
              45678910
              11121314151617
              18192021222324
              25262728293031
              << January 2015 >>
              Selected entry
              PR
              Category
              Archives
              Recommend
              Link
              Profile
              Search
              Others
              Mobile
              qrcode
              Powered
              無料ブログ作成サービス JUGEM