<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Felipe Alfaro Solana &#187; Syslog</title>
	<atom:link href="http://www.felipe-alfaro.org/blog/category/syslog/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.felipe-alfaro.org/blog</link>
	<description>A little bit of technology, security and networking with Linux, FreeBSD and Mac OS X, plus some personal opinions.</description>
	<lastBuildDate>Sun, 23 Oct 2011 16:46:32 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>Configuring syslog-ng to store logs into a MySQL database</title>
		<link>http://www.felipe-alfaro.org/blog/2005/12/21/configuring-syslog-ng-to-store-logs-into-a-mysql-database/</link>
		<comments>http://www.felipe-alfaro.org/blog/2005/12/21/configuring-syslog-ng-to-store-logs-into-a-mysql-database/#comments</comments>
		<pubDate>Wed, 21 Dec 2005 12:59:14 +0000</pubDate>
		<dc:creator>Felipe Alfaro Solana</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Syslog]]></category>

		<guid isPermaLink="false">http://felipe-alfaro.org/blog/?p=86</guid>
		<description><![CDATA[This short article describes how to configure syslog-ng in order to store the logs into a MySQL backend. This adds more flexibility when performing log analysis, log searching and correlation. Installing MySQL MySQL can be compiled from source and installed using the FreeBSD ports collection: # cd /usr/ports/databases/mysql41-server/ # make install distclean Configuring MySQL Use [...]]]></description>
			<content:encoded><![CDATA[<p>This short article describes how to configure <em>syslog-ng</em> in order to store the logs into a MySQL backend. This adds more flexibility when performing log analysis, log searching and correlation.</p>
<h3>Installing MySQL</h3>
<p>MySQL can be compiled from source and installed using the FreeBSD ports collection:</p>
<pre>
<div># cd /usr/ports/databases/mysql41-server/
# make install distclean</div>
</pre>
<h3>Configuring MySQL</h3>
<p>Use the following commands to create the MySQL database directory and install a configuration file:</p>
<pre>
<div># mkdir /var/db/mysql
# cp /usr/local/share/mysql/my-small.cnf /var/db/mysql/my.cnf</div>
</pre>
<p>Optionally, edit <code>/var/db/mysql/my.cnf</code> to adjust some parameters like:</p>
<ul>
<li>Disabling networking support.
<p>This can be done by uncommenting the <code>skip-networking</code> option from the configuration file.</p>
<p>This will prevent MySQL from listening on port 3306/tcp. Since we are using MySQL locally, we can use UNIX sockets instead of true networking.</li>
<li>Reducing memory usage.
<p>By adjusting <code>innodb_buffer_pool_size</code> and <code>innodb_additional_mem_pool_size</code> to values suited to the amount of RAM available to FreeBSD</li>
</ul>
<p>Next, add the following lines into <code>/etc/rc.conf</code> so that MySQL will get launched during system startup:</p>
<pre>
<div># MySQL
mysql_enable="YES"
mysql_limits="YES"
mysql_dbdir="/var/db/mysql"
mysql_args=""</div>
</pre>
<h3>Starting MySQL</h3>
<p>Use the following command to start MySQL:</p>
<pre># /usr/local/etc/rc.d/mysql-server.sh start</pre>
<h3>Creating the MySQL database</h3>
<p>The logs will get stored into a table named <b>logs</b> on database <b>syslog</b>.<br />
To create the database and table, create a file named <code>syslog.sql</code> with the following SQL commands:</p>
<pre>
<div>CREATE DATABASE syslog;
USE syslog;
CREATE TABLE logs (
	host varchar(32) default NULL,
	facility varchar(10) default NULL,
	priority varchar(10) default NULL,
	level varchar(10) default NULL,
	tag varchar(10) default NULL,
	timestamp datetime default NULL,
	program varchar(15) default NULL,
	msg text,
	seq int(10) unsigned NOT NULL auto_increment,
	PRIMARY KEY (seq),
	KEY host (host),
	KEY seq (seq),
	KEY program (program),
	KEY timestamp (timestamp),
	KEY priority (priority),
	KEY facility (facility)
);</div>
</pre>
<p>Then, process those SQL commands using MySQL client:</p>
<pre># mysql -u root -p <syslog .sql</pre>
<h3>Setting up the communication channel</h3>
<p><em>syslog-ng</em> will issue INSERT INTO SQL commands into a UNIX pipe for every log received and processed. Those SQL commands will be retrieved from the UNIX pipe and will be injected into MySQL.</p>
<p>This UNIX pipe will act as the communication channel between <em>syslog-ng</em> and MySQL. To create the UNIX pipe:</p>
<pre>
<div># mkfifo /tmp/mysql.pipe</div>
</pre>
<p>Also, we will create a startup script used to keep feeding SQL commands sent to the UNIX pipe to MySQL called <code>/usr/local/etc/rc.d/040.mysql-syslog.sh</code>:</p>
<pre>
<div>( while [ -e /tmp/mysql.pipe ]
  do
        /usr/local/bin/mysql -u root --password= syslog </div>
</pre>
<p>This script will get invoked at startup and will keep feeding the SQL commands generated by the <code>mysql</code> <em>syslog-ng</em> destination into the MySQL database.</p>
<p>However, we must make sure this startup script is invoked <em>after</em> MySQL has been started. Thus, in FreeBSD I recommend renaming the MySQL startup script:</p>
<pre># mv /usr/local/etc/rc.d/mysql-server.sh \
     /usr/local/etc/rc.d/030.mysql-server.sh</pre>
<h3>Setting up syslog-ng</h3>
<p>Modify <code>/usr/local/etc/syslog-ng/syslog-ng.conf</code> to add a new source called <code>net</code> used to retrieve logs via the network:</p>
<pre>source net { udp(); };</pre>
<p>Next, add a new destination for MySQL:</p>
<pre>
<div>destination mysql { pipe("/tmp/mysql.pipe"
template("INSERT INTO logs (host, facility, priority, level, tag,
timestamp, program, msg) VALUES ( '$HOST', '$FACILITY', '$PRIORITY',
'$LEVEL', '$TAG', '$YEAR-$MONTH-$DAY $HOUR:$MIN:$SEC', '$PRORAM',
'$MSG' );\n") template-escape(yes) ); };</div>
</pre>
<p>Finally, configure <em>syslog-ng</em> so all logging is sent to the MySQL destination. Since <em>syslog-ng</em> allows multiple destinations, this makes perfectly possible to keep locally-generated log events stored in text files alongside the MySQL database.</p>
<pre>
<div>
log { source(net); destination(mysql); };
log { source(src); destination(mysql); };
</div>
</pre>
<p>Finally, we send the <code>SIGHUP</code> signal to <em>syslog-ng</em> to instruct it to re-read its configuration file and reconfigure accordingly:</p>
<pre># pkill -HUP syslog-ng</pre>
<p></syslog></pre>
]]></content:encoded>
			<wfw:commentRss>http://www.felipe-alfaro.org/blog/2005/12/21/configuring-syslog-ng-to-store-logs-into-a-mysql-database/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Remote logging with Linksys WRT54G</title>
		<link>http://www.felipe-alfaro.org/blog/2005/11/01/remote-logging-with-linksys-wrt54g/</link>
		<comments>http://www.felipe-alfaro.org/blog/2005/11/01/remote-logging-with-linksys-wrt54g/#comments</comments>
		<pubDate>Tue, 01 Nov 2005 17:05:00 +0000</pubDate>
		<dc:creator>Felipe Alfaro Solana</dc:creator>
				<category><![CDATA[OpenWRT]]></category>
		<category><![CDATA[Syslog]]></category>

		<guid isPermaLink="false">http://felipe-alfaro.org/blog/?p=64</guid>
		<description><![CDATA[Enabling remote syslog logging with Linksys WRT54G and OpenWRT White Russian RC3 is as simple as storing the IP of the remote syslog server into the log_ipaddr NVRAM variable: nvram set log_ipaddr=A.B.C.D nvram commit reboot log_ipaddr is used by /etc/init.d/rcS startup script to launch a local syslog daemon with option &#8220;-R &#8220;: #!/bin/sh syslog_ip=$(nvram get [...]]]></description>
			<content:encoded><![CDATA[<p>Enabling remote syslog logging with Linksys WRT54G and OpenWRT White Russian RC3 is as simple as storing the IP of the remote syslog server into the <em>log_ipaddr</em> NVRAM variable:</p>
<pre>
nvram set log_ipaddr=A.B.C.D
nvram commit
reboot
</pre>
<p><em>log_ipaddr</em> is used by <em>/etc/init.d/rcS</em> startup script to launch a local <em>syslog</em> daemon with option <em>&#8220;-R <remote syslog IP>&#8220;</remote></em>:</p>
<pre>
#!/bin/sh
syslog_ip=$(nvram get log_ipaddr)
ipcalc -s "$syslog_ip" || syslog_ip=""
syslogd -C 16 ${syslog_ip:+-L -R $syslog_ip}
klogd
...
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.felipe-alfaro.org/blog/2005/11/01/remote-logging-with-linksys-wrt54g/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>syslog-ng replacement for FreeBSD</title>
		<link>http://www.felipe-alfaro.org/blog/2005/10/31/syslog-ng-replacement-for-freebsd/</link>
		<comments>http://www.felipe-alfaro.org/blog/2005/10/31/syslog-ng-replacement-for-freebsd/#comments</comments>
		<pubDate>Sun, 30 Oct 2005 23:57:50 +0000</pubDate>
		<dc:creator>Felipe Alfaro Solana</dc:creator>
				<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[Syslog]]></category>

		<guid isPermaLink="false">http://felipe-alfaro.org/blog/?p=62</guid>
		<description><![CDATA[FreeBSD uses syslog by default. However, syslog is very old and inflexible, so I decided to replace it with syslog-ng. syslog-ng syntax is far more easier to read and understand than syslog&#8217;s one. syslog-ng uses the following elements to determine what to log and where to log it: Source: Defines where log entries do come [...]]]></description>
			<content:encoded><![CDATA[<p>FreeBSD uses syslog by default. However, syslog is very old and inflexible, so I decided to replace it with <em>syslog-ng</em>. <em>syslog-ng</em> syntax is far more easier to read and understand than syslog&#8217;s one.</p>
<p><em>syslog-ng</em> uses the following elements to determine what to log and where to log it:</p>
<ul>
<li><b>Source:</b> Defines where log entries do come from. For example, <em>syslog-ng</em> can read log entries from the <em>/var/run/log</em> local socket, from the network via UDP port 514, via TCP, and so on.
<p>I just decided to split the sources in two:</p>
<ol>
<li>A local source, called <em>src</em></li>
<li>A network source, called <em>net</em></li>
</ol>
<p>This allows easily to distinguish between locally generated log entries and log entries generated elsewhere by a network device or host machine.</li>
<li><b>Destination:</b> Defines where do log entries will get logged into. For example, log entries can be written to a file, can be sent to another syslog-compatible server, sent to a socket, and so on.
<p>I have kept the default destinations, and added a new one called <em>airport</em>, pointing to file <em>/var/log/airport.log</em>. All log events generated by my AirPort Express Wireless Access Point will get logged into this destination.</li>
<li><b>Filter:</b> Defines a matching criteria for log entries. Allows to distinguish log entries by some common attributes, like the source host, facility, logging level, a regular expression matching the entry description, and so on.
<p>I have kept the default filters, but added a new one called <em>f_airport</em>, which matches all log entries whose source is my Wireless Access Point.</li>
</ul>
<p>Finally, <b>log</b> entries combine sources, filters and destinations. When a log entry is received, it is matched against every <b>log</b> rules until a source and a filter matches. Then, the log entry is sent to the destination or destinations for that matching rule.</p>
<p>Since I wanted to centralize some logs into my FreeBSD server across the network, concretely my AirPort Express logs, this is the <em>/usr/local/etc/syslog-ng/syslog-ng.conf</em> file I used to achieve it:</p>
<pre>
#
# options
#
options { long_hostnames(off); sync(0); };

#
# sources
#
source src { unix-dgram("/var/run/log");
             unix-dgram("/var/run/logpriv" perm(0600));
             internal(); file("/dev/klog"); };

source net { udp(); };

#
# destinations
#
destination messages { file("/var/log/messages"); };
destination security { file("/var/log/security"); };
destination authlog { file("/var/log/auth.log"); };
destination maillog { file("/var/log/maillog"); };
destination lpd-errs { file("/var/log/lpd-errs"); };
destination xferlog { file("/var/log/xferlog"); };
destination cron { file("/var/log/cron"); };
destination debuglog { file("/var/log/debug.log"); };
destination consolelog { file("/var/log/console.log"); };
destination all { file("/var/log/all.log"); };
destination newscrit { file("/var/log/news/news.crit"); };
destination newserr { file("/var/log/news/news.err"); };
destination newsnotice { file("/var/log/news/news.notice"); };
destination console { file("/dev/console"); };
destination allusers { usertty("*"); };
#destination loghost { udp("loghost" port(514)); };
destination airport { file("/var/log/airport.log"); };
destination linksys { file("/var/log/linksys.log"); };

#
# log facility filters
#
filter f_auth { facility(auth); };
filter f_authpriv { facility(authpriv); };
filter f_not_authpriv { not facility(authpriv); };
filter f_console { facility(console); };
filter f_cron { facility(cron); };
filter f_daemon { facility(daemon); };
filter f_ftp { facility(ftp); };
filter f_kern { facility(kern); };
filter f_lpr { facility(lpr); };
filter f_mail { facility(mail); };
filter f_news { facility(news); };
filter f_security { facility(security); };
filter f_user { facility(user); };
filter f_uucp { facility(uucp); };
filter f_local0 { facility(local0); };
filter f_local1 { facility(local1); };
filter f_local2 { facility(local2); };
filter f_local3 { facility(local3); };
filter f_local4 { facility(local4); };
filter f_local5 { facility(local5); };
filter f_local6 { facility(local6); };
filter f_local7 { facility(local7); };

#
# log level filters
#
filter f_emerg { level(emerg); };
filter f_alert { level(alert..emerg); };
filter f_crit { level(crit..emerg); };
filter f_err { level(err..emerg); };
filter f_warning { level(warning..emerg); };
filter f_notice { level(notice..emerg); };
filter f_info { level(info..emerg); };
filter f_debug { level(debug..emerg); };
filter f_is_debug { level(debug); };

#
# airport filter
#
filter f_airport { host("airport"); };

#
# linksys filter
#
filter f_linksys { host("linksys"); };

#
# *.err;kern.warning;auth.notice;mail.crit              /dev/console
#
log { source(src); filter(f_err); destination(console); };
log { source(src); filter(f_kern); filter(f_warning); destination(console); };
log { source(src); filter(f_auth); filter(f_notice); destination(console); };
log { source(src); filter(f_mail); filter(f_crit); destination(console); };

#
# *.notice;authpriv.none;kern.debug;lpr.info;mail.crit;news.err /var/log/messages
#
log { source(src); filter(f_notice); filter(f_not_authpriv); destination(messages); };
log { source(src); filter(f_kern); filter(f_debug); destination(messages); };
log { source(src); filter(f_lpr); filter(f_info); destination(messages); };
log { source(src); filter(f_mail); filter(f_crit); destination(messages); };
log { source(src); filter(f_news); filter(f_err); destination(messages); };

#
# security.*                                            /var/log/security
#
log { source(src); filter(f_security); destination(security); };

#
# auth.info;authpriv.info                               /var/log/auth.log
log { source(src); filter(f_auth); filter(f_info); destination(authlog); };
log { source(src); filter(f_authpriv); filter(f_info); destination(authlog); };

#
# mail.info                                             /var/log/maillog
#
log { source(src); filter(f_mail); filter(f_info); destination(maillog); };

#
# lpr.info                                              /var/log/lpd-errs
#
log { source(src); filter(f_lpr); filter(f_info); destination(lpd-errs); };

#
# ftp.info                                              /var/log/xferlog
#
log { source(src); filter(f_ftp); filter(f_info); destination(xferlog); };

#
# cron.*                                                /var/log/cron
#
log { source(src); filter(f_cron); destination(cron); };

#
# *.=debug                                              /var/log/debug.log
#
log { source(src); filter(f_is_debug); destination(debuglog); };

#
# *.emerg                                               *
#
log { source(src); filter(f_emerg); destination(allusers); };

#
# airport logging
#
log { source(net); filter(f_airport); destination(airport); };

#
# linksys logging
#
log { source(net); filter(f_linksys); destination(linksys); };
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.felipe-alfaro.org/blog/2005/10/31/syslog-ng-replacement-for-freebsd/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

