Log Sistem
FreeBSD menyediakan logger sistem yaitu syslogd
untuk mengelola log. Berkas konfigurasi syslogd
ada di /etc/syslog.conf
. Konfigurasi ini mengendalikan apa yang syslogd
lakukan dengan entri log ketika entri log diterima. Parameter fasilitas mendeskripsikan subsistem mana yang menghasilkan pesan, misalnya kernel atau suatu daemon, dan parameter level mendeskripsikan kondisi dari kejadian yang terjadi.
Nama fasilitas |
Program apa yang direpresentasikan |
AUTH |
Sistem otorisasi: login(1), su(1), getty(8), dan sebagainya. |
AUTHPRIV |
Sama seperti AUTH, tapi log disimpan ke sebuah berkas yang hanya bisa dibaca oleh pengguna terpilih. |
CRON |
Daemon cron: cron(8). |
DAEMON |
Daemon sistem, seperti routed(8), yang tidak disediakan secara eksplisit oleh fasilitas lain. |
FTP |
Daemon ftp: ftpd(8), tftpd(8). |
KERN |
Pesan yang dihasilkan oleh kernel. Pesan ini tidak dapat dihasilkan oleh proses pengguna apapun. |
LOCAL0-LOCAL7 |
Disediakan untuk penggunaan lokal. |
LPR |
Sistem line printer spooling: lpr(1), lpc(8), lpd(8), dan lain-lain. |
MAIL |
Sistem surat-menyurat. |
NEWS |
Sistem berita jaringan. |
SECURITY |
Subsistem keamanan. |
SYSLOG |
Pesan yang dihasilkan secara internal oleh syslogd(8). |
USER |
Pesan yang dihasilkan oleh proses pengguna yang acak (random user processes). |
UUCP |
Sistem uucp. ipfw(4). |
* |
Semua fasilitas atau program kecuali MARK. |
MARK |
Fasilitas khusus yang digunakan oleh syslogd. |
Nama level |
Apa yang direpresentasikan |
EMERG |
Kondisi panik, biasanya di-broadcast ke semua pengguna. |
ALERT |
Sebuah kondisi yang harus diperbaiki sesegera mungkin, seperti basis data sistem rusak. |
CRIT |
Kondisi kritis, misalnya kesalahan pada perangkat keras. |
ERR |
Kesalahan-kesalahan. |
WARNING |
Pesan peringatan. |
NOTICE |
Kondisi yang bukan merupakan kondisi salah, namun kemungkinan harus ditangani secara khusus. |
INFO |
Pesan informatif. |
DEBUG |
Pesan-pesan yang berisi informasi yang umumnya digunakan ketika men-debug program. |
NONE |
Level khusus untuk menonaktifkan fasilitas. |
Dalam FreeBSD, biasanya berkas-berkas log berada di direktori /var/log
. Namun kita dapat mengubahnya dalam berkas konfigurasi /etc/syslog.conf
. Berkas konfigurasi ini berisi satu baris setiap aksinya, dimana sintaks untuk setiap baris adalah selector field yang diikuti oleh action field. Sintaks untuk selector field adalah fasilitas.level
yang berarti pesan log diambil dari fasilitas
pada tingkat level
atau lebih tinggi. Berikut contoh berkas konfigurasi /etc/syslog.conf
: 
Rotasi Log
Dalam FreeBSD, newsyslog
digunakan untuk mengelola berkas-berkas log. Program bawaan ini secara periodik merotasi dan mengkompresikan berkas log, dan secara opsional membuat berkas log yang hilang dan memberi tahu program ketika berkas log dipindahkan. Dalam konfigurasi default, newsyslog
berjalan setiap jam. Berkas konfigurasi newsyslog adalah /etc/newsyslog.conf
, yang isinya seperti berikut: 
Setiap baris dimulai dengan nama dari log yang dirotasi, diikuti dengan pemilik dan grup untuk berkas log yang dirotasi. Kolom mode untuk menetapkan perizinan pada berkas log dan kolom count untuk mengatur berapa banyak berkas rotasi log harus disimpan. Kolom size dan when untuk mengatur kapan newsyslog merotasi berkas. Berkas log dirotasi ketika ukurannya lebih besar dari size (dalam KB) atau ketika waktu dalam when sudah lewat. Ada dua format waktu:
- Format waktu ISO 8601 (dengan prefiks ‘@’):[[[[[cc]yy]mm]dd][T[hh[mm[ss]]]]]
- Format waktu hari, minggu, bulan (dengan prefiks ‘$”):[Dhh], [Ww[Dhh]], dan [Mdd[Dhh]]
Kolom flags untuk memberikan instruksi lebih lanjut, misalnya bagaimana mengkompresikan berkas rotasi atau untuk membuat berkas log jika hilang. Dua kolom terakhir adalah opsional, yaitu untuk menspesifikasikan nama berkas Process ID (PID) dari sebuah proses dan nomor sinyal untuk dikirim ke proses tersebut jika berkas dirotasi.
Log Aplikasi
Aplikasi |
Berkas konfigurasi log |
Berkas log |
Apache |
/usr/local/etc/apache24/httpd.conf |
/var/log/httpd-access.log /var/log/httpd-error.log |
MySQL |
/usr/local/my.cnf |
/var/db/mysql/hostname.err |
WordPress |
(custom) /usr/local/etc/apache24/Includes/wordpress.conf |
(custom) /var/log/wordpress-access_log /var/log/wordpress-error_log |
Contoh Log Apache /var/log/httpd-access.log
: 
Contoh Log Apache /var/log/httpd-error.log
: 
Contoh Log MySQL /var/db/mysql/foo.err
: 
Contoh Log WordPress /var/log/wordpress-access_log
: 
Contoh Log WordPress /var/log/wordpress-error_log
: 
Log pada WordPress
Tidak ada mekanisme log secara khusus untuk aplikasi WordPress, namun kita dapat memanfaatkan fasilitas log Apache untuk melakukan log WordPress. Pertama, buat sebuah VirtualHost. Buat berkas /usr/local/etc/apache24/Includes/wordpress.conf
. Kemudian tulis baris-baris berikut: 
- DocumentRoot = lokasi berkas-berkas PHP/HTML WordPress
- ServerName = nama domain tempat dimana VirtualHost ini merespon
- ServerAlias = opsional – digunakan jika kita ingin VirtualHost ini merespon ke lebih dari satu nama domain
- ErrorLog adan CustomLog = fasilitas log dari Apache
Kemudian ubah berkas /usr/local/etc/apache24/httpd.conf
, beri tanda komentar pada baris-baris berikut: 
sehingga menjadi terlihat seperti berikut: 
Hidupkan kembali Apache:
service apache24 restart
Log akses pengguna WordPress
WordPress menyediakan plugin Simple History [5] untuk melalukan beberapa log, termasuk log akses pengguna. Ada juga plugin lainnya seperti WP Security Audit Log [5]. Cari plugin ‘Simple History’ pada menu Search Plugins kemudian klik Install Now: 
Jika menemukan pesan ‘Abort class-pclzip.php: Missing zlib extensions” seperti gambar di bawah, artinya instalasi gagal karena modul php zlib belum terinstal (secara default tidak masuk dalam instalasi php). Modul php zlib dapat diinstal menggunakan port /usr/ports/archivers/php56-zlib
. Setelah modul php zlib diinstal, instalasi plugin Simple History sudah bisa dilakukan: 
Setelah instalasi berhasil, aktivasikan plugin Simple History seperti berikut: 
Simple History akan menampilkan pesan berapa banyak kejadian di hari itu: 
Sayangnya, dalam WordPress kita tidak dapat melihat informasi kejadian apa saja yang dilog oleh Simple History. Namun kita dapat melihatnya dalam basis data wordpress sebagai berikut: 
Tabel wp_simple_history
menyimpan setiap kejadian dengan id
yang berbeda, waktu kejadian, level kejadian (seperti level pada syslogd), pesan (kejadiannya, misalnya log in/log out), dan sebagainya. Tabel wp_simple_history_contexts
menyimpan informasi detil kejadian, history_id
dalam tabel ini mengacu ke id
dalam tabel wp_simple_history
. 
Melewatkan log aplikasi ke Syslog
Log Apache dapat dilewatkan ke syslog [2], begitu juga log MySQL (sejak versi 5.1.20) [4]. Log akses pengguna WordPress juga dapat dilewatkan ke syslog dengan mengubah kode fungsi log dalam plugin Simple History. Keuntungan dan kerugiannya adalah sebagai berikut:
Keuntungan |
Kerugian |
Keuntungan sentralisasi log secara umum yaitu kemudahan dalam manajemen log. |
Kerugian sentralisasi log secara umum yaitu single point of failure. |
Jika ada yang menyerang aplikasi, penyerang tidak bisa menghapus jejaknya (lognya). |
Harus ada konfigurasi tambahan agar log juga ter-backup secara lokal (piped logging) |
Tidak perlu menghentikan dan menghidupkan kembali aplikasi untuk sekadar mengkompresikan log. |
Konfigurasi log Apache ke Syslog
Buat berkas /usr/local/bin/apache_syslog
yang berisi kode perl berikut. Kode perl ini intinya memanggil fungsi openlog()
untuk membuka koneksi ke syslog dan untuk menggunakan fasilitas local2
, fungsi syslog()
untuk mengirimkan log dengan level info
atau lebih tinggi, dan terakhir fungsi closelog()
untuk menutup koneksi. 
Pastikan bahwa berkas /usr/local/bin/apache_syslog
bersifat eksekutabel:

