<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>Felice Pollano Blog - log4net</title>
    <link>http://www.felicepollano.com/</link>
    <description>The official Fatica Labs Blog!</description>
    <language>en-us</language>
    <copyright>Felice Pollano</copyright>
    <lastBuildDate>Mon, 05 Jul 2010 09:56:00 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 2.3.9074.18820</generator>
    <managingEditor>felice@felicepollano.com</managingEditor>
    <webMaster>felice@felicepollano.com</webMaster>
    <item>
      <trackback:ping>http://www.felicepollano.com/Trackback.aspx?guid=58710c0c-064c-438b-949c-fe6ba88be1e8</trackback:ping>
      <pingback:server>http://www.felicepollano.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.felicepollano.com/PermaLink,guid,58710c0c-064c-438b-949c-fe6ba88be1e8.aspx</pingback:target>
      <dc:creator>Felice Pollano</dc:creator>
      <wfw:comment>http://www.felicepollano.com/CommentView,guid,58710c0c-064c-438b-949c-fe6ba88be1e8.aspx</wfw:comment>
      <wfw:commentRss>http://www.felicepollano.com/SyndicationService.asmx/GetEntryCommentsRss?guid=58710c0c-064c-438b-949c-fe6ba88be1e8</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p align="justify">
A volte si vuole ottenere l amedesima configurazione di logging per log con diverso
nome, accomunati da una radice: xEs se usiamo NHibernate avremo NHibernate.Cfg.XmlHbmBinding,NHibernate.Cfg.Configuration,
NHibernate.Cfg.SettingsFactory, NHibernate.Dialect.Dialect … e via discorrendo. E’
bello sapere che <a href="http://logging.apache.org/log4net/index.html" target="_blank">log4net</a> supporta
una gerarchia tra logger, e che questa è implicata dal nome: se voglio, per esempio,
per tutti i logger di NH loggare solo i messaggi di fatal error posso scrivere:
</p>
        <pre>
          <code>&lt;logger name="NHibernate" &gt;<br />
    &lt;level value="FATAL" /&gt;<br />
  &lt;/logger&gt;<br /></code>
        </pre>
        <p>
 
</p>
        <p>
Ed tutti i logger NHibernate.* cadranno in questo caso. Ovviamente lo stesso lo posso
fare con una sotto gerarchia, per esempio con name=”NHibernate.Cfg” riferirò tutti
i log di configurazione.
</p>
        <p>
Buono a sapersi, anche per quando si decidono i nomi dei logger nelle proprie applicazioni.
</p>
        <img width="0" height="0" src="http://www.felicepollano.com/aggbug.ashx?id=58710c0c-064c-438b-949c-fe6ba88be1e8" />
      </body>
      <title>Log4net: configurazione per log multipli</title>
      <guid isPermaLink="false">http://www.felicepollano.com/PermaLink,guid,58710c0c-064c-438b-949c-fe6ba88be1e8.aspx</guid>
      <link>http://www.felicepollano.com/2010/07/05/Log4netConfigurazionePerLogMultipli.aspx</link>
      <pubDate>Mon, 05 Jul 2010 09:56:00 GMT</pubDate>
      <description>&lt;p align="justify"&gt;
