De opbouw van een logging class

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

- Ariën  -
Beheerder

- Ariën -

14/12/2011 01:08:49
Quote Anchor link
Ik zit te denken om een simpele logging-class te maken, om de acties in mijn CMS te loggen naar de database.

Maar nu loop ik al direct vast.
Wat is nou het beste?

1) Eerst een instance aanmaken en een method aanroepen?
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
$logging = new Logging();
$logging->log("news","edit",42);


2) gewoon een instance en de acties in de constructor plaatsen?
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$logging = new Logging("news","edit",42);


Wat raden jullie aan? Ik zie niet echt in dat er ooit voor zoiets simpels een tweede method zal komen. Dus...?
Kom maar op met de opmerkingen.
Gewijzigd op 14/12/2011 01:15:32 door - Ariën -
 
PHP hulp

PHP hulp

18/12/2024 08:17:18
 
Fabian M

Fabian M

14/12/2011 07:53:19
Quote Anchor link
Baseer je logger op een bestaand logger framework.
De laatste die ik had geschreven was gebaseerd op java.util.logging.

Voorbeeldje:
http://pastebin.com/NeScn3Hh
 
Ozzie PHP

Ozzie PHP

14/12/2011 08:44:00
Quote Anchor link
Aar, ik zou voor methode 1 gaan. Het zou best kunnen dat er namelijk meer methods bijkomen. Denk bijvoorbeeld aan loggen naar een bepaald bestand, of in sommige gevallen loggen naar een mailadres in plaats van naar een bestand. Of bijvoorbeeld een soort beheer-logfunctie (ik noem maar even wat he) die een bepaald event wel logt als het via je cms wordt aangeroepen, maar niet als het via een bezoeker wordt aangeroepen... ik denk dus dat je met manier 1 beter af bent.
 
Jelmer -

Jelmer -

14/12/2011 09:28:12
Quote Anchor link
Als het loggen al in de constructor gebeurt, hoe kan je dan nog een instantie van een logging-class meegeven? Als je op de juiste manier OO gebruikt krijg je alle voordelen daarvan ook mee.

Voorbeeldje:
(ook een leuk voorbeeldje meteen van C++-stijl OO programmeren in plaats van de Java manier)
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
<?php
abstract class Log
{
    const LEVEL_VERBOSE = 1;
    const LEVEL_NORMAL = 2;
    const LEVEL_ERROR = 3;
    const LEVEL_CRITICAL = 4;
    
    private $threshold = 2;

    public function setThreshold($level)
    {

        $this->threshold = $level;
    }


    public function log($level, $message)
    {

        if ($level >= $this->threshold)
            $this->_write($message);
    }


    // soms handige shortcuts
    public function verbose($message)
    {

        $this->log(self::LEVEL_VERBOSE, $message);
    }


    public function error($message)
    {

        $this->log(self::LEVEL_ERROR, $message);
    }


    abstract protected function _write($message);
}


class FileLog extends Log
{
    protected $f;
    
    public function __construct($filename)
    {

        $this->f = fopen($filename, 'a');
    }


    protected function _write($message)
    {

        fwrite($this->f, $message . "\n");
    }
}


class MailLog extends Log
{
    private $email;
    
    public function __construct($email)
    {

        $this->email = $email;
    }


    protected function _write($message)
    {

        mail($this->email, "Error!", $message);
    }
}


class LoginThingy
{
    protected $log;
    
    public function __construct(Log $log)
    {

        $this->log = $log;
    }


    public function login($username, $password)
    {

        if ($this->_isValid($username, $password)
            return true;
        
        $this->log->verbose("$username probeerde in te loggen met ongeldige gebruikersnaam/wachtwoord");
        return false;
    }
}


class SomethingSomethingMailer
{
    protected $log;

    public function __construct(Log $log)
    {

        $this->log = $log;
    }


    public function sendMail(..)
    {

        if ($mail_is_missing_certain_header)
            $this->log->verbose("Bericht mist de from-header. Dat is niet zo netjes!");
            
        if ($mail_could_not_be_sent)
            $this->log->error("Kon bericht niet sturen: $reason");
    }
}


// Ik wil alle foute logins naar een bestand loggen.
$login_logger = new FileLog('failed_logins.log');
$login_thing = new LoginThingy($login_logger);

// Maar als er iets serieus stuk gaat met het mailen, dan
// wil ik dat meteen te zien krijgen in m'n inbox.

$mailer_logger = new MailLog('[email protected]');
$mailer_logger->setThreshold(Log::LEVEL_ERROR);
$mailer = new SomethingSomethingMailer($mailer_logger);
 
Pim -

Pim -

20/12/2011 00:35:53
Quote Anchor link
Quote:
(ook een leuk voorbeeldje meteen van C++-stijl OO programmeren in plaats van de Java manier)

Bedoel je hiermee 'composition over inheritance'?
In dat geval vind ik de 'java-manier' leuker ;)

EDIT:
Worden die verschillen in java en C++ afgedwongen door de eigenschappen van de taal, of is het meer een verschil in gewoonte tussen twee gemeenschappen?
Gewijzigd op 20/12/2011 00:52:03 door Pim -
 
- Ariën  -
Beheerder

- Ariën -

20/12/2011 00:44:41
Quote Anchor link
Ozzie PHP op 14/12/2011 08:44:00:
Aar, ik zou voor methode 1 gaan. Het zou best kunnen dat er namelijk meer methods bijkomen. Denk bijvoorbeeld aan loggen naar een bepaald bestand, of in sommige gevallen loggen naar een mailadres in plaats van naar een bestand. Of bijvoorbeeld een soort beheer-logfunctie (ik noem maar even wat he) die een bepaald event wel logt als het via je cms wordt aangeroepen, maar niet als het via een bezoeker wordt aangeroepen... ik denk dus dat je met manier 1 beter af bent.

Goede manier, ga ik doen....
Lijkt me ook het meest logische.

De class is ook eigenlijk bedoeld voor de backend, om daar alle acties te loggen.
Gewijzigd op 20/12/2011 00:45:22 door - Ariën -
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.