Kemudian instal p5-Sys-Syslog
melalui port sysutils/p5-Sys-Syslog
.
# cd /usr/ports/sysutils/p5-Sys-Syslog
# make install clean
Dalam berkas konfigurasi Apace /usr/local/apache24/httpd.conf
ganti direktif ErrorLog dan CustomLog seperti berikut:

Arti dari baris tersebut adalah kita memerintahkan ErrorLog untuk dilewatkan ke Syslog dengan menggunakan fasilitas local1
dan memerintahkan CustomLog (log akses) untuk mengeksekusi kode perl yang sudah dibuat sebelumnya. Namun karena sebelumnya kita menggunakan VirtualHost untuk log pada WordPress, maka log akan disimpan ke berkas-berkas yang ditetapkan di VirtualHost. Oleh karena itu, kita nonaktifkan VirtualHost dengan risiko log pada /var/log/wordpress-access_log
dan /var/log/wordpress-error_log
tidak akan aktif lagi. 
Tambahkan beberapa baris pada berkas konfigurasi Syslog /etc/syslog.conf
sebagai berikut. Artinya log dengan fasilitas local1
(yang telah ditetapkan untuk ErrorLog) dan dengan level apapun akan disimpan dalam berkas /var/log/httpd-error1.log
. Begitu pula log dengan fasilitas local2
(yang telah ditetapkan untuk CustomLog) dan dengan level apapun akan disimpan dalam berkas /var/log/httpd-access1.log
. 
Buat berkas-berkas log dengan perintah berikut:
# touch /var/log/httpd-error.log /var/log/httpd-access.log
Tambahkan baris-baris berikut pada berkas /etc/newsyslog.conf
untuk menentukan rotasi log: 
Hidupkan kembali syslogd dan apache24: 
Berikut isi berkas log /var/log/httpd-access1.log
: 
Dan berikut isi berkas log /var/log/httpd-error1.log
: 
Konfigurasi log MySQL ke Syslog
Log pada MySQL secara default menggunakan fasilitas daemon
, kita dapat menggantinya dengan fasilitas yang lain (local0-local7
) agar tidak tercampur dengan log yang lain. Sayangnya fasilitas log pada MySQL di-hard-code dalam mysqld_safe
. Oleh karena itu kita harus melakukan beberapa perubahan dalam berkas /usr/local/bin/mysqld_safe
sebagai berikut. Intinya adalah kita mendefinisikan fasilitas log sebagai variabel syslog_facility
(yang nilai defaultnya daemon
) sehingga kita dapat menetapkan nilainya sesuka hati.

