/// <summary> /// Reads possible new log file entries form the file that is observed. /// </summary> private void ReadNewLogMessagesFromFile() { if (mFileReader == null || Equals(mFileReader.BaseStream.Length, mLastFileOffset)) { return; } if (mLastFileOffset > mFileReader.BaseStream.Length) { // the current log file was re-created. Observe from beginning on. mLastFileOffset = 0; } mFileReader.BaseStream.Seek( mLastFileOffset , SeekOrigin.Begin); string line; string dataToParse = string.Empty; FixedSizedQueue <LogMessage> messages = new FixedSizedQueue <LogMessage>( Properties.Settings.Default.MaxLogMessages); while ((line = mFileReader.ReadLine()) != null) { dataToParse += line; int log4NetEndTag = dataToParse.IndexOf( LOG4NET_LOGMSG_END , StringComparison.Ordinal); if (log4NetEndTag > 0) { LogMessage newLogMsg; try { newLogMsg = new LogMessageLog4Net( dataToParse , ++mLogNumber); } catch (Exception ex) { Logger.Warn(ex.Message); continue; } messages.Enqueue(newLogMsg); dataToParse = dataToParse.Substring( log4NetEndTag , dataToParse.Length - (log4NetEndTag + LOG4NET_LOGMSG_END.Length)); } } mLastFileOffset = mFileReader.BaseStream.Position; mLogHandler?.HandleMessage(messages.ToArray()); }
/// <summary> /// Reads possible new log file entries form the file that is observed. /// </summary> private void ReadNewLogMessagesFromFile() { if (mFileReader == null || Equals(mFileReader.BaseStream.Length, mLastFileOffset)) { return; } mFileReader.BaseStream.Seek( mLastFileOffset , SeekOrigin.Begin); string line; string dataToParse = string.Empty; List <LogMessage> messages = new List <LogMessage>(); while ((line = mFileReader.ReadLine()) != null) { dataToParse += line; int log4NetEndTag = dataToParse.IndexOf( NLOG_LOGMSG_END , StringComparison.Ordinal); if (log4NetEndTag > 0) { LogMessage newLogMsg; try { newLogMsg = new LogMessageLog4Net( dataToParse , ++mLogNumber); } catch (Exception ex) { Logger.Warn(ex.Message); continue; } messages.Add(newLogMsg); dataToParse = dataToParse.Substring( log4NetEndTag , dataToParse.Length - (log4NetEndTag + NLOG_LOGMSG_END.Length)); } } mLastFileOffset = mFileReader.BaseStream.Position; if (mLogHandler != null) { mLogHandler.HandleMessage(messages.ToArray()); } }
/// <summary> /// Listen for incomming <see cref="LogMessage"/>s. /// </summary> /// <param name="newSocket">the <see cref="Socket"/> object that may received new data.</param> private void Listening(object newSocket) { try { using (Socket socket = (Socket)newSocket) { using (NetworkStream ns = new NetworkStream(socket, FileAccess.Read, false)) { while (mSocket != null) { try { byte[] receivedBytes = new byte[1024]; StringBuilder receivedMessage = new StringBuilder(); do { int receivedByteCount = ns.Read( receivedBytes , 0 , receivedBytes.Length); receivedMessage.Append(Encoding.ASCII.GetString( receivedBytes , 0 , receivedByteCount)); }while(ns.DataAvailable); LogMessage newLogMsg = new LogMessageLog4Net( receivedMessage.ToString() , ++mLogNumber); if (mLogHandler != null) { mLogHandler.HandleMessage(newLogMsg); } } catch (Exception ex) { Logger.Warn(ex.Message); } } } } } catch (Exception ex) { Logger.Warn(ex.Message); } }
/// <summary> /// Handles the received UDP message event. /// </summary> /// <param name="ar">The <see cref="IAsyncResult"/> object that contains necessary meta data.</param> private void ReceiveUdpMessage(IAsyncResult ar) { UdpClient client = ((UdpState)ar.AsyncState).Client; IPEndPoint wantedIpEndPoint = ((UdpState)(ar.AsyncState)).EndPoint; IPEndPoint receivedIpEndPoint = new IPEndPoint(IPAddress.Any, 0); Byte[] receiveBytes; try { receiveBytes = client.EndReceive( ar , ref receivedIpEndPoint); } catch (ObjectDisposedException) { // The socket seems to be already closed. return; } bool isRightHost = (wantedIpEndPoint.Address.Equals(receivedIpEndPoint.Address)) || wantedIpEndPoint.Address.Equals(IPAddress.Any); if (isRightHost && receiveBytes != null) { try { LogMessage newLogMsg = new LogMessageLog4Net( mEncoding.GetString(receiveBytes) , ++mLogNumber); if (mLogHandler != null) { mLogHandler.HandleMessage(newLogMsg); } } catch (Exception ex) { Logger.Warn(ex.Message); } } client.BeginReceive(ReceiveUdpMessage, ar.AsyncState); }
/// <summary> /// Selects the given <paramref name="message"/>. /// </summary> /// <param name="message">The <see cref="LogMessage"/> o select</param> public bool SelectLogMessage(LogMessage message) { LogMessageLog4Net logMessage = message as LogMessageLog4Net; try { this.SuspendDrawing(); if (logMessage != null) { txtDataLogger.Text = logMessage.Logger; txtDataLevel.Text = logMessage.Level.ToString(); txtDataDateTime.Text = logMessage.Timestamp.Add(logMessage.TimeShiftOffset).ToString(Settings.Default.TimestampFormat); txtDataThread.Text = logMessage.Thread; if (logMessage.TimeShiftOffset.Milliseconds != 0) { txtDataDateTime.Text += string.Format( Resources.strLoggerDetailsCtrlOffset , logMessage.TimeShiftOffset.Milliseconds); } // Replace all known new line character combinations with the .net one. txtDataMessage.Text = Regex.Replace( logMessage.Message , @"\r(?!\n)|(?<!\r)\n" , Environment.NewLine); StringBuilder dataBuilder = new StringBuilder(); dataBuilder.AppendLine(!string.IsNullOrEmpty(logMessage.Location.MethodName) ? logMessage.Location.MethodName : string.Empty); dataBuilder.AppendLine(!string.IsNullOrEmpty(logMessage.Location.ClassName) ? logMessage.Location.ClassName : string.Empty); dataBuilder.AppendLine(!string.IsNullOrEmpty(logMessage.Location.FileName) ? logMessage.Location.FileName : string.Empty); txtDataLocation.Text = dataBuilder.ToString().Trim(); if (logMessage.CustomProperties == null || logMessage.CustomProperties.Count == 0) { txtDataProperties.Text = string.Empty; } else { dataBuilder = new StringBuilder(); foreach (KeyValuePair <string, string> customData in logMessage.CustomProperties) { dataBuilder.AppendFormat("{0}: {1}{2}", customData.Key, customData.Value, Environment.NewLine); } txtDataProperties.Text = dataBuilder.ToString(); } } else { txtDataLogger.Text = string.Empty; txtDataLevel.Text = message != null?message.Level.ToString() : string.Empty; txtDataDateTime.Text = message != null?message.Timestamp.ToString(Settings.Default.TimestampFormat) : string.Empty; txtDataThread.Text = string.Empty; txtDataMessage.Text = message != null?message.Message.Trim() : string.Empty; txtDataProperties.Text = string.Empty; } pbxCopyLogger.Visible = !string.IsNullOrEmpty(txtDataLogger.Text); pbxCopyLevel.Visible = !string.IsNullOrEmpty(txtDataLevel.Text); pbxCopyThread.Visible = !string.IsNullOrEmpty(txtDataThread.Text); pbxCopyDateTime.Visible = !string.IsNullOrEmpty(txtDataDateTime.Text); pbxCopyMessage.Visible = !string.IsNullOrEmpty(txtDataMessage.Text); pbxCopyLocation.Visible = !string.IsNullOrEmpty(txtDataLocation.Text); pbxCopyProperties.Visible = !string.IsNullOrEmpty(txtDataProperties.Text); } finally { txtDataMessage.AdjustHeightToContent(); txtDataProperties.AdjustHeightToContent(); this.ResumeDrawing(); } return(true); }