Imports System Imports System.Threading Imports Plumtree.Remote.Logging ' ' Demonstrates Plumtree EDK 5.2 logging API. ' Public Class LoggingCommandLineExample Private Shared ReadOnly INSTANCES_COMPONENT_NAME As String = "Instances" Private Shared ReadOnly MAIN_LOOP_COMPONENT_NAME As String = "Main Loop" ' characters legal for logging application names: ASCII alphanumerics and space plus . - and _. Public Shared ReadOnly LOGGING_APPLICATION_NAME As String = "Logging_API_Example-1" ' set to true to multicast log messages to local network ' set to false to send message only listeners on local machine Public Shared ReadOnly LOG_TO_NETWORK As Boolean = True Private logger As ILogger ' instance logging class Private Shared mainLogger As ILogger ' main component logging class Private _thread As Thread ' thread for each instance of LoggingCommandLineExample ' Suggested initialization for non-web applications is in a static block ' in your application's main class or a logging utility class. Shared Sub New() ' Don't attempt to re-initialize in case logging was already ' initialized (for example, as part of an EDK-based web application). If Not LogFactory.IsInitialized Then LogFactory.Initialize(LOGGING_APPLICATION_NAME, LOG_TO_NETWORK) End If Console.Out.WriteLine("Set your logging receiver to the ""server"" or ""application name"" ") Console.Out.WriteLine(LogFactory.GetApplicationName) Console.Out.WriteLine("The logging component names are ""EDK"", """ & MAIN_LOOP_COMPONENT_NAME & """ and """ & INSTANCES_COMPONENT_NAME & " "".") mainLogger = LogFactory.GetLogger(MAIN_LOOP_COMPONENT_NAME, GetType(LoggingCommandLineExample)) End Sub ' ' Constructor for LoggingCommandLineExample. ' ' Public Sub New(ByVal instanceName As String) _thread = New Thread(New ThreadStart(AddressOf Run)) _thread.Name = instanceName Me.logger = LogFactory.GetLogger(INSTANCES_COMPONENT_NAME, GetType(LoggingCommandLineExample)) mainLogger.Info("Created new instance named {0}", instanceName) End Sub ' ' The main entry point for the logging example. ' _ Public Shared Sub Main(ByVal args As String()) Dim methodName As String = "main" mainLogger.FunctionBegin(methodName) ' get a timestamp to measure performance of this function Dim performanceStartTicks As Long = mainLogger.PerformanceBegin mainLogger.Action("Creating and starting instances") Dim example1 As New LoggingCommandLineExample("Bill") example1.Thread.Start() Dim example2 As New LoggingCommandLineExample("Larry") example2.Thread.Start() mainLogger.Action("Done creating instances") ' send log message with time since performanceBegin mainLogger.PerformanceEnd(methodName, performanceStartTicks) mainLogger.FunctionEnd(methodName) End Sub ' ' Each thread runs through a small test of logging messages and ' interleaves work to the other by calling Thread.Sleep(1). ' Private Sub Run() Dim methodName As String = "run" ' send log message that function is starting logger.FunctionBegin(methodName) ' get a timestamp to measure performance of this function Dim performanceStartTicks As Long = LoggingCommandLineExample.mainLogger.PerformanceBegin Thread.Sleep(1) ' interleaves work to the other thread ' demonstrates the available logging levels and shows use of token ' substitution in format strings to construct messages. Dim levelDescriptionFormat As String = "{0} level messages are {1} by default in the log receiver." ' debug() through fatal() are increasingly serious warning messages. ' By comparison, the message types action, function, and performance ' are generally "info" or "debug" level, with Action perhaps representing ' a message more important than "Info". Function and performance messages ' are off by default. logger.Debug(levelDescriptionFormat, "Debug", "off") logger.Info(levelDescriptionFormat, "Info", "off") logger.Warn(levelDescriptionFormat, "Warn", "on") logger.Error(levelDescriptionFormat, "Error", "on") logger.Fatal(levelDescriptionFormat, "Fatal", "on") Thread.Sleep(1) ' interleaves work to the other thread ' Exceptions may also be caught and logged, and may use token substitution. Try Throw New ThreadInterruptedException((_thread.Name & " was interrupted.")) Catch eCaught As Exception logger.Warn(eCaught, "Caught an exception from {0}. ", eCaught.GetType.Name) End Try Thread.Sleep(1) ' interleaves work to the other thread ' send log message with time since performanceBegin mainLogger.PerformanceEnd(methodName, performanceStartTicks) ' send log message that function is ending logger.FunctionEnd(methodName) End Sub ' ' Returns the thread for this instance. ' Public ReadOnly Property Thread() As Thread Get Return _thread End Get End Property End Class