SunshinePHP Developer Conference 2015

syslog

(PHP 4, PHP 5)

syslogErzeugt eine Meldung im System-Logging

Beschreibung

bool syslog ( int $priority , string $message )

Die Funktion syslog() erzeugt eine Status-Meldung, die an die System-Log-Funktion weitergereicht wird.

Weitere Informationen zum benutzerdefinierten Loghandler finden Sie unter syslog.conf (5) der Unix-Manpages. Zusätzliche Informationen zu den SysLog-Möglichkeiten und -Optionen finden Sie in den Manpages zu syslog (3) (auf UNIX-Systemen).

Parameter-Liste

priority

Der Parameter priority ist eine Kombination der System-Möglichkeiten und dem Level. Mögliche Werte sind:

syslog()-Prioritäten (in absteigender Reihenfolge)
Konstante Beschreibung
LOG_EMERG System ist unbrauchbar.
LOG_ALERT Aktion ist sofort erforderlich.
LOG_CRIT Kritischer Zustand.
LOG_ERR Fehler aufgetreten.
LOG_WARNING Warnung aufgetreten.
LOG_NOTICE Normale, aber wichtige Meldung.
LOG_INFO Informative Meldung.
LOG_DEBUG Debug-Level-Meldung.

message

Die zu sendende Nachricht, in der die beiden Zeichen %m durch den Fehlertext (strerror) ersetzt werden, der dem Wert errno entspricht.

Rückgabewerte

Gibt bei Erfolg TRUE zurück. Im Fehlerfall wird FALSE zurückgegeben.

Beispiele

Beispiel #1 Die Verwendung von syslog():

<?php
// öffne SysLog, schließe die Prozess-ID (PID) ein, sende
// die Log-Meldungen an die Standard-Fehler-Ausgabe und benutze
// einen userdefinierten Log-Mechanismus.
openlog("myScripLog"LOG_PID LOG_PERRORLOG_LOCAL0);

// etwas Code

if (authorized_client()) {
    
// mache etwas
} else {
    
// unerlaubter Client!
    // logge den Zugriff
    
$access date("Y/m/d H:i:s");
    
syslog(LOG_WARNING,"Unauthorisierter Client: $access "
        
"{$_SERVER['REMOTE_ADDR']} ({$_SERVER['HTTP_USER_AGENT']})");
}

closelog();
?>

Anmerkungen

Unter Windows-NT wird der Syslog-Dienst emuliert, indem der Ereignis-Protokolldienst genutzt wird.

Hinweis:

Die Verwendung von LOG_LOCAL0 bis LOG_LOCAL7 für den Parameter facility von openlog() ist unter Windowssystemen nicht möglich.

Siehe auch

  • openlog() - Stellt eine Verbindung zum Log-Dienst des Systems her
  • closelog() - Schließt die Verbindung zum System-Logger

add a note add a note

User Contributed Notes 13 notes

up
5
james dot ellis at gmail dot com
6 years ago
If anyone is wondering why their log messages are appearing in multiple log files, here is one answer applying to *nix systems:

If your syslog.conf looks like this (assuming you use LOG_LOCAL0 for web app logging) :

local0.info    /var/log/web/info.log

This will collect *all* messages of LOG_INFO level and higher, i.e everything except debug messages

Try this instead to ensure that only messages of the named log level go into the relevant log file:

local0.=info    /var/log/web/info.log

Additionally, you may like to add this to ensure your messages don't end up in generic log files like "messages"  "all" "syslog" and "debug":

local0.none    /var/log/messages
local0.none    /var/log/debug
etc

saves disk space among other things - more at "man syslog.conf"
up
3
Antonio Lobato
4 years ago
A word of warning; if you use openlog() to ready syslog() and your Apache threads accept multiple requests, you *must* call closelog() if Apache's error log is configured to write to syslog.  Failure to do so will cause Apache's error log to write to whatever facility/ident was used in openlog.

Example, in httpd.conf you have:

ErrorLog syslog:local7

and in php you do:

<?php
openlog
("myprogram", 0, LOG_LOCAL0);
syslog("My syslog message");
?>

