<?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>sixserv blog &#187; logging</title>
	<atom:link href="http://sixserv.org/tag/logging/feed/" rel="self" type="application/rss+xml" />
	<link>http://sixserv.org</link>
	<description>A Blog about Linux, Networking, Development and Security.</description>
	<lastBuildDate>Tue, 27 Jul 2010 16:45:57 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Kleine Ruby Logger Klasse</title>
		<link>http://sixserv.org/2009/06/13/kleine-ruby-logger-klasse/</link>
		<comments>http://sixserv.org/2009/06/13/kleine-ruby-logger-klasse/#comments</comments>
		<pubDate>Sat, 13 Jun 2009 04:04:09 +0000</pubDate>
		<dc:creator>apoc</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[logging]]></category>
		<category><![CDATA[snippets]]></category>

		<guid isPermaLink="false">http://sixserv.org/?p=439</guid>
		<description><![CDATA[<img src="/wp-content/themes/6stheme/icons/icon_ruby.png" width="50" height="51" alt="" title="Ruby" /><br/>Normalerweise sind die Artikel hier ja ziemlich umfangreich, was ja auch gut ist schließlich geht das Sixserv Blog ja schon sehr ins technische Detail. Doch diesmal wird es eher kurz, ich möchte eine kleine Logger Klasse vorstellen die ich in Ruby geschrieben habe und seither häufiger benutze. 1 2 3 4 5 6 7 8 [...]]]></description>
			<content:encoded><![CDATA[<img src="/wp-content/themes/6stheme/icons/icon_ruby.png" width="50" height="51" alt="" title="Ruby" /><br/><p>Normalerweise sind die Artikel hier ja ziemlich umfangreich, was ja auch gut ist schließlich geht das Sixserv Blog ja schon sehr ins technische Detail. Doch diesmal wird es eher kurz, ich möchte eine kleine Logger Klasse vorstellen die ich in Ruby geschrieben habe und seither häufiger benutze.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>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
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> <span style="color:#CC00FF; font-weight:bold;">Logger</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">init</span>
    <span style="color:#0066ff; font-weight:bold;">@logfile</span> = LOG_FILE
    <span style="color:#0066ff; font-weight:bold;">@buffer</span> = <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#008000; font-style:italic;"># logging lines for buffering</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#006600; font-weight:bold;">&lt;&lt;</span> msg
    msg = <span style="color:#CC0066; font-weight:bold;">format</span> msg
&nbsp;
    <span style="color:#008000; font-style:italic;"># append message to buffer</span>
    <span style="color:#0066ff; font-weight:bold;">@buffer</span> <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> msg
&nbsp;
    <span style="color:#008000; font-style:italic;"># flush the buffer if possible</span>
    <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">flush</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">flush</span>
    <span style="color:#0000FF; font-weight:bold;">return</span> <span style="color:#9966CC; font-weight:bold;">if</span> <span style="color:#0066ff; font-weight:bold;">@buffer</span>.<span style="color:#9900CC;">empty</span>?
&nbsp;
    <span style="color:#008000; font-style:italic;"># try to lock the file for writing</span>
    log = <span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>@logfile, <span style="color:#996600;">'a+'</span><span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
    <span style="color:#9966CC; font-weight:bold;">if</span> log.<span style="color:#9900CC;">flock</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#6666ff; font-weight:bold;">File::LOCK_EX</span> <span style="color:#006600; font-weight:bold;">|</span> <span style="color:#6666ff; font-weight:bold;">File::LOCK_NB</span><span style="color:#006600; font-weight:bold;">&#41;</span> == <span style="color:#0000FF; font-weight:bold;">false</span>
      <span style="color:#008000; font-style:italic;"># Logfile is locked</span>
      <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;Logfile is locked!&quot;</span>
      log.<span style="color:#9900CC;">close</span>
      <span style="color:#0000FF; font-weight:bold;">return</span> <span style="color:#0000FF; font-weight:bold;">false</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
    <span style="color:#008000; font-style:italic;"># ==&gt; not locked, write buffer to logfile</span>
    <span style="color:#9966CC; font-weight:bold;">while</span> <span style="color:#0066ff; font-weight:bold;">@buffer</span>.<span style="color:#9900CC;">length</span> <span style="color:#006600; font-weight:bold;">&gt;</span> <span style="color:#006666;">0</span>
      log.<span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#0066ff; font-weight:bold;">@buffer</span>.<span style="color:#9900CC;">shift</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
    log.<span style="color:#9900CC;">flock</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#6666ff; font-weight:bold;">File::LOCK_UN</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    log.<span style="color:#9900CC;">close</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  private
  <span style="color:#9966CC; font-weight:bold;">def</span> <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#CC0066; font-weight:bold;">format</span> msg
    time = <span style="color:#CC00FF; font-weight:bold;">Time</span>.<span style="color:#9900CC;">now</span>.<span style="color:#9900CC;">strftime</span> <span style="color:#996600;">'%H:%M:%S - %d.%m.%Y'</span>
    <span style="color:#996600;">&quot;[#{time}] #{msg}&quot;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>

<p>Nichts großes also, es gibt z.B. keine Log-Level usw. Außerdem kann man sich, wenn man etwas mehr Features braucht, auch eine Logging Bibliothek aus dem Gems bedienen. Die Anwendung ist ganz einfach:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'/pfad/zu/logger.rb'</span>
<span style="color:#CC00FF; font-weight:bold;">Logger</span>.<span style="color:#9900CC;">init</span>
<span style="color:#008000; font-style:italic;"># das kann man dann überall im Code verteilen:</span>
<span style="color:#CC00FF; font-weight:bold;">Logger</span> <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> <span style="color:#996600;">&quot;Irgendeine Nachricht!&quot;</span>
<span style="color:#008000; font-style:italic;"># hat man eine große Anwendung mit vielen Prozessen/Threads</span>
<span style="color:#008000; font-style:italic;"># kann man auch an strategischen Stellen ein</span>
<span style="color:#CC00FF; font-weight:bold;">Logger</span>.<span style="color:#9900CC;">flush</span>
<span style="color:#008000; font-style:italic;"># einbauen :)</span></pre></td></tr></table></div>

<p>Hier noch eine kleine Erweiterung die einen Log-Server implementiert. Er öffnet einen TCP Port, jeder der sich verbindet(z.B. per Telnet/Netcat) kann daraufhin die Log-Nachrichten mitlesen:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>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
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> <span style="color:#CC00FF; font-weight:bold;">Logger</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">init</span>
    ...
    <span style="color:#0066ff; font-weight:bold;">@port</span> = LOG_PORT
    <span style="color:#0066ff; font-weight:bold;">@query</span> = <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006600; font-weight:bold;">&#93;</span>
    <span style="color:#0066ff; font-weight:bold;">@query_mutex</span> = <span style="color:#0000FF; font-weight:bold;">nil</span>
    <span style="color:#0066ff; font-weight:bold;">@running</span> = <span style="color:#0000FF; font-weight:bold;">false</span>
    <span style="color:#0066ff; font-weight:bold;">@server</span> = <span style="color:#0000FF; font-weight:bold;">nil</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">start_server</span>
    <span style="color:#0066ff; font-weight:bold;">@query_mutex</span> = <span style="color:#CC00FF; font-weight:bold;">Mutex</span>.<span style="color:#9900CC;">new</span>
    <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;Start logging console @ #{LOG_HOST}:#{LOG_PORT}&quot;</span>
&nbsp;
    <span style="color:#0066ff; font-weight:bold;">@server</span> = TCPServer.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>LOG_HOST, LOG_PORT<span style="color:#006600; font-weight:bold;">&#41;</span>
    clients = <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006600; font-weight:bold;">&#93;</span>
    <span style="color:#0066ff; font-weight:bold;">@running</span> = <span style="color:#0000FF; font-weight:bold;">true</span>
    <span style="color:#CC00FF; font-weight:bold;">Thread</span>.<span style="color:#9900CC;">start</span> <span style="color:#9966CC; font-weight:bold;">do</span>
      client = <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006600; font-weight:bold;">&#93;</span>
      <span style="color:#9966CC; font-weight:bold;">while</span> <span style="color:#0066ff; font-weight:bold;">@running</span> <span style="color:#9966CC; font-weight:bold;">do</span>
        <span style="color:#9966CC; font-weight:bold;">begin</span>
          client = <span style="color:#0066ff; font-weight:bold;">@server</span>.<span style="color:#9900CC;">accept_nonblock</span>
          clients <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> client <span style="color:#9966CC; font-weight:bold;">if</span> client != <span style="color:#0000FF; font-weight:bold;">nil</span>
        <span style="color:#9966CC; font-weight:bold;">rescue</span>
        <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
        <span style="color:#9966CC; font-weight:bold;">begin</span>
          message = <span style="color:#0000FF; font-weight:bold;">nil</span>
          <span style="color:#0066ff; font-weight:bold;">@query_mutex</span>.<span style="color:#9900CC;">synchronize</span> <span style="color:#006600; font-weight:bold;">&#123;</span> message = <span style="color:#0066ff; font-weight:bold;">@query</span>.<span style="color:#9900CC;">pop</span> <span style="color:#006600; font-weight:bold;">&#125;</span>
          <span style="color:#9966CC; font-weight:bold;">if</span> message != <span style="color:#0000FF; font-weight:bold;">nil</span>
            clients.<span style="color:#9900CC;">each</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>client<span style="color:#006600; font-weight:bold;">|</span>
                <span style="color:#9966CC; font-weight:bold;">begin</span>
                    client.<span style="color:#CC0066; font-weight:bold;">puts</span> message
                <span style="color:#9966CC; font-weight:bold;">rescue</span>
                    clients.<span style="color:#9900CC;">delete</span> client
                <span style="color:#9966CC; font-weight:bold;">end</span> 
            <span style="color:#9966CC; font-weight:bold;">end</span>
          <span style="color:#9966CC; font-weight:bold;">end</span>
        <span style="color:#9966CC; font-weight:bold;">end</span> <span style="color:#9966CC; font-weight:bold;">while</span> <span style="color:#9966CC; font-weight:bold;">not</span> <span style="color:#0066ff; font-weight:bold;">@query</span>.<span style="color:#9900CC;">empty</span>?
        <span style="color:#CC0066; font-weight:bold;">sleep</span> LOG_SERVER_INTERVAL
      <span style="color:#9966CC; font-weight:bold;">end</span>
      clients.<span style="color:#9900CC;">each</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#006600; font-weight:bold;">|</span>client<span style="color:#006600; font-weight:bold;">|</span> client.<span style="color:#9900CC;">close</span> <span style="color:#006600; font-weight:bold;">&#125;</span>
      <span style="color:#0066ff; font-weight:bold;">@server</span>.<span style="color:#9900CC;">close</span>
      <span style="color:#0066ff; font-weight:bold;">@server</span> = <span style="color:#0000FF; font-weight:bold;">nil</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">destroy</span>
    <span style="color:#0066ff; font-weight:bold;">@running</span> = <span style="color:#0000FF; font-weight:bold;">false</span>
    <span style="color:#0066ff; font-weight:bold;">@fs</span>.<span style="color:#9900CC;">close</span>
&nbsp;
    <span style="color:#008000; font-style:italic;"># wait until server closed</span>
    <span style="color:#0000FF; font-weight:bold;">true</span> <span style="color:#9966CC; font-weight:bold;">while</span> <span style="color:#0066ff; font-weight:bold;">@server</span> != <span style="color:#0000FF; font-weight:bold;">nil</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#006600; font-weight:bold;">&lt;&lt;</span> msg
    <span style="color:#9966CC; font-weight:bold;">if</span> <span style="color:#0066ff; font-weight:bold;">@query_mutex</span> != <span style="color:#0000FF; font-weight:bold;">nil</span>
      <span style="color:#0066ff; font-weight:bold;">@query_mutex</span>.<span style="color:#9900CC;">synchronize</span> <span style="color:#9966CC; font-weight:bold;">do</span>
        <span style="color:#0066ff; font-weight:bold;">@query</span> <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> <span style="color:#CC0066; font-weight:bold;">format</span><span style="color:#006600; font-weight:bold;">&#40;</span>msg<span style="color:#006600; font-weight:bold;">&#41;</span>
      <span style="color:#9966CC; font-weight:bold;">end</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
    <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;&gt;&gt;&gt; #{msg}&quot;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>  
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">flush</span>
    <span style="color:#008000; font-style:italic;"># just wait until everything is sent/written</span>
    <span style="color:#9966CC; font-weight:bold;">if</span> <span style="color:#0066ff; font-weight:bold;">@query</span>.<span style="color:#9900CC;">length</span> <span style="color:#006600; font-weight:bold;">&gt;</span> <span style="color:#006666;">0</span>
      <span style="color:#0000FF; font-weight:bold;">true</span> <span style="color:#9966CC; font-weight:bold;">while</span> <span style="color:#0066ff; font-weight:bold;">@query</span>.<span style="color:#9900CC;">length</span> != <span style="color:#006666;">0</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  ...
<span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>

<p>So das wars schon, ich hoffe das ich das mit dem Mutex richtig gemacht habe und das hier überhaupt notwendig war, ich habe auf dem Gebiet nicht viel Erfahrung und würde mich über einen entsprechenden Kommentar freuen.<br />
// I&#8217;m not sure I used the Mutex in this example correctly, I would appreciate a comment about this.</p>
]]></content:encoded>
			<wfw:commentRss>http://sixserv.org/2009/06/13/kleine-ruby-logger-klasse/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