A volte si vuole ottenere l amedesima configurazione di logging per log con diverso
nome, accomunati da una radice: xEs se usiamo NHibernate avremo NHibernate.Cfg.XmlHbmBinding,NHibernate.Cfg.Configuration,
NHibernate.Cfg.SettingsFactory, NHibernate.Dialect.Dialect … e via discorrendo. E’
bello sapere che &lt;a href="http://logging.apache.org/log4net/index.html" target="_blank"&gt;log4net&lt;/a&gt; supporta
una gerarchia tra logger, e che questa è implicata dal nome: se voglio, per esempio,
per tutti i logger di NH loggare solo i messaggi di fatal error posso scrivere:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;logger name="NHibernate" &amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;level value="FATAL" /&amp;gt;&lt;br&gt;
&amp;nbsp; &amp;lt;/logger&amp;gt;&lt;br&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Ed tutti i logger NHibernate.* cadranno in questo caso. Ovviamente lo stesso lo posso
fare con una sotto gerarchia, per esempio con name=”NHibernate.Cfg” riferirò tutti
i log di configurazione.
&lt;/p&gt;
&lt;p&gt;
Buono a sapersi, anche per quando si decidono i nomi dei logger nelle proprie applicazioni.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.felicepollano.com/aggbug.ashx?id=58710c0c-064c-438b-949c-fe6ba88be1e8" /&gt;</description>
      <comments>http://www.felicepollano.com/CommentView,guid,58710c0c-064c-438b-949c-fe6ba88be1e8.aspx</comments>
      <category>log4net</category>
    </item>
    <item>
      <trackback:ping>http://www.felicepollano.com/Trackback.aspx?guid=902148d9-a656-49cf-b864-b5bef54fb393</trackback:ping>
      <pingback:server>http://www.felicepollano.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.felicepollano.com/PermaLink,guid,902148d9-a656-49cf-b864-b5bef54fb393.aspx</pingback:target>
      <dc:creator>Felice Pollano</dc:creator>
      <wfw:comment>http://www.felicepollano.com/CommentView,guid,902148d9-a656-49cf-b864-b5bef54fb393.aspx</wfw:comment>
      <wfw:commentRss>http://www.felicepollano.com/SyndicationService.asmx/GetEntryCommentsRss?guid=902148d9-a656-49cf-b864-b5bef54fb393</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Per abilitare il logging delle query con NHibernate occorre:
</p>
        <ol>
          <li>
Avere nella bin dell applicativo ( ie: nella <strong>/bin</strong> per le applicazioni
web, a fianco dell’ esequibile per le applicazioni stand-alone ) la dll di <a href="http://logging.apache.org/log4net/index.html" target="_blank">log4net</a>. 
</li>
          <li>
Aggiungere nel file di configurazione la sessione di config per log4net:</li>
        </ol>
        <p>
&lt;configuration&gt;<br />
  &lt;configSections&gt;<br />
    <strong>&lt;section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,
log4net"/&gt;</strong></p>
        <p>
  &lt;/configSections&gt;<br />
  <strong>&lt;log4net&gt;</strong><br />
    &lt;appender name="console" type="log4net.Appender.ConsoleAppender"&gt;<br />
      &lt;layout type="log4net.Layout.PatternLayout"&gt;<br />
        &lt;param name="ConversionPattern" value="%-5p
- %m%n" /&gt;<br />
      &lt;/layout&gt;<br />
    &lt;/appender&gt;<br />
    <strong>&lt;logger name="NHibernate.SQL" additivity="false"&gt;<br />
      &lt;level value="ALL"/&gt;<br />
      &lt;appender-ref ref="console" /&gt;<br />
    &lt;/logger&gt;<br /></strong>    &lt;root&gt;<br />
      &lt;priority value="WARN" /&gt;<br />
      &lt;appender-ref ref="console" /&gt;<br />
    &lt;/root&gt;<br />
  <strong>&lt;/log4net&gt;<br /></strong>&lt;/configuration&gt; 
</p>
        <p>
Con questa configurazione si usa il console appender, per un’applicativo web potrebbe
essere meglio usare un <a href="http://logging.apache.org/log4net/release/config-examples.html" target="_blank">TraceAppender
o un altro appender di proprio gusto ;-)</a></p>
        <p>
  
</p>
        <li>
Assicurarsi di chiamare, almeno una voltanell’applicazione <strong>log4net.XmlConfigurator.Configure()</strong></li>
        <li>
Aggiungere questa proprietà nella configurazione di NH:                                         <strong>&lt;property
name="show_sql"&gt;true&lt;/property&gt;</strong></li>
        <h6>
        </h6>
        <h3>
          <em>
            <u>Se <b>NON</b> vogliamo mettere nulla di log4net nella configurazione</u>
          </em>:
</h3>
        <p>
Possiamo configurare log4net dall’ applicativo, con un paio di linee di codice:
</p>
        <div class="csharpcode">
          <pre class="alt">
            <span class="lnum"> 1: </span> TraceAppender