Sekarang, kita perintahkan mysqld_safe untuk melewatkan log ke Syslog dan mengganti fasilitas log menjadi local3
dengan menambahkan tiga baris berikut pada berkas konfigurasi MySQL /usr/local/my.cnf
. Kemudian mulai/hidupkan mysqld_safe dengan perintah berikut:
# mysqld_safe --defaults-file=/usr/local/my.cnf

Tambahkan baris berikut berkas konfigurasi Syslog /etc/syslog.conf
. Baris ini berarti bahwa log dengan fasilitas local3
(yang telah ditetapkan untuk log MySQL) dan dengan level apapun akan disimpan dalam berkas /var/log/mysqld.log
. 
Buat berkas log dengan perintah berikut, kemudian hidupkan kembali syslogd.
# touch /var/log/mysqld.log
Berikut isi dari berkas log /var/log/mysqld.log
: 
Konfigurasi log akses pengguna WordPress ke Syslog
Dengan mengetahui fakta bahwa terdapat fungsi openlog(), syslog()
, dan closelog()
dalam PHP (PHP 4 dan PHP 5) mirip seperti pada kode perl sebelumnya, kita dapat menyelipkan kode tersebut ketika plugin Simple History melakukan kueri insert
ke basis data. Fungsi dimana plugin Simple History melakukan kueri insert
ke basis data adalah fungsi log()
dari kelas SimpleLogger
dalam berkas /usr/local/www/apache24/data/wp-content/plugins/simple-history/loggers/SimpleLogger.php
. Untuk jaga-jaga, salinan berkas SimpleLogger.php.old dibuat sebelum melakukan perubahan. 
Dalam fungsi log()
ada dua kali kueri insert
karena plugin Simple History memiliki dua tabel yaitu tabel wp_simple_history
dan tabel wp_simple_history_contexts
. Agar tidak terjadi redudansi log, penyelipan kode syslog()
dilakukan di satu tempat saja yaitu setelah kueri insert
ke tabel wp_simple_history_contexts
karena tabel ini menyimpan informasi detil setiap kejadian. Kode yang ditambahkan adalah yang diberi komentar “TAMBAHKAN …” sebagai berikut. 
Dalam kode di atas terlihat bahwa fasilitas local0
yang ditetapkan. Tambahkan baris berikut berkas konfigurasi Syslog /etc/syslog.conf
. Baris ini berarti bahwa log dengan fasilitas local0
(yang telah ditetapkan untuk log akses pengguna WordPress) dan dengan level apapun akan disimpan dalam berkas /var/log/wordpress.log
. 
Buat berkas log dengan perintah berikut, kemudian hidupkan kembali syslogd.
# touch /var/log/wordpress.log
Berikut isi dari berkas log /var/log/wordpress.log
. Kita dapat menentukan pesan apa yang ingin ditampilkan dalam log agar mudah untuk dibaca. Namun karena keterbatasan waktu, pesan yang ditampilkan adalah semua key:value
kejadian yang disimpan dalam tabel wp_simple_history_contexts
sehingga ada nilai value
yang NULL
atau redundan. Intinya adalah bahwa log akses pengguna WordPress yang disimpan dalam basis data terbukti dapat dilewatkan ke Syslog, yaitu dengan menyelipkan kode ke dalam plugin Simple History. 
Remote Logging
Dalam FreeBSD, pengumpulan, penggabungan, dan rotasi berkas log tersentralisasi dapat dikonfigurasikan menggunakan syslogd dan newsyslog. Untuk mensimulasikan remote logging, kita dapat menggunakan dua jendela VMware, satu untuk mesin virtual server log dan satu untuk mesin virtual klien log. Misalkan server log yang bernama fooserver
akan mengumpulkan informasi log untuk jaringan lokal. Klien log yang bernama foo
akan dikonfigurasikan untuk mengirimkan informasi log ke server log. Kedua mesin virtual menggunakan sistem operasi FreeBSD 10.1.
Konfigurasi Server Log
Sebelum mengkonfigurasikan server log, perhatikan hal-hal berikut:
- Jika terdapat firewall antara server log dan klien log, pastikan bahwa ruleset firewall mengizinkan UDP port 514 untuk kedua klien dan server.
Berikut adalah contoh ruleset firewall dari klien log foo (server log fooserver tidak dipasang firewall) dalam berkas /etc/pf.conf
. Setelah dilakukan perubahan ruleset, jangan lupa bahwa ruleset harus dimuat agar dapat digunakan. 
- Server log dan semua mesin klien harus memiliki entri dalam DNS lokal.
Berikut adalah berkas /etc/hosts
pada server log fooserver:
Dan berikut adalah berkas /etc/hosts
pada klien log foo: 
Pada server log fooserver, ubah /etc/syslog.conf
untuk menspesifikasikan nama klien yang mengirimkan entri, fasilitas log yang digunakan, dan nama log untuk menyimpan log klien. Kemudian hidupkan kembali syslogd. Berikut contoh ditambahkannya hostname foo, log semua fasilitas, dan simpan entri log dalam /var/log/logfoo.log
:

