How to use Log4net TelnetAppender and Trace Listeners



Is there a way to use Log4net and Trace Listeners?







Hello,
I found this code somewhere

-segt


AssembyInfo.cs
-----------------------

// This tells Log4Net to look for a Log4Net.config file in the
execution directory,
// in this case, the webroot. This file contains Log4Net configuration
settings.
[assembly:log4net.Config.XmlConfigurator(ConfigFile="Log4Net.config",Watch=true)]




log4net.config
--------------------



<?xml version="1.0" encoding="utf-8" ?>
<log4net>

<appender name="tnet" type="log4net.Appender.TelnetAppender">
<port value="49232" />
<layout type="log4net.Layout.PatternLayout">
<!--
<conversionPattern value="%-5p [%t]: %m%n" />
-->
<conversionPattern value="%m%n" />
</layout>
</appender>

<root>
<level value="ALL" />
<appender-ref ref="tnet" />
</root>
</log4net>


-----In your program, include the namespace

using log4net;

namespace Riag.Applications.Common
{


public sealed class Tracer
{
private static readonly ILog Log =
LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);


public static void WriteError( string msg )
{
string prefix = LogLinePrefix() + " ERROR";
Trace.WriteLineIf(_appSwitch.TraceError, msg, prefix );
Log.Error( prefix+ ": " + msg);
}

etc

=====
Entire source


//---------------------------------------------------------------
// 2003-09-01 ERV Initial Version
// 2005-02-15 ERV Improve the creation of textwriter files.


using System;
using System.Diagnostics;
using System.Configuration;
using System.IO;
using System.Reflection;
using log4net;

namespace Riag.Applications.Common
{
/// <summary>
/// Provides tracing for applications using System.Diagnotics
classes.
/// <para>= (2003).</para>
/// </summary>
/// <remarks>
/// <para>
/// Tracer will perform custom trace output specified in
/// the applications Configuration Settings. Specifically
/// designed for console applications. Tracer makes trace log
/// ouputs uniform as much as possible. This class can not be
instantiated.
/// </para>
/// <para>
/// Here is a sample code:
/// </para>
/// <code>
/// // Sample Setup Logger for Console App. Option 1
///
/// string LogDirectory =
Utility.GetConfigurationAppSettings("LogDirectory");
/// string TraceOutputs =
Utility.GetConfigurationAppSettings("TraceOutputs");
/// Tracer.Initialize( TraceOutputs, LogDirectory );
///
/// // Sample Setup Logger for Console App. Option 1
/// Tracer.DefaultInitialize(null);
///
/// // Setup Logger for We application page
/// // 'this' is a reference to a Page object
/// Tracer.DefaultInitialize(this);
/// </code>
///
/// Here is a sample .config entry:
/// <code>
/// &lt;configuration&gt;
/// &lt;appSettings&gt;
/// &lt;add key="LogDirectory" value="logs/" /&gt;
/// &lt;add key="TraceOutputs" value="test1.txt" /&gt;
/// &lt;/appSettings&gt;
/// &lt;system.diagnostics&gt;
/// &lt;switches&gt;
/// &lt;add name="app" value="4" /&gt;
/// &lt;/switches&gt;
/// &lt;/system.diagnostics&gt;
/// &lt;/configuration&gt;
/// </code>
/// </remarks>
public sealed class Tracer
{
private static readonly ILog Log =
LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);

private Tracer() {}

/// <summary>
/// The private applications trace switch. This should be
initialized
/// during application start.
/// </summary>
private static TraceSwitch _appSwitch;

/// <summary>Empty constructor</summary>
/// <summary>The public trace swith property</summary>
public static TraceSwitch AppSwitch
{
get { return _appSwitch; }
}


enum Duration
{
Daily,
Weekly,
Monthly
}


/// <summary>Initialize with the default formatting of yyMMdd_,
and weekly interval</summary>
public static void Initialize(string traceListeners, string
logDir )
{
Initialize( traceListeners, logDir, "yyMMdd_",
Tracer.Duration.Weekly); // using fix params for now
}

/// <summary>Tracer initialization method</summary>
/// <remarks>
/// Set the built-in Trace object to a specified listener
/// which can be combination of the following: console,
/// eventlog, or a trace file. Trace file are named,
/// YYMMDD_filename.txt.
/// </remarks>
/// <param name="traceListeners">Comma separated list of
listeners</param>
/// <param name="logDir">Absolute path of log directory</param>
/// <param name="filePrefixDatePattern"></param>
/// <param name="duration"></param>
private static void Initialize(string traceListeners, string
logDir, string filePrefixDatePattern , Tracer.Duration duration )
{
// PUT SOMETHING LIKE THIS IN YOUR .CONFIG FILE
//
// <?xml version="1.0" encoding="utf-8" ?>
// <configuration>
// <appSettings>
// <add key="LogDirectory" value="logs/" />
// <add key="TraceOutputs" value="CardW.txt" />
// </appSettings>
// <system.diagnostics>
// <switches>
// <add name="app" value="4" />
// </switches>
// </system.diagnostics>
// </configuration>

_appSwitch = new TraceSwitch("app", "Entire Application");

Trace.IndentSize = 2;
Trace.AutoFlush = true;
string listenersString = traceListeners;
string directoryString = logDir; // this must be an absolute
path.



if ( directoryString.Trim().Length != 0 )
directoryString = Utility.AdjustDirPath(directoryString);
// make sure it ends with

string[] arrListeners = listenersString.Split(',');

if ( arrListeners != null )
{
// Add each to the Trace objects's listeners
foreach ( string listener in arrListeners )
{
if ( listener.Trim().ToLower() == "console" )
{
Trace.Listeners.Add(new
TextWriterTraceListener(Console.Out));

}
else if ( listener.Trim().ToLower() == "eventlog" )
{
Trace.Listeners.Add( new EventLogTraceListener());

}

else
{
// Ok. Interpret the listener string as a filename
suffix for a text log.
//
try
{
// Try to create the log directory
//
if ( ! Directory.Exists( directoryString) )
{
Directory.CreateDirectory( directoryString);
}

if ( Directory.Exists( directoryString) )
{

DateTime weekEnd = GetEndingDay(DateTime.Now,
duration);
string listenerPadded =
weekEnd.ToString(filePrefixDatePattern )
+ listener.Trim();

AddTextWriterListener( directoryString +
listenerPadded );
}
}
catch(Exception excp)
{
string errorMsg = "ERROR: Unable to Create Trace
to " + listener + "-" + excp.Message;

// last resort
Flush2File("c:\\Tracer.Err.txt" , errorMsg, true);
}
}

}

}
}

/// <summary>
/// Write append to a text file
/// </summary>
/// <param name="file"></param>
/// <param name="msg"></param>
/// <param name="append"></param>
public static void Flush2File(string file, string msg, bool
append)
{
try
{
using ( StreamWriter sw = new StreamWriter(file, append) )
{
sw.Write( msg);

sw.Close();
}

}
catch
{
throw;
}
}


/// <summary>
/// Returns the date of the next Sunday from a given date.
/// </summary>
/// <param name="dt">Starting date</param>
/// <param name="duration"></param>
/// <returns></returns>
private static DateTime GetEndingDay ( DateTime dt, Duration
duration)
{
switch( duration )
{
case Duration.Weekly:
while (dt.DayOfWeek != System.DayOfWeek.Sunday )
{
dt = dt.AddDays(1);
}
break;

}

return dt;
}

/// <summary/>
public static void DefaultInitialize(object logObject)
{
// Initialize log system
string logDirectory =
Utility.GetConfigurationAppSettings("LogDirectory");
string traceOutputs =
Utility.GetConfigurationAppSettings("TraceOutputs");

// Convert into absolute path if coming from a page object
(i.e. web app)
System.Web.UI.Page page = logObject as System.Web.UI.Page;
if ( page != null)
{
if ( ! Path.IsPathRooted( logDirectory) )
{
logDirectory = page.Server.MapPath(logDirectory);
}
}

Tracer.Initialize( traceOutputs, logDirectory);
}

#region public Write Functions
/// <summary>
/// Writes error message to Trace.
/// </summary>
/// <param name="msg"></param>
public static void WriteError( string msg )
{
string prefix = LogLinePrefix() + " ERROR";
Trace.WriteLineIf(_appSwitch.TraceError, msg, prefix );
Log.Error( prefix+ ": " + msg);
}
/// <summary>
///
/// </summary>
/// <param name="format"></param>
/// <param name="args"></param>
public static void WriteError( string format, params object[]
args)
{
WriteError(System.String.Format(format, args));
}
/// <summary>
/// Writes warning message to Trace.
/// </summary>
/// <param name="msg"></param>
public static void WriteWarning( string msg )
{
string prefix = LogLinePrefix() + " WARN";
Trace.WriteLineIf(_appSwitch.TraceWarning, msg, prefix );
Log.Warn( prefix+ ": " + msg);
}
/// <summary>
///
/// </summary>
/// <param name="format"></param>
/// <param name="args"></param>
public static void WriteWarning( string format, params object[]
args)
{
WriteWarning(System.String.Format(format, args));
}
/// <summary>
/// Write Informational message to Trace.
/// </summary>
/// <param name="msg"></param>
public static void WriteInfo( string msg )
{
string prefix = LogLinePrefix() + " INFO";
Trace.WriteLineIf(_appSwitch.TraceInfo, msg, prefix );
Log.Info( prefix+ ": " + msg);
}
/// <summary>
///
/// </summary>
/// <param name="format"></param>
/// <param name="args"></param>
public static void WriteInfo( string format, params object[]
args)
{
WriteInfo(System.String.Format(format, args));
}
/// <summary>
/// Write verbose message to Trace.
/// </summary>
/// <param name="msg"></param>
public static void WriteVerbose( string msg )
{
string prefix = LogLinePrefix() + " VERB";
Trace.WriteLineIf(_appSwitch.TraceVerbose, msg, prefix );
Log.Debug( prefix+ ": " + msg);
}
/// <summary>
///
/// </summary>
/// <param name="format"></param>
/// <param name="args"></param>
public static void WriteVerbose( string format, params object[]
args)
{
WriteVerbose(System.String.Format(format, args));
}
/// <summary>
/// Writes debug message to Debug object.
/// </summary>
/// <param name="msg"></param>
public static void WriteDebug( string msg )
{
string prefix = LogLinePrefix() + " DEBUG";
Debug.WriteLineIf(_appSwitch.TraceVerbose, msg, prefix );
Log.Debug( prefix+ ": " + msg);
}
/// <summary>
///
/// </summary>
/// <param name="format"></param>
/// <param name="args"></param>
public static void WriteDebug( string format, params object[]
args)
{
WriteDebug(System.String.Format(format, args));
}

private static string LogLinePrefix()
{
return DateTime.Now.ToString( "yy/MM/dd HH:mm:ss:fff") + "["
+ Environment.MachineName + "]" ;
}

#endregion


#region Helper Methods

// This method is a safe way to add a TextWriterListener to the
// Trace.Listeners collection. It ensures that only 1
// TextWriterTraceListener is active at a time. If it detects
that
// the object exists, it will not add. If filename changes, it
will
// close all TextWriterTraceListeners, and add the new one.
private static bool AddTextWriterListener( string
fullPathFilename)
{
bool returnValue = false;

// this will safely cast object to a type becaue it return
null if not compatible.
TextWriterTraceListener currTextWriter =
Trace.Listeners[fullPathFilename] as TextWriterTraceListener;

if ( currTextWriter == null)
{
// The listner is not yet in the list. It maybe a different
filename
// or new filename. We should then close and remove all
TextWriterTraceListeners
// from TraceListeners.
RemoveTextWriterListeners();

// Add the new listener
Trace.Listeners.Add( new
TextWriterTraceListener(fullPathFilename, fullPathFilename));

returnValue = true;
}

return returnValue;
}

// Iterate through the built-in Trace.Listeners collection
// and remove the TextWriterTraceListener objects. Be sure
// to close the object first.
private static void RemoveTextWriterListeners()
{
foreach( object l in Trace.Listeners)
{
TextWriterTraceListener aListener = l as
TextWriterTraceListener;
if ( aListener != null )
{
aListener.Close();
Trace.Listeners.Remove(aListener);
}
}
}

#endregion

}
}