app = <span class="kwrd">new</span> TraceAppender();</pre>
          <pre>
            <span class="lnum"> 2: </span> app.Layout
= <span class="kwrd">new</span> SimpleLayout();</pre>
          <pre class="alt">
            <span class="lnum"> 3: </span> LoggerMatchFilter
filter = <span class="kwrd">new</span> LoggerMatchFilter();</pre>
          <pre>
            <span class="lnum"> 4: </span> filter.LoggerToMatch=<span class="str">"NHibernate.SQL"</span>;</pre>
          <pre class="alt">
            <span class="lnum"> 5: </span> filter.AcceptOnMatch
= <span class="kwrd">true</span>;</pre>
          <pre>
            <span class="lnum"> 6: </span> filter.ActivateOptions();</pre>
          <pre class="alt">
            <span class="lnum"> 7: </span> app.AddFilter(filter); <span class="rem">//
L'ordine di questo filtro</span></pre>
          <pre>
            <span class="lnum"> 8: </span> app.AddFilter(<span class="kwrd">new</span> DenyAllFilter()); <span class="rem">//
e di quest'altro E' importante</span></pre>
          <pre class="alt">
            <span class="lnum"> 9: </span> app.ActivateOptions();</pre>
          <pre>
            <span class="lnum"> 10: </span> BasicConfigurator.Configure(
app);</pre>
          <pre> </pre>
          <pre> </pre>
          <pre> </pre>
        </div>
        <style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
        <style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
        <p>
In questo caso si possono saltare gli step da 1 a 3. Questo codice deve essere chiamato
una volta nell’applicazione in fase di startup, per un’applicazione web, potrebbe
andare bene l’evento di startup dell'applicazione in <b>global.asax</b>. Con l’appender
e i filtri configurati si ottiene nell'area trace di Visual Studio ( Output-tab Debug) 
l’output delle sole query generate da NH ( senza gli altri logger, se servono 
si possono togliere i filtri )
</p>
        <img width="0" height="0" src="http://www.felicepollano.com/aggbug.ashx?id=902148d9-a656-49cf-b864-b5bef54fb393" />
      </body>
      <title>Abilitare il logging delle query con NHibernate</title>
      <guid isPermaLink="false">http://www.felicepollano.com/PermaLink,guid,902148d9-a656-49cf-b864-b5bef54fb393.aspx</guid>
      <link>http://www.felicepollano.com/2010/04/27/AbilitareIlLoggingDelleQueryConNHibernate.aspx</link>
      <pubDate>Tue, 27 Apr 2010 15:43:20 GMT</pubDate>
      <description>&lt;p&gt;