Kemudian konfigurasikan /etc/rc.conf
dan hidupkan kembali jaringan:

Entri pertama untuk memulai syslogd
ketika sistem boot. Entri kedua untuk mengizinkan entri log dari klien foo, meningkatkan verbosity dari pesan log (-vv), dan mengizinkan log dari banyak klien (-a). Terakhir buat berkas log:
# touch /var/log/logfoo.log
Konfigurasi Klien Log
Selain mengirimkan entri log ke server log fooserver, klien log foo juga menyimpan entri log secara lokal. Setelah server log dikonfigurasi, ubah /etc/rc.conf
pada klien log sebagai berikut kemudian hidupkan kembali jaringan:

Entri pertama untuk memulai syslogd
ketika sistem boot. Entri kedua untuk mencegah klien foo menerima entri log dari klien lain (-s) dan meningkatkan verbosity dari pesan log (-vv). Kemudian, definisikan server log fooserver dalam /etc/syslog.conf
klien foo. Dalam contoh berikut, semua fasilitas log dikirim ke server log fooserver. Setelah perubahan disimpan, jangan lupa untuk menghidupkan kembali syslogd
.

Untuk menguji apakah pesan log berhasil dikirim melalui jaringan, gunakan logger(1) pada klien untuk mengirimkan sebuah pesan ke syslogd
. Pesan ini seharusnya muncul dalam /var/log/messages
pada klien log foo dan /var/log/logfoo.log
pada server log fooserver.
# logger "halooooo fooserver"
Berikut isi dari berkas log /var/log/logfoo.log
dalam server log fooserver:

Referensi:
- https://www.freebsd.org/doc/en/books/handbook/configtuning-syslog.html
- http://www.blissfulidiot.com/2011/09/if-you-need-to-use-syslog-to-send.html
- http://archive.oreilly.com/pub/a/sysadmin/2006/10/12/httpd-syslog.html
- http://shinguz.blogspot.com/2010/01/mysql-reporting-to-syslog.html
- https://wordpress.org/plugins/wp-security-audit-log/screenshots/