From here on out, this Apache thread will write ErrorLog to local0 and under the process name "myprogram" and not httpd!  Calling closelog() will fix this.
up
2
nospam \100 jraxis com (that's right!)
12 years ago
This *does* actually goto the system log as configured in /etc/syslog.conf (such as /var/log/messages), it doesn't goto Apache's ErrorLog (such as /var/log/httpd/error_log). At least under my Debian Potato with Apache 1.3.23.

Use error_log() to be sure it gets into Apache's ErrorLog.
up
0
helly at php dot net
7 years ago
If you are using syslog-ng and want errors send to syslog then use ini setting "error_log = syslog" and add something like the following to your syslog-ng.conf:

destination php { file("/var/log/php.log" owner(root) group(devel) perm(0620)); };
log { source(src); filter(f_php); destination(php); };
up
0
daniele dot patoner at biblio dot unitn dot it
10 years ago
This work for me, to redirect  logs to a separate syslog file

put this line in your /etc/syslog.conf :

local0.debug   /var/log/php.log

Then restart syslogd:

/etc/init.d/syslog restart

php example:

<?php
define_syslog_variables
();
openlog("TextLog", LOG_PID, LOG_LOCAL0);

$data = date("Y/m/d H:i:s");
syslog(LOG_DEBUG,"Messagge: $data");

closelog();
?>
up
0
gregj at pdxperts dot com
11 years ago
The message string sent to the log file is limited to 500 characters.
up
0
mavetju at chello dot nl
13 years ago
With FreeBSD I can use: syslog(LOG_INFO,"test");

BSD/OS does not support this, I had to use the literal values for the priority (158: local3.info):
syslog(158,"test");
up
0
rcgraves+php at brandeis dot edu
14 years ago
For the-header-file-enabled:

man 3 syslog defines the priorities, but not the integer values. For that you'll need to read your system header file.

Let's suppose I want to log an informational message in the mail log (which happens to be true). The man page tells me I want LOG_MAIL|LOG_INFO. So I look in /usr/include/sys/syslog.h and find (this happens to be Linux, your system could be different):

#define LOG_INFO        6       /* informational */
#define LOG_MAIL        (2<<3)  /* mail system */

2<<3 means shift 3 bits left, which means multiply by 8. So I want 2*8 + 6 = 22. syslog(22,"this message will appear in the mail log"); And indeed it does.
up
0
bb at lb-data dot co dot at
15 years ago
In Windows NT, use the following values of priority:
1 = error,
6 = info
up
-1
dpreece at paradise dot net dot nz
12 years ago
To set up a custom log file via the syslog daemon (FreeBSD in this case)...

Add to /etc/syslog.conf a line that says all errors from the httpd process are to go to a file called (for example) /var/log/httpd-php.log

!httpd
*.*   {tab}   /var/log/httpd-php.log

Note the tab, being a tab character! Next create a blank file to be written to. I'm sure there are 1e+6 ways to do this, but I choose

# cat > httpd-php.log << EOF
? EOF

Finally find your syslog daemon and send it a sighup to inform it of the change:

# ps ax | grep syslogd
  133  ??  Ss     0:07.23 syslogd -s
# kill -1 133

Et voila! Php syslog calls will now arrive in /var/log/httpd-php.log
up
-1
Torsten
10 years ago
I had a problem trying to issue a syslog message with IIS 5.1 under Windows XP. The function call seemed to succeed, but the event viewer showed that no entry was made.
Finally I found out that the user account used for the webserver (IUSR_<Computername>) did not have enough permissions to issue syslog alerts. I changed this by adding this user to the Users group instead of only Guest.
up
-2
gherson at snet dot net
13 years ago
Example of where to look for syslog's output:   /var/log/httpd/access_log
(on Red Hat Linux Secure Server v6.2).
up
-4
adam _at_ lockdownnetworks _dot_ com
7 years ago
Be aware when using syslog() that if you set the timezone of environment to be something other than the standard, syslog() may log the time to the log(s) with the wrong time zone information. For example:

<?php

openlog
('mylog', LOG_PID | LOG_ODELAY,LOG_LOCAL4);

putenv('TZ=UTC');
syslog(LOG_INFO, 'UTC Log line');

putenv('TZ=US/Pacific');
syslog(LOG_INFO, 'US/Pacific Log line');

closelog();

?>

Viewing the /usr/log/messages log will display these two lines:

Apr 11 01:25:39 hostname mylog[1400]: UTC Log line
Apr 10 18:25:39 hostname mylog[1400]: US/Pacific Log line

Adam.
To Top