Per abilitare il logging delle query con NHibernate occorre:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
Avere nella bin dell applicativo ( ie: nella &lt;strong&gt;/bin&lt;/strong&gt; per le applicazioni
web, a fianco dell’ esequibile per le applicazioni stand-alone ) la dll di &lt;a href="http://logging.apache.org/log4net/index.html" target="_blank"&gt;log4net&lt;/a&gt;. 
&lt;/li&gt;
&lt;li&gt;
Aggiungere nel file di configurazione la sessione di config per log4net:&lt;/li&gt;
&lt;p&gt;
&amp;lt;configuration&amp;gt;&lt;br&gt;
&amp;nbsp; &amp;lt;configSections&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;strong&gt;&amp;lt;section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,
log4net"/&amp;gt;&lt;/strong&gt; 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp; &amp;lt;/configSections&amp;gt;&lt;br&gt;
&amp;nbsp; &lt;strong&gt;&amp;lt;log4net&amp;gt;&lt;/strong&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;appender name="console" type="log4net.Appender.ConsoleAppender"&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;layout type="log4net.Layout.PatternLayout"&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;param name="ConversionPattern" value="%-5p
- %m%n" /&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/layout&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/appender&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;strong&gt;&amp;lt;logger name="NHibernate.SQL" additivity="false"&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;level value="ALL"/&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;appender-ref ref="console" /&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/logger&amp;gt;&lt;br&gt;
&lt;/strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;root&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;priority value="WARN" /&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;appender-ref ref="console" /&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/root&amp;gt;&lt;br&gt;
&amp;nbsp; &lt;strong&gt;&amp;lt;/log4net&amp;gt;&lt;br&gt;
&lt;/strong&gt;&amp;lt;/configuration&amp;gt; 
&lt;/p&gt;
&lt;p&gt;
Con questa configurazione si usa il console appender, per un’applicativo web potrebbe
essere meglio usare un &lt;a href="http://logging.apache.org/log4net/release/config-examples.html" target="_blank"&gt;TraceAppender
o un altro appender di proprio gusto ;-)&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp; 
&lt;/p&gt;
&lt;li&gt;
Assicurarsi di chiamare, almeno una voltanell’applicazione &lt;strong&gt;log4net.XmlConfigurator.Configure()&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
Aggiungere questa proprietà nella configurazione di NH:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;strong&gt;&amp;lt;property
name="show_sql"&amp;gt;true&amp;lt;/property&amp;gt;&lt;/strong&gt;
&lt;/li&gt;&gt;
&lt;h6&gt;
&lt;/h6&gt;
&lt;h3&gt;&lt;em&gt;&lt;u&gt;Se &lt;b&gt;NON&lt;/b&gt; vogliamo mettere nulla di log4net nella configurazione&lt;/u&gt;&lt;/em&gt;:
&lt;/h3&gt;
&lt;p&gt;
Possiamo configurare log4net dall’ applicativo, con un paio di linee di codice:
&lt;/p&gt;
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 1: &lt;/span&gt; TraceAppender
app = &lt;span class="kwrd"&gt;new&lt;/span&gt; TraceAppender();&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 2: &lt;/span&gt; app.Layout
= &lt;span class="kwrd"&gt;new&lt;/span&gt; SimpleLayout();&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 3: &lt;/span&gt; LoggerMatchFilter
filter = &lt;span class="kwrd"&gt;new&lt;/span&gt; LoggerMatchFilter();&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 4: &lt;/span&gt; filter.LoggerToMatch=&lt;span class="str"&gt;"NHibernate.SQL"&lt;/span&gt;;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 5: &lt;/span&gt; filter.AcceptOnMatch
= &lt;span class="kwrd"&gt;true&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 6: &lt;/span&gt; filter.ActivateOptions();&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 7: &lt;/span&gt; app.AddFilter(filter); &lt;span class="rem"&gt;//
L'ordine di questo filtro&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 8: &lt;/span&gt; app.AddFilter(&lt;span class="kwrd"&gt;new&lt;/span&gt; DenyAllFilter()); &lt;span class="rem"&gt;//
e di quest'altro E' importante&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 9: &lt;/span&gt; app.ActivateOptions();&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 10: &lt;/span&gt; BasicConfigurator.Configure(
app);&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
&lt;p&gt;
In questo caso si possono saltare gli step da 1 a 3. Questo codice deve essere chiamato
una volta nell’applicazione in fase di startup, per un’applicazione web, potrebbe
andare bene l’evento di startup dell'applicazione in &lt;b&gt;global.asax&lt;/b&gt;. Con l’appender
e i filtri configurati si ottiene nell'area trace di Visual Studio ( Output-tab Debug)&amp;nbsp;
l’output delle sole query generate da NH ( senza gli altri logger, se servono&amp;nbsp;
si possono togliere i filtri )
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.felicepollano.com/aggbug.ashx?id=902148d9-a656-49cf-b864-b5bef54fb393" /&gt;</description>
      <comments>http://www.felicepollano.com/CommentView,guid,902148d9-a656-49cf-b864-b5bef54fb393.aspx</comments>
      <category>NHibernate</category>
      <category>log4net</category>
    </item>
    <item>
      <trackback:ping>http://www.felicepollano.com/Trackback.aspx?guid=697249ee-3f0f-4149-a531-91cecac8d608</trackback:ping>
      <pingback:server>http://www.felicepollano.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.felicepollano.com/PermaLink,guid,697249ee-3f0f-4149-a531-91cecac8d608.aspx</pingback:target>
      <dc:creator>Felice Pollano</dc:creator>
      <wfw:comment>http://www.felicepollano.com/CommentView,guid,697249ee-3f0f-4149-a531-91cecac8d608.aspx</wfw:comment>
      <wfw:commentRss>http://www.felicepollano.com/SyndicationService.asmx/GetEntryCommentsRss?guid=697249ee-3f0f-4149-a531-91cecac8d608</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p align="justify">