#region Junks
//
//#region The Singleton Pattern in C#
//
//private static volatile Tracer instance;
//private static object syncRoot = new Object();
//
//
// /// <summary>
// ///
// /// </summary>
//public static Tracer Instance
//{
//get
//{
//if (instance == null)
//{
//lock (syncRoot)
//{
//if (instance == null)
//instance = new Tracer();
//}
//}
//
//return instance;
//}
//}
//#endregion
#endregion

.



Relevant Pages

  • Re: must find print packages which can deal with large charts
    ... list available printers, query a named printer, print text and image files ... String inputFileName = null; ... printToFile(outputFileName, outputFileType, ... public static void queryServices{ ...
    (comp.lang.java.gui)
  • nullpointer exception while try to retrieve the elements from the array object
    ... Menu mainMenu = new Menu; ... public static void getConsolidateMenu(Menu menu, Element current, ... mainMenu.setSubMenu(subMenu); ... String description; ...
    (comp.lang.java.programmer)
  • Re: alternative to my ClassLoader hack
    ... public static void main(String... ... Just for the record, this runs, but gets an exception. ... String name: /fubar/MyClassLoader.class ... throws ClassNotFoundException, InstantiationException, ...
    (comp.lang.java.programmer)
  • Re: [PATCH] tracing/markers: make markers select tracepoints
    ... trace points need translation. ... this hook may break. ... without even needing to reboot the kernel. ... Given that the string is self describing, ...
    (Linux-Kernel)
  • Re: Get regular expression
    ... "ABLATION LESION HEART BY PERIPHERALLY INSERTED CATHETER 37.34", ... private string _text; ... public Entry(string text, string citation): ... public static void AddToList(string line, string citation, ArrayList ...
    (microsoft.public.dotnet.languages.csharp)