De opbouw van een logging class
Maar nu loop ik al direct vast.
Wat is nou het beste?
1) Eerst een instance aanmaken en een method aanroepen?
2) gewoon een instance en de acties in de constructor plaatsen?
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 -
De laatste die ik had geschreven was gebaseerd op java.util.logging.
Voorbeeldje:
http://pastebin.com/NeScn3Hh
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.
Voorbeeldje:
(ook een leuk voorbeeldje meteen van C++-stijl OO programmeren in plaats van de Java manier)
Code (php)
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
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);
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);
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 -
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 -