Uno scenario di possibile utilizzo di <a href="http://logging.apache.org/log4net/release/sdk/log4net.Appender.RemotingAppender.html" target="_blank">RemotingAppender</a> è
quando si voglia concentrare in un unico punto i log di più app domain hostati nello
stesso processo. Infatti un app domain separato vede difatto un’altra configurazione
di <a href="http://logging.apache.org/log4net/index.html" target="_blank">log4net</a> e,
se si volesse per esempio usare un appender su file, ci sarebbe una violazione di
condivisione. Per cui RemotingAppender torna utile, consentendo di ribaltare il log
di tutti gli app domain sul programma principale. Per prima cosa bisogna mettere il
programma principale in grado di ricevere le chiamate di log via remoting. Supponiamo
che <em>MyLauncher</em> sia la classe che avvia un processo in un AppDomain separato,
potremmo scrivere:
</p>
        <pre class="csharpcode">
          <span class="kwrd">class</span> MyLauncher:<strong>MarshalByRefObject</strong>,<strong>log4net.Appender.RemotingAppender.IRemoteLoggingSink</strong> {</pre>
        <style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
        <p align="justify">
E’ necessario che la classe derivi da MarshalByRef object, in quanto ne esporremo
l’istanza via remoting. Deve altresì implementare <strong>IRemoteLoggingSink</strong> ,
per fungere da target per i messaggi di <a href="http://logging.apache.org/log4net/index.html" target="_blank">log4net</a>.
</p>
        <p align="justify">
A questo punto bisogna registrare il canale e l’istanza dell’oggetto atto a fare il
sink dei messaggi:
</p>
        <div class="csharpcode">
          <pre class="alt">
            <span class="lnum"> 1: </span>
            <span class="kwrd">private</span>
            <span class="kwrd">void</span> PrepareRemotingLoggerListener()</pre>
          <pre>
            <span class="lnum"> 2: </span>{</pre>
          <pre class="alt">
            <span class="lnum"> 3: </span> var
channel = <span class="kwrd">new</span> IpcChannel(<span class="str">"log4net"</span>+Guid.NewGuid().ToString());</pre>
          <pre>
            <span class="lnum"> 4: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 5: </span> ChannelServices.RegisterChannel(channel, <span class="kwrd">false</span>);</pre>
          <pre>
            <span class="lnum"> 6: </span> var
oref = RemotingServices.Marshal(<span class="kwrd">this</span>, <span class="kwrd">null</span>);</pre>
          <pre class="alt">
            <span class="lnum"> 7: </span> AppenderURI
= channel.GetUrlsForUri(oref.URI)[0];</pre>
          <pre>
            <span class="lnum"> 8: </span>}</pre>
        </div>
        <style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
        <p align="justify">
 
</p>
        <p align="justify">
Supponiamo di chiamare il codice di sopra per ogni hosting di app domain. Il canale
viene battezzato con una componente casuale, in modo da non entrare in conflitto con
altre istanze dello stesso programma, o all’interno del medesimo processo se vi fossero
più app domain esterni in esecuzione. Per <strong>registrare con remoting</strong> un <strong>istanza</strong> <strong>già
creata</strong> si è usato <strong><em>RemotingServices.Marshal(---). </em></strong>Il
codice memorizza in una proprietà <strong>AppenderURI</strong>: questo sarà l’indirizzo
da usarsi con remoting appender per definire la proprietà <strong>Sink</strong>.In
pratica è l’indirizzo remoting dell’oggetto “sink” dei messaggi.
</p>
        <p align="justify">
Implementare <strong>IRemoteLoggingSink</strong> è facilissimo:
</p>
        <div class="csharpcode">
          <pre class="alt">
            <span class="lnum"> 1: </span>
            <span class="preproc">#region</span> IRemoteLoggingSink
Members</pre>
          <pre>
            <span class="lnum"> 2: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 3: </span>
            <span class="kwrd">public</span>
            <span class="kwrd">void</span> LogEvents(log4net.Core.LoggingEvent[]
events)</pre>
          <pre>
            <span class="lnum"> 4: </span> {</pre>
          <pre class="alt">
            <span class="lnum"> 5: </span>
            <span class="kwrd">foreach</span> (var
le <span class="kwrd">in</span> events)</pre>
          <pre>
            <span class="lnum"> 6: </span> logger.Logger.Log(le); <span class="rem">//
logger è un'istanza di </span></pre>
          <pre>
            <span class="rem">//</span>
            <span class="rem">ILog
nel programma principale, ottenuta con logManager.GetLogger...</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 7: </span> }</pre>
          <pre>
            <span class="lnum"> 8: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 9: </span>
            <span class="preproc">#endregion</span>
          </pre>
        </div>
        <style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
        <p align="justify">
In questo modo si ottiene un redirect di tutti i messaggi sul logger dell’applicazione
principale, con filtri e appender come stabilito dalla configurazione dell’applicativo
principale. I messaggi saranno accodati, quindi non ci saranno violazioni di condivisione
anche con appender su file fisico.
</p>
        <p align="justify">
Nell’app domain basterà configurare log4net in modo da utilizzare RemotingAppender.
Il modo più facile è utilizzare BasicConfigurator:
</p>
        <div class="csharpcode">
          <pre class="alt">
            <span class="lnum"> 1: </span> BasicConfigurator.Configure(CreateAppender());</pre>
          <pre>
            <span class="lnum"> 2: </span> logger
= LogManager.GetLogger(<span class="str">"logger name"</span>);</pre>
          <pre> </pre>
        </div>
        <style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
        <p>
CreateAppender si occuperà di creare il RemotingAppender in questo modo:
</p>
        <div class="csharpcode">
          <pre class="alt">
            <span class="lnum"> 1: </span>
            <span class="kwrd">private</span> IAppender
CreateAppender()</pre>
          <pre>
            <span class="lnum"> 2: </span> {</pre>
          <pre class="alt">
            <span class="lnum"> 3: </span> RemotingAppender
ra = <span class="kwrd">new</span> RemotingAppender();</pre>
          <pre>
            <span class="lnum"> 4: </span> ra.Layout
= <span class="kwrd">new</span> log4net.Layout.SimpleLayout();</pre>
          <pre class="alt">
            <span class="lnum"> 5: </span> ra.Sink
= LoggerURI; <span class="rem">// Indirizzo del "sink"</span></pre>
          <pre>
            <span class="lnum"> 6: </span> ra.BufferSize
= 512;</pre>
          <pre class="alt">
            <span class="lnum"> 7: </span> ra.Lossy = <span class="kwrd">false</span>;</pre>
          <pre>
            <span class="lnum"> 8: </span> ra.ActivateOptions(); <span class="rem">//
Ricordarsi di chiamare !!!</span></pre>
          <pre class="alt">
            <span class="lnum"> 9: </span>
            <span class="kwrd">return</span> ra;</pre>
          <pre>
            <span class="lnum"> 10: </span> }</pre>
        </div>
        <style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
        <p>
Ed il gioco è fatto. <strong>LoggerUri</strong> è l’indirizzo dell’oggetto di sink
( vedi <strong>AppenderURI</strong> di prima ). <strong>BufferSize</strong> è il numero
di messaggi da accodare prima di fare effettivamente la chiamata al canale:<strong> per
ragioni di performance</strong> è meglio <strong>non abbassare troppo la soglia dei
messaggi da raggruppare</strong>.
</p>
        <img width="0" height="0" src="http://www.felicepollano.com/aggbug.ashx?id=697249ee-3f0f-4149-a531-91cecac8d608" />
      </body>
      <title>Usare log4net RemotingAppender</title>
      <guid isPermaLink="false">http://www.felicepollano.com/PermaLink,guid,697249ee-3f0f-4149-a531-91cecac8d608.aspx</guid>
      <link>http://www.felicepollano.com/2010/04/17/UsareLog4netRemotingAppender.aspx</link>
      <pubDate>Sat, 17 Apr 2010 08:02:23 GMT</pubDate>
      <description>&lt;p align="justify"&gt;
Uno scenario di possibile utilizzo di &lt;a href="http://logging.apache.org/log4net/release/sdk/log4net.Appender.RemotingAppender.html" target="_blank"&gt;RemotingAppender&lt;/a&gt; è
quando si voglia concentrare in un unico punto i log di più app domain hostati nello
stesso processo. Infatti un app domain separato vede difatto un’altra configurazione
di &lt;a href="http://logging.apache.org/log4net/index.html" target="_blank"&gt;log4net&lt;/a&gt; e,
se si volesse per esempio usare un appender su file, ci sarebbe una violazione di
condivisione. Per cui RemotingAppender torna utile, consentendo di ribaltare il log
di tutti gli app domain sul programma principale. Per prima cosa bisogna mettere il
programma principale in grado di ricevere le chiamate di log via remoting. Supponiamo
che &lt;em&gt;MyLauncher&lt;/em&gt; sia la classe che avvia un processo in un AppDomain separato,
potremmo scrivere:
&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;class&lt;/span&gt; MyLauncher:&lt;strong&gt;MarshalByRefObject&lt;/strong&gt;,&lt;strong&gt;log4net.Appender.RemotingAppender.IRemoteLoggingSink&lt;/strong&gt; {&lt;/pre&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
&lt;p align="justify"&gt;
E’ necessario che la classe derivi da MarshalByRef object, in quanto ne esporremo
l’istanza via remoting. Deve altresì implementare &lt;strong&gt;IRemoteLoggingSink&lt;/strong&gt; ,
per fungere da target per i messaggi di &lt;a href="http://logging.apache.org/log4net/index.html" target="_blank"&gt;log4net&lt;/a&gt;.
&lt;/p&gt;
&lt;p align="justify"&gt;
A questo punto bisogna registrare il canale e l’istanza dell’oggetto atto a fare il
sink dei messaggi:
&lt;/p&gt;
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 1: &lt;/span&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; PrepareRemotingLoggerListener()&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 2: &lt;/span&gt;{&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 3: &lt;/span&gt; var
channel = &lt;span class="kwrd"&gt;new&lt;/span&gt; IpcChannel(&lt;span class="str"&gt;"log4net"&lt;/span&gt;+Guid.NewGuid().ToString());&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 4: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 5: &lt;/span&gt; ChannelServices.RegisterChannel(channel, &lt;span class="kwrd"&gt;false&lt;/span&gt;);&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 6: &lt;/span&gt; var
oref = RemotingServices.Marshal(&lt;span class="kwrd"&gt;this&lt;/span&gt;, &lt;span class="kwrd"&gt;null&lt;/span&gt;);&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 7: &lt;/span&gt; AppenderURI
= channel.GetUrlsForUri(oref.URI)[0];&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 8: &lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
&lt;p align="justify"&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p align="justify"&gt;
Supponiamo di chiamare il codice di sopra per ogni hosting di app domain. Il canale
viene battezzato con una componente casuale, in modo da non entrare in conflitto con
altre istanze dello stesso programma, o all’interno del medesimo processo se vi fossero
più app domain esterni in esecuzione. Per &lt;strong&gt;registrare con remoting&lt;/strong&gt; un &lt;strong&gt;istanza&lt;/strong&gt;&amp;nbsp;&lt;strong&gt;già
creata&lt;/strong&gt; si è usato &lt;strong&gt;&lt;em&gt;RemotingServices.Marshal(---). &lt;/em&gt;&lt;/strong&gt;Il
codice memorizza in una proprietà &lt;strong&gt;AppenderURI&lt;/strong&gt;: questo sarà l’indirizzo
da usarsi con remoting appender per definire la proprietà &lt;strong&gt;Sink&lt;/strong&gt;.In
pratica è l’indirizzo remoting dell’oggetto “sink” dei messaggi.
&lt;/p&gt;
&lt;p align="justify"&gt;
Implementare &lt;strong&gt;IRemoteLoggingSink&lt;/strong&gt; è facilissimo:
&lt;/p&gt;
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 1: &lt;/span&gt; &lt;span class="preproc"&gt;#region&lt;/span&gt; IRemoteLoggingSink
Members&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 2: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 3: &lt;/span&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; LogEvents(log4net.Core.LoggingEvent[]
events)&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 4: &lt;/span&gt; {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 5: &lt;/span&gt; &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (var
le &lt;span class="kwrd"&gt;in&lt;/span&gt; events)&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 6: &lt;/span&gt; logger.Logger.Log(le); &lt;span class="rem"&gt;//
logger è un'istanza di &lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="rem"&gt;//&lt;/span&gt;&lt;span class="rem"&gt;ILog
nel programma principale, ottenuta con logManager.GetLogger...&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 7: &lt;/span&gt; }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 8: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 9: &lt;/span&gt; &lt;span class="preproc"&gt;#endregion&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
&lt;p align="justify"&gt;
In questo modo si ottiene un redirect di tutti i messaggi sul logger dell’applicazione
principale, con filtri e appender come stabilito dalla configurazione dell’applicativo
principale. I messaggi saranno accodati, quindi non ci saranno violazioni di condivisione
anche con appender su file fisico.
&lt;/p&gt;
&lt;p align="justify"&gt;
Nell’app domain basterà configurare log4net in modo da utilizzare RemotingAppender.
Il modo più facile è utilizzare BasicConfigurator:
&lt;/p&gt;
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 1: &lt;/span&gt; BasicConfigurator.Configure(CreateAppender());&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 2: &lt;/span&gt; logger
= LogManager.GetLogger(&lt;span class="str"&gt;"logger name"&lt;/span&gt;);&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
&lt;p&gt;
CreateAppender si occuperà di creare il RemotingAppender in questo modo:
&lt;/p&gt;
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 1: &lt;/span&gt; &lt;span class="kwrd"&gt;private&lt;/span&gt; IAppender
CreateAppender()&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 2: &lt;/span&gt; {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 3: &lt;/span&gt; RemotingAppender
ra = &lt;span class="kwrd"&gt;new&lt;/span&gt; RemotingAppender();&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 4: &lt;/span&gt; ra.Layout
= &lt;span class="kwrd"&gt;new&lt;/span&gt; log4net.Layout.SimpleLayout();&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 5: &lt;/span&gt; ra.Sink
= LoggerURI; &lt;span class="rem"&gt;// Indirizzo del "sink"&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 6: &lt;/span&gt; ra.BufferSize
= 512;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 7: &lt;/span&gt; ra.Lossy = &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 8: &lt;/span&gt; ra.ActivateOptions(); &lt;span class="rem"&gt;//
Ricordarsi di chiamare !!!&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 9: &lt;/span&gt; &lt;span class="kwrd"&gt;return&lt;/span&gt; ra;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 10: &lt;/span&gt; }&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
&lt;p&gt;
Ed il gioco è fatto. &lt;strong&gt;LoggerUri&lt;/strong&gt; è l’indirizzo dell’oggetto di sink
( vedi &lt;strong&gt;AppenderURI&lt;/strong&gt; di prima ). &lt;strong&gt;BufferSize&lt;/strong&gt; è il numero
di messaggi da accodare prima di fare effettivamente la chiamata al canale:&lt;strong&gt; per
ragioni di performance&lt;/strong&gt; è meglio &lt;strong&gt;non abbassare troppo la soglia dei
messaggi da raggruppare&lt;/strong&gt;.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.felicepollano.com/aggbug.ashx?id=697249ee-3f0f-4149-a531-91cecac8d608" /&gt;</description>
      <comments>http://www.felicepollano.com/CommentView,guid,697249ee-3f0f-4149-a531-91cecac8d608.aspx</comments>
      <category>log4net</category>
      <category>Programmin</category>
    </item>
  </channel>
